IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Problèmes sur composant TComboBox


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 32
    Par défaut Problèmes sur composant TComboBox
    Bonjour à tous,

    J'ai un petit souci d'utilisation du composant TComboBox

    Hypothèses (sens mathématique)
    - Un combo avec les éléments suivants entrés par la composition du composant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Ligne1
    Ligne2
    Ligne3
    Ligne4
    Ligne6
    - Le combo a pour style csDropDown (pourvu d'une liste d'édition pouvant être changée à la mano)
    - Un Label
    - Un bouton
    - Quand je change le combo pour la première fois un item est ajouté et l'itemindex prend la l'indexation de ce composant

    Problèmes :
    - Quand je me mets dans la zone d'édition du combo, et que j'appuie sur 'A', ça m'imprime 'Changé première fois 4 >1<', jusque là, tout va bien... sauf que quand j'appuie sur le bouton, l'itemindex est à -1 (affichage de -1)
    - Quand je me mets dans la zone d'édition du combo et que j'appuie sur 'Suppr', ça m'imprime 'Changé deuxième fois -1>2<', le texte de la combo passe à vide, et l'appui sur le bouton est en adéquation avec l'itemindex puisqu'il affiche -1.

    Questions :
    - Pourquoi la touche suppr engendre 2 OnChange alors qu'un appui simple n'induit qu'un seul évènement ?
    - Pourquoi l'itemindex au sortir de la fonction OnChange est-il perdu ?

    Zarbi non ?

    Merci pour vos réponses.

    Thierry.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    Unit main;
     
    Interface
     
    Uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    Type
      TfrmMain = Class(TForm)
        ComboBox1: TComboBox;
        Label1: TLabel;
        Button1: TButton;
        Procedure ComboBox1Change(Sender: TObject);
        Procedure Button1Click(Sender: TObject);
        Procedure FormCreate(Sender: TObject);
        Procedure ComboBox1KeyUp(Sender: TObject; Var Key: Word; Shift: TShiftState);
      Private
        { Déclarations privées }
        fRebonds: Integer;
      Public
        { Déclarations publiques }
      End;
     
    Var
      frmMain: TfrmMain;
     
    Implementation
     
    {$R *.dfm}
     
    Procedure TfrmMain.ComboBox1Change(Sender: TObject);
     
    Begin
      Self.fRebonds:=Self.fRebonds+1;
      If ComboBox1.Items.Count=5 Then
      Begin
        ComboBox1.Items.Add('Ligne5');
        ComboBox1.Sorted:=True;
        ComboBox1.ItemIndex:=4;
        Label1.Caption:='Changé première fois '+IntToStr(ComboBox1.ItemIndex)+'>'+IntToStr(Self.fRebonds)+'<';
      End
      Else
        Label1.Caption:='Changé deuxième fois '+IntToStr(ComboBox1.ItemIndex)+'>'+IntToStr(Self.fRebonds)+'<';
    End;
     
    Procedure TfrmMain.Button1Click(Sender: TObject);
     
    Begin
      Label1.Caption:=IntToStr(ComboBox1.ItemIndex);
      ComboBox1.Items.Add('toto')
    End;
     
    Procedure TfrmMain.FormCreate(Sender: TObject);
     
    Begin
      Self.fRebonds:=0;
    End;
     
    Procedure TfrmMain.ComboBox1KeyUp(Sender: TObject; Var Key: Word; Shift: TShiftState);
     
    Begin
      Self.fRebonds:=0;
    End;
     
    End.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    En même temps modifier le contenu de la Combo->Items et l'ItemIndex dans son OnChange, c'est assez particulier ! c'est même un peu n'importe quoi !

    En plus, tu mentionnes 'A' mais ce n'est pas un item du Combo, après le OnChange, il doit vérifier que 'A' n'est pas un Item, il remet donc ItemIndex à -1 !

    Pense que le TComboBox gère une auto-complétion (propriété AutoComplete)
    en csDropDown, il me semble qu'elle fonctionne très bien
    en csDropDownList, son effet se limite à la 1ère lettre ? non ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 32
    Par défaut
    En même temps modifier le contenu de la Combo->Items et l'ItemIndex dans son OnChange, c'est assez particulier ! c'est même un peu n'importe quoi !
    Tout jugement de valeur mis à part, cela a un but : empêcher l'utilisateur de saisir une valeur qui n'est pas prévue dans le combo, tout en pouvant bénéficier de la complétion du composant dans son style DropDown...

    En plus, tu mentionnes 'A' mais ce n'est pas un item du Combo, après le OnChange, il doit vérifier que 'A' n'est pas un Item, il remet donc ItemIndex à -1 !
    Je résume :
    - Le A est saisi
    - Il ne correspond pas à ce que le combo attend de l'utilisateur
    - Il met une valeur par défaut (uniquement pour l'exemple, en fait, une autre fenêtre peut s'afficher demandant à saisir une nouvelle valeur avec des tests associés et mise à jour de base de données par exemple...)
    - On fixe le nouvel ItemIndex de la combo correspondant à cette valeur
    - ...et en sortant du OnChange, on se rend compte que la fixation est perdue alors qu'elle était encore active à l'intérieur du OnChange

    Pense que le TComboBox gère une auto-complétion (propriété AutoComplete)
    en csDropDown, il me semble qu'elle fonctionne très bien
    Oui, elle fonctionne du feu de Dieu et c'est pour cela que je voudrais pouvoir m'en servir aussi dans le cas où on ne laisse pas le choix à l'utilisateur pour saisir une nouvelle valeur...

    en csDropDownList, son effet se limite à la 1ère lettre ? non ?
    Exactement, d'où l'utilisation pré-citée...

    Je me répète mais le but est bien de pouvoir bénéficier de la complétion du composant tout en n'autorisant pas l'utilisateur à saisir une nouvelle valeur et en le bornant dès qu'il veut le faire... Ainsi, dès qu'il rentre une valeur dans la combo dont on sait qu'elle n'est pas valide car non incluse dans le combo, on le borne et on fait faire une action qui va fixer une valeur que l'on souhaite dans le combo, valeur qui sera valide d'un point de vue fonctionnel.

    Merci ShaiLeTroll pour ton aide précieuse.

    Th.

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    En général quand on fait des modifications dans le Onchange d'un composant on le désactive avant le traitement puis on le réactive après

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Procedure TfrmMain.ComboBox1Change(Sender: TObject);
     
    Begin
    ComboBox1.OnChange := nil;
    Try
     
      Self.fRebonds:=Self.fRebonds+1;
      If ComboBox1.Items.Count=5 Then
      Begin
        ComboBox1.Items.Add('Ligne5');
        ComboBox1.Sorted:=True;
        ComboBox1.ItemIndex:=4;
        Label1.Caption:='Changé première fois '+IntToStr(ComboBox1.ItemIndex)+'>'+IntToStr(Self.fRebonds)+'<';
      End
      Else
        Label1.Caption:='Changé deuxième fois '+IntToStr(ComboBox1.ItemIndex)+'>'+IntToStr(Self.fRebonds)+'<';
    End;
    finally
      ComboBox1.OnChange := ComboBox1Change;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut
    Bonjour,

    tu peux utiliser la ligne de code suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        PostMessage(ComboBox1.Handle, CB_SETCURSEL, ComboBox1.Items.IndexOf('Ligne5'), 1);
    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ComboBox1.ItemIndex := 4;
    De ce fait tu postes le message qui permet à Windows de le traiter une fois sorti de ton gestionnaire OnChange.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 32
    Par défaut
    Larochev le tueur !

    Ben merci !

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    Ziginou, en réalité, ton code c'est quoi ?
    Parce que ton exemple montrait l'ajout à la volée de nouveaux items et non "empêcher l'utilisateur de saisir une valeur qui n'est pas prévue dans le combo"

    Pourquoi ne pas forcer ItemIndex sur un OnExit ?

    le AutoComplete + csDropDownList en BCB 2007 , fonctionne sur tous les lettres d'un mot dans la liste, mais il faut taper assez vite (allonger de trop le délai peut poser d'autres problèmes), le gros défaut c'est que l'on ne voit pas où l'on est dans la saisie !

    Il y a une ComboBox chez TMS qui n'utilise pas le COMBOBOX de Windows qui gère cela de façon plus ergonomique !

    Ziginou, tu utilises quelle version de Delphi ? 6 ou 7 ? il me semble que c'était différent à l'époque !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 32
    Par défaut
    Ziginou, en réalité, ton code c'est quoi ?
    Parce que ton exemple montrait l'ajout à la volée de nouveaux items et non "empêcher l'utilisateur de saisir une valeur qui n'est pas prévue dans le combo"
    Mon code fait plusieurs centaines de lignes, mais le truc c'est qu'au moment où un utilisateur entre quelque chose qui n'est pas dans la combo, l'appli lui ouvre une fenêtre d'ajout de nouveaux items, ces items sont contrôlés et stockés dans une base par un composant MyDac (que tu connais bien ), et récupérés de la base vers le composant de la combo...

    Pourquoi ne pas forcer ItemIndex sur un OnExit ?
    On peut effectivement forcer le itemIndex sur un Exit, c'est une bonne idée pas encore testée, car le fait que le itemIndex soit correctement mis à jour dans le OnChange et effacé en dehors m'a fait perdre du temps pour ne pas avoir essayé cette solution, mais j'essaierai : merci de l'astuce...

    Ziginou, tu utilises quelle version de Delphi ? 6 ou 7 ? il me semble que c'était différent à l'époque !
    Delphi7 sir !

    Sinon, Shai, une petite question en passant : tu trouves réellement que ça soit bien sérieux d'avoir laissé Mike partir pour prétexte de faire un album dans l'année alors qu'il est bon mais sans plus ? Si c'était pour faire ça, très franchement, on aurait pu laisser Mike faire ce qu'il avait à faire et retourner en studio un an plus tard... T'en penses quoi ?

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    MyDAC, très bien, l'ajout de valeur de thésaurus à la volée, je l'ai déjà fait aussi, en général, c'était un second bouton "..." pour accéder à la création de nouveaux items, la combo étant rechargé complètement après !

    J'utilise souvent le mode csDropDownList pour limiter la recherche, si je veux conserver une AutoComplete agréable, j'utilise le OnExit, il est vrai qu'il manque un OnAutoComplete avec état pour valider le déplacement !

    Mais pire on s'habitue vite à TMS pour ces Combos multi-colonne !

    Regarde le TDBLookupComboBox il utilise un ListSource comme Items, cela pourrait intéresser si tu utilises une DB derrière !
    Je ne connais pas son comportement en AutoComplete !


    [HS]
    Shai-Hulud ma référence est plus littéraire que musicale !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. 2 problèmes sur le composant StatusBar
    Par BuzzLeclaire dans le forum Composants VCL
    Réponses: 7
    Dernier message: 05/02/2009, 10h04
  2. Problème sur le composant (ToolButton) dans une TToolBar
    Par 21247692 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/04/2008, 13h03
  3. [C#]Problème sur composant perso (Bouton Transparent)
    Par SLE dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/10/2005, 00h12
  4. problème sur le composant aspSmartUpload
    Par PrinceMaster77 dans le forum ASP
    Réponses: 8
    Dernier message: 23/09/2004, 10h17
  5. [VB.NET] Problème sur composant comboBox hérité
    Par SergeF dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/06/2004, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo