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 :

Comment « Attendre » l’événement ONSELECT d’un élément dans une Combo


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 42
    Points
    42
    Par défaut Comment « Attendre » l’événement ONSELECT d’un élément dans une Combo
    Bonjour
    En développement, un projet de gestion de la biblio de mon fils.
    J’ai un fichier (txt) dans une combo (CbTitLiv) qui permet la saisie et qui contient les titres des livres, leur type (ex Bd, Roman , Encyclopédie,..), leur auteur,…
    Je voudrais proposer une aide, après la saisie du titre, d’une aide à la saisie du Type de livre, de l’auteur afin d’éviter d’encoder plusieurs fois les mêmes types, les mêmes auteurs.

    A cette fin,
    - j’ai alimenté (exemple pour le type) une combo (CbTypLiv) contenant Bd, Roman, Encyclopédie, …et ceci est OK
    - j’ai créé une fonction (et une procédure d’appel) afin de procéder à la sélection et au renvoi d’un élément de la Combo CbTypLiv, procédure que j’ai appelé RnvTypLiv pour « renvoie le type de livre séllectionné » (ok fonctionne)
    - cette procédure,je l’ai associée à l’événement ONSelect de la Combo CbTypLiv (OK)
    - Dans ma procédure de saisie, après la saisie du titre, j’ouvre la Combo CbTypLiv, lui donne le focus, mais …… mais l’attente de l’événement de sélection ne se produit pas,… le programme tel que je l’ai écrit ne s’arrete pas, passe outre ….. et continue son processus, la combo restant quant à elle bien ouverte… et le retour du type ne se fait pas….au moment voulu….
    En fait je n’arrive pas à programmer le « attendre » on select de l’élément combo et récupérer l’item….
    Comment faire
    While no
    Repeat unitl TypLiv.Text <>’’;
    Y a t’il un prob de focus ?


    Merci pour votre aide
    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
    procedure TFrmLiv.BtnEntTitLivClick(Sender: TObject);
    //var Test:string;
    var TmpLiv,TmpInpBox:string;
    begin {1}
    //SAISIE TITRE
      Tmpliv:='';TmpInpBox:='';
      PnlTitLivLigEta.Caption:='Saisie Type de Livre en cours'; 
    If CbTitliv.Text<>''then
    begin {2}
        CbTitLiv.SetFocus;
        PnlTitLivLigEta.Caption:='Saisie Titre validée!';
        TmpLiv:=PLMAJ(Minuscule(CbTitLiv.Text)); CbTitLiv.Text:='';
    end;{2}
    //SAISIE TYPE
    Selection :=false; TypLiv:='';
    If CbSelTypLiv.Text<>'' then
    begin {3} 
      LblInvSaiLiv.Caption:='Type ? ->';
      CbShwTypLiv(Self);CbSelTypLiv.setfocus; 
    --->  ICI IL NE S ARRETE PAS 
      end;{3}
    //AJOUT
      cbtitliv.Items.Add(TmpLiv);TmpLiv:='';CbTitLiv.Text:='';CbTitLiv.SetFocus;
      PnlTitLivLigEta.Caption:='Un Livre été enregistré dans la bibliotheque';
    end;{1}
    -

    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
    //---------------------------------------------------------------------------------------------------
    procedure TFrmLiv.CbShwTypLiv(Sender: TObject);
    Begin CbSelTypLiv.Visible:=true;{BtnSelTypLiv.Visible:=true;}ALiCbSelTypLiv(Self);end;
    //---------------------------------------------------------------------------------------------------
    procedure TFrmLiv.RnvTypLiv(Sender: TObject);
    var str,pos:string;
    begin
    str:=FctRnvStrCbo(CBSelTypLiv);showmessage('Après retourdans RnvTypLiv: '+ str);
    pos:=IntToStr(FctRnvNumStrCbo(CBSelTypLiv));showmessage('Après retourdans RnvTypLiv: '+ pos);
    PnlTitLivLigEta.Caption := '"'+str+' a été sélectionné, à la position numero : '+pos;
    PnlTitLivLigEta.Caption :=FctRnvStrEtNumCbo(CbSelTypLiv);
    TypLiv:=str;
    selection:=true;
    end;
    //---

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut
    C'est parce que tu prends en travers la programmation événementielle

    Le OnSelect survient quand qq chose a été sélectionné; et c'est 1 événement qui est envoyé par l'objet combobox (pour faire court), et pas reçu par lui.
    Classiquement, dans le OnSelect, on trouvera par exemple du code de contrôle de cohérence, ou du code pour afficher un libellé selon l'item choisi, rendre "enabled" un bouton si itemIndex<>-1 , etc.

    Je pense qu'il va falloir repenser l'architecture de ton prog.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 42
    Points
    42
    Par défaut Ah bon !?
    Citation Envoyé par qi130 Voir le message
    C'est parce que tu prends en travers la programmation événementielle

    Le OnSelect survient quand qq chose a été sélectionné; et c'est 1 événement qui est envoyé par l'objet combobox (pour faire court), et pas reçu par lui.
    Classiquement, dans le OnSelect, on trouvera par exemple du code de contrôle de cohérence, ou du code pour afficher un libellé selon l'item choisi, rendre "enabled" un bouton si itemIndex<>-1 , etc.

    Je pense qu'il va falloir repenser l'architecture de ton prog.

    Si je selectionne l'élément de la combo Type de livre, c'est pour le récupérer (ne pas devoir le saisir) et stocker dans mon fichier livre ...aprés le titre et avant l'auteur..je sélectionne l'item.. je pourrais aussi travailler ave ONCLICK?
    Si tu persistes sur le fait de devoir revoir l'achi du programme, quelle est alorsl a méthode pour proposer une combo,sélectionnier l'item,le récupérer et le stocker dans un fichier (saisie assistée parcombo)

    Merci

  4. #4
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut
    Citation Envoyé par crassetph Voir le message
    Si je selectionne l'élément de la combo Type de livre, c'est pour le récupérer (ne pas devoir le saisir) et stocker dans mon fichier livre ...aprés le titre et avant l'auteur..je sélectionne l'item.. je pourrais aussi travailler ave ONCLICK?
    Ou OnChange, ou OnExit
    Citation Envoyé par crassetph Voir le message
    Si tu persistes sur le fait de devoir revoir l'achi du programme, quelle est alorsl a méthode pour proposer une combo,sélectionnier l'item,le récupérer et le stocker dans un fichier (saisie assistée parcombo)
    Je ne persiste en rien, je te signale juste que selon mon expérience, tu n'utilises pas "au mieux" les capacités du produit.

    D'après ce que je perçois de ton besoin, tu as 2 TEdit (titre + auteur) et le combo (type).
    Pour procéder à l'enregistrement : 1 bouton "Ok" (type bkNone) qui n'est actif que si les Tedit sont renseignés et l'itemindex du combo est <>-1.
    Le tout placé sur 1 fiche appelée lors de l'option "nouveau livre" du menu principale (par exemple)
    Dans le OnClick du bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if EditAuteur.text='' then begin
        MessageDlg('erreur'...);
        EditAuteur.SetFocus;
        Exit;
    end;
    if EditTitre='' then... //erreur
    if CbSelTypLiv.ItemIndex=-1 then //errreur
    // Ecriture de l'enreg
    MonEnreg:=EditAuteur.Text+EditTitre+CbSelTypLiv.Items[CbSelTypLiv.Itemindex];

  5. #5
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 42
    Points
    42
    Par défaut Ok ...
    Citation Envoyé par qi130 Voir le message
    Ou OnChange, ou OnExit

    Je ne persiste en rien, je te signale juste que selon mon expérience, tu n'utilises pas "au mieux" les capacités du produit.

    D'après ce que je perçois de ton besoin, tu as 2 TEdit (titre + auteur) et le combo (type).
    Pour procéder à l'enregistrement : 1 bouton "Ok" (type bkNone) qui n'est actif que si les Tedit sont renseignés et l'itemindex du combo est <>-1.
    Le tout placé sur 1 fiche appelée lors de l'option "nouveau livre" du menu principale (par exemple)
    Dans le OnClick du bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if EditAuteur.text='' then begin
        MessageDlg('erreur'...);
        EditAuteur.SetFocus;
        Exit;
    end;
    if EditTitre='' then... //erreur
    if CbSelTypLiv.ItemIndex=-1 then //errreur
    // Ecriture de l'enreg
    MonEnreg:=EditAuteur.Text+EditTitre+CbSelTypLiv.Items[CbSelTypLiv.Itemindex];

    En fait l'astuce est de passer par un bouton "Ok" qui ne sera actif qu'après voir sélectionné un item ? c'est bien cela ?
    Le test "itemindex du combo est <>-1" est donc la condition "d'attente" dont je parlais à l'origine ?

    Et ensuite seulement cliquer sur le bouton. Ok Je vais essayer d'appliquer...

    Mon but aurais été d'agir simple sélection souris (click simple sur l'item de la combo) SANS DEVOIR REFAIRE UN CLICK SUR LE BOUTON OK (POSSIBLE ? OU NON) ?

    Qu'entends - tu par un bouton bknone ?

    Encore merci ...

  6. #6
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut
    Voilà, tu es sur la bonne voie... il faut penser événement

    Par exemple, pour gérer le bouton enabled: tu déclares le OnChange de EditAuteur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonBouton.enabled:=(EditAuteur.Text<>'') AND 
                        (EditTitre.text<>'') AND (CbSelTypLiv.ItemIndex<>-1);
    et tu fais aussi pointer sur cette proc les Onchange du combo et de EditTitre


    En fait de bknone, c'est mrNone (propriété modalresult).

    Qd le modalresult d'un bouton est <> mrNone, il ferme sa fenêtre appelée par Showmodal

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/11/2012, 13h51
  2. [MySQL] comment trouver le nombre d'éléments dans une sgbd
    Par Bathou dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/06/2008, 18h29
  3. Comment récuperer un élément dans une listview lors d'une sélection
    Par hellspawn_ludo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/04/2007, 03h37
  4. Réponses: 4
    Dernier message: 02/05/2006, 00h02

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