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

Lazarus Pascal Discussion :

[2.0.12] Faire fonctionner un ComboBox par code [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut [2.0.12] Faire fonctionner un ComboBox par code
    Bonjour,

    Une bête fiche avec (cbb c'est le ComboBox)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      cbb.Items.Add('essai');
    end;
    Un bête bouton avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      cbb.Text:=cbb.Items[0];
    end;
    et un ComboBox à qui je change le style de csDropDown à csDropDownList puis à csSimple et dans les trois cas, je n'ai rien qui s'affiche en cliquant sur le bouton :
    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
    procedure TForm1.cbbChange(Sender: TObject);
    begin
      showmessage('change');
    end;
     
    procedure TForm1.cbbClick(Sender: TObject);
    begin
      showmessage('click');
    end;
     
    procedure TForm1.cbbCloseUp(Sender: TObject);
    begin
      showmessage('closeup');
    end;
     
    procedure TForm1.cbbSelect(Sender: TObject);
    begin
      showmessage('select');
    end;
    J'en ai essayé un autre, OnEditingDone, mais c'est pire.
    J'ai fouillé le web et n'ai rien trouvé, sauf un post disant qu'avec OnSelect c'était bon mais il est sur MacOS et la discussion a 3 ans
    Quelqu'un saurait comment me sortir de ce pétrin ?
    Merci et bon app',

    FPC 3.2 Laz 2.0.12 dans Linux Debian Bullseye 11.2
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Membre éclairé
    Avatar de Chrispi
    Homme Profil pro
    Chargé de missions
    Inscrit en
    Juin 2020
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2020
    Messages : 204
    Points : 885
    Points
    885
    Par défaut
    Bonjour Jipété,

    Je ne sais pas si j'ai bien compris ta problématique mais voilà ce que je te propose.

    Comme toi, j'ai fait sur la fiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ComboBox1.Items.Add('essai');
    end;
    Sur le bouton j'ai fait comme toi et en plus j'agis sur l'évènement OnChange de la ComboBox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ComboBox1.Text:=ComboBox1.Items[0];
      ComboBox1.OnChange(Sender);
    end;
    J'ai mis le même code que toi sur l'évènement OnChange de la ComboBox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.ComboBox1Change(Sender: TObject);
    begin
      showmessage('change');
    end;
    Après compilation, quand je clique sur le bouton, essai s'inscrit bien dans la liste de la ComboBox et le message de l'évènement OnChange s'affiche aussi.

    Je suis sous Windows 10 et Lazarus v2.2.0.

    Espérant avoir pu t'aider.

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Citation Envoyé par Chrispi Voir le message
    Je ne sais pas si j'ai bien compris ta problématique
    tout à fait !

    Citation Envoyé par Chrispi Voir le message
    Sur le bouton j'ai fait comme toi et en plus j'agis sur l'évènement OnChange de la ComboBox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ComboBox1.Text:=ComboBox1.Items[0];
      ComboBox1.OnChange(Sender);
    end;
    Bien vu, je n'ai pas eu cette idée, cette illumination, pour moi l'événement OnChange devait être appelé automatiquement puisqu'il y avait un changement, mais je n'ai pas la même logique que les codeurs de Lazarus, sans doute.

    Citation Envoyé par Chrispi Voir le message
    Espérant avoir pu t'aider.
    tout à fait !

    Grand merci à toi.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 324
    Points : 4 134
    Points
    4 134
    Par défaut Update, refresh, repaint, invalidate
    Bonjour,

    Au lieu d'écrire cbb.Text:=cbb.Items[0]; qui ne génère pas d'événement (a priori Text sert à afficher quelque chose qui n'est pas dans la liste comme '- choisir -') il est préférable d'utiliser cbb.ItemIndex := 0; qui déclenchera les événements qui vont bien.

    Si on veut forcer une actualisation immédiate il y a refresh et repaint. Si on veut dire au système qu'une actualisation est nécessaire il y a update et invalidate. Dans la plupart des cas, ces deux derniers placent un message qui déclenchera un repaint lors du prochain process.Messages (automatique ou manuel) mais il y a des composants pour lesquels ces quatre méthodes sont interchangeables (elles appellent immédiatement un repaint).

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Yep !
    Citation Envoyé par Guesset Voir le message
    Au lieu d'écrire cbb.Text:=cbb.Items[0]; qui ne génère pas d'événement (a priori Text sert à afficher quelque chose qui n'est pas dans la liste comme '- choisir -')
    Ah oui, mais peut aussi afficher ce qui est choisi dans la liste.

    En fait, ce qui m'a foutu dedans, c'est que je me suis engrainé avec le petit texte d'aide qu'on trouve en bas de la fenêtre des propriétés de l'Inspecteur d'objets et qui dit :
    Citation Envoyé par propriétés
    Event handler for user changed text in the edit box.
    Le souci c'est que c'est tellement mal fichu que la suite de l'aide n'est pas instantanément visible, et qu'elle raconte ça, découvert ce soir :
    Citation Envoyé par propriétés
    This event covers only changes made by the user, not by code. Note that this differs from how other OnChange events work, for example TEdit.OnChange is triggered by code text changes. This event is also triggered when the selection is changed by using the combo box list.
    Vraiment pas pratique pour se souvenir de qui fait quoi...

    Citation Envoyé par Guesset Voir le message
    il est préférable d'utiliser cbb.ItemIndex := 0; qui déclenchera les événements qui vont bien.
    De quels événements parle-t-on, là ? Parce que j'ai testé, ça a mis à jour la zone d'edit du cbb, mais aucun ShowMessage n'est apparu...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 324
    Points : 4 134
    Points
    4 134
    Par défaut Pas vu pas pris
    Bonjour,

    Les modifications visibles sont bien actualisées (refresh ou repaint) lors d'un changement de ItemIndex, mais :
    • Pas de clic donc pas de OnClick.
    • Pas d'ouverture de la CB donc pas de fermeture et donc pas de OnCloseUp.
    • Pas de sélection (le champ Text n'est pas sur fond bleu) donc pas de OnSelect. Mais même si on fait un SelectAll, aucun événement OnSelect n'est généré.
    • Plus compliqué, l'événement OnChange arrive quand Text est modifié en interactif et non par programmation (selon l'aide du champs Text).

    La modification de Text, en directe ou par sélection d'un Item, n'est pas pérenne. Le code suivant fait apparaître le texte de TextHint :
    Code PASCAL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       cbx.ItemIndex := cbx.ItemIndex - 1;
       cbx.Invalidate;

    Une explication pourrait être que les modifications par programme sont nécessairement connues de celui-ci. Mais d'autre composants se comportent différemment.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

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

Discussions similaires

  1. faire fonctionner une macro par Vbs
    Par sabseb33 dans le forum VBScript
    Réponses: 1
    Dernier message: 22/01/2022, 23h41
  2. [XL-2010] tentative de faire fonctionner une combobox
    Par paf26 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/11/2015, 21h06
  3. faire défiler ComboBox par la touche entrer du clavier
    Par abbd dans le forum Windows Forms
    Réponses: 6
    Dernier message: 26/05/2008, 10h12
  4. un evennement onclick sur combobox par code
    Par Mihalis dans le forum Delphi
    Réponses: 6
    Dernier message: 10/06/2007, 15h57
  5. Comment faire générer du rtf par mon application?
    Par nickylarson dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/08/2003, 09h35

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