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

Delphi Discussion :

évenements d'une ComboBox


Sujet :

Delphi

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut évenements d'une ComboBox
    j'ai une ComboBox (cbEtudiants) qui contient une liste d'Etudiants.

    Quand j'effectue le choix d'un étudiant E1 sur cette combo, je vais chercher quelques informations dans une base de données en rapport avec E1.
    Je mets donc mes traitements dans l'évenement OnChange de la combo.

    J'ai aussi la possibilité dans cette combo de taper un nouveau nom d'étudiant.

    Problème:
    SI je tape 'A'--> mon prog va faire le traitement pour l'étudiant 'A' (va dans la base, cherche l'étudiant 'A', puis me renvoie un résultat nul car 'A' n'existe pas)
    SI je tape encore une fois 'A' (j'aurai 'AA' sur la combo), le meme traitement se refait pour l'étudiant 'AA'..
    et ainsi de suite...

    cela est-il évitable?
    j'ai essayé de jongler avec les évenements de la combo (on exit, on select..) mais je ne trouve pas une solution.

    Merci..

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    404
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 404
    Par défaut
    branche toi sur l'évenement OnKeyPress et si la touche pressée n'est pas Entrée alors tu annules l'évenement OnChange, autrement tu le rebranches et tu y vas

    ce qui nous donne un code du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.cbEtudiantsKeyPress(Sender: TObject; var Key: Char);
    begin
     if key<>#13 then
      cbEtudiants.OnChange := nil
      else begin
            cbEtudiants.OnChange := cbEtudiantsChange;
            cbEtudiantsChange(cbEtudiants);
           end;
    end;

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    j'y ai effetivement pensé, par contre je n'ai pas besoin de valider ma sélection ou ma saisie dans la combo. donc pas d'utilisation de la touche entrée, ni d'un bouton de commande...

  4. #4
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.cbEtudiantsChange(Sender: TObject);
    begin
      if cbEtudiants.Items.IndexOf(cbEtudiants.Text)>-1 then
      begin
        ShowMessage('action');
      end;
    end;
    avec la propriété AutoComplete à false.

  5. #5
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Mais il faut que la combobox soit triée, non ?

    Est-ce le cas?

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    je ne comprends pas..
    on dirait qu'on ne parle pas de la même chose..

    je veux juste savoir si c'est possible de n'effectuer un traitement que lorsque j'ai fini ma saisie dans la combo, et non pas entre temps..

    Le seul problème c'est que je n'ai pas de moyen pour valider ma saisie..

  7. #7
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Tu peux écrire ton traitement sur le OnExit

    Et de plus, dans l'évenement OnKeyPress (ou Down), vérifier si tu obtiens une "validation" par la touche Entrée, auquel cas tu appelles manuellement ton evenement OnExit.

    comme ca les 2 cas sont gérés, sur le Exit, et sur l'appuie de "Enter" dans le combo symbolisant la fin de saisie.

    bon code
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  8. #8
    Membre Expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Par défaut
    Citation Envoyé par freestyler
    je ne comprends pas..
    on dirait qu'on ne parle pas de la même chose..

    je veux juste savoir si c'est possible de n'effectuer un traitement que lorsque j'ai fini ma saisie dans la combo, et non pas entre temps..

    Le seul problème c'est que je n'ai pas de moyen pour valider ma saisie..

    Réponse : non
    Ton histoire, c'est celle du serpent qui se mord la queue :
    tu n'as pas de moyen pour valider ta saisie
    --> donc l'ordinateur n'a aucun moyen de savoir, à priori, quand tu as fini ta saisie
    --> donc soit l'ordinateur teste à chaque fois pour vérifier si ce que tu as tapé correspond à quelque chose qui lui dit quelque chose, soit il ne fait jamais rien

    Bref, il faut bien que tu code un évènement déclencheur quelque part (un bouton, une vérification après chaque lettres tapées, un déclenchement grace à un timer après un certain temps d'inactivité, et que sais-je).

    En tout cas, la question est plus claire...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 48
    Par défaut
    je ne sais pas juste une proposition tu ne pourrais pas lancer une recherche avec ce que tu est en train de taper + *
    et tu dimunu de plus en plus ta recherche
    je sais pas si sa peut t'aider mais j'essaye toukours

  10. #10
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    bon j'ai trouvé une parade..
    avant de balancer le code, j'ai un petit détail assez chiant à traiter..

    je suis sur ma combo..
    je dois bien vérifier (sur le OnExit) si le texte de la combo n'est pas vide pour passer aux autres traitements..(message d'erreur qui apparait)

    sauf que je veux qu'en appuyant sur le bouton Annuler, rien ne se passe..

    c'est presque équivalent au truc de :
    sauf que j'intercepte un click pas une touche du clavier

  11. #11
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Bonjour,
    Je passai par-là et je prends la conversion en route un peu tard sans doute mais est-il trop tard pour bien faire ?

    Un clavier a un temps de réponse d'environ 250 millisecondes donc si aucune touche n'a été pressée pendant 251 millisecondes tu peux faire ta recherche sauf si la touche annuler est pressée.

    Ce que te propose donc c'est de mettre un timer avec une intervalle de 270 (la petite marge de sécurité pour les gens qui réfléchissent avant de taper).
    Sur le onkeypress de ton combobox tu arrête et démarre le timer.
    Sur le onaction du timer tu déclenches ta recherche.
    Le bouton annuler lui se contente d'arrêter le timer.

    Simple et efficace (enfin je crois).

    a+

  12. #12
    Membre éclairé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Par défaut
    Salut freestyler

    Je reviens sur ton 1er pb

    Citation Envoyé par freestyler
    Problème:
    SI je tape 'A'--> mon prog va faire le traitement pour l'étudiant 'A' (va dans la base, cherche l'étudiant 'A', puis me renvoie un résultat nul car 'A' n'existe pas)
    SI je tape encore une fois 'A' (j'aurai 'AA' sur la combo), le meme traitement se refait pour l'étudiant 'AA'..
    et ainsi de suite...

    cela est-il évitable?
    Si j'ai bien compris, tu veux lancer un traitement uniquement lorsque le nom de l'étudiant tapé figure déjà dans la liste ?

    Pourquoi ne pas comparer le texte tapé avec les items de la combo ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.ComboBox1Change(Sender: TObject);
    var
      c:byte;
    begin
      for c:=0 to combobox1.Items.Count-1 do
        if combobox1.text=combobox1.Items[c]
        then showmessage('Etudiant trouvé');
    end;
    En mettant la propriété autocomplete à false, le showmessage de mon exemple ne s'exécute que si le texte de la zone de saisie correspond exactement (casse comprise) à un item de la liste

    Bon ça paraît trop simple...

    En relisant la discussion, je m'aperçois que waskol avait eu la même idée (et avec indexof, pas besoin de boucler...

Discussions similaires

  1. Multi-selection dans une ComboBox ?
    Par Moloko dans le forum MFC
    Réponses: 5
    Dernier message: 07/07/2021, 17h26
  2. [TStringGrid] intégrer une ComboBox
    Par AnneOlga dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/10/2004, 15h46
  3. [VB6] largeur d'une zone de liste d'une combobox
    Par Nick13 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 28/08/2004, 12h30
  4. Réponses: 2
    Dernier message: 26/07/2004, 13h34
  5. Pré-sélectionner un élément d'une combobox
    Par delphim dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/06/2003, 15h26

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