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 :

Checkbox.OnExit ne fonctionne pas comme prévu


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut Checkbox.OnExit ne fonctionne pas comme prévu
    Bonjour,

    sur une fiche vierge je pose d'abord un TCheckBox, puis un TButton et pour faire bonne mesure un autre TButton.

    Ensuite, j'écris un code hautement sophistiqué et laborieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.CheckBox1Exit(Sender: TObject);
    begin
      Button2.SetFocus;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Close;
    end;
    et j'appuie sur F9 : la fiche s'affiche, avec le focus sur le CheckBox, je peux jouer avec <Espace> pour cocher/décocher, pas de souci, la cata arrive quand j'appuie sur <TAB> : le focus passe au Button1,

    J'ai bien tenté de mettre le TabStop du TCheckBox à False mais, outre le fait qu'au run l'animal n'a plus le focus, le OnExit envoie quand même dans Button1.

    Constaté dans Laz 1.4 - Debian 32 bits et Laz 2.0.10 - Debian 64 bits.

    Une idée ?

    Une astuce consisterait à mettre le TabStop de Button1 à False et là ça fonctionne mais, si c'est envisageable pour une fiche à 3 composants, ça l'est moins s'il y en a beaucoup et s'il faut presque tous leur faire subir ce traitement.

  2. #2
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut normalement tu n'as pas besoin de onExit pour donner le focus à un autre composant, à moins de vouloir checker la valeur du composant en cours et de rediriger le focus vers un autre composant suivant le résultat. L'évènement onExit se déclenche juste avant à la perte du focus de l'élément, si je me souviens bien.

    J'ai testé sous Windows, ça fonctionne. Donc problème de comportement avec Linux.

    Essayes avec activeControl = button2 ou avec FocusControl(button2); qui proviennent de TForm . Si ca ne fonctionne toujours pas essayes avec l'évènement onEditingDone qui passera au composant choisi dès que tu cocheras/décocheras ta checkbox. Ce n'est peut-être pas ce que tu souhaites.

    Au pire, vérifies juste bien l'ordre de "tabOrder" de tes composants Button1 = 1, Checkbox = 2, Button2 = 3. C'est le menu "voir ==> Ordre de tabulation" ce qui t'évites de jouer avec le onExit

    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    normalement tu n'as pas besoin de onExit pour donner le focus à un autre composant, à moins de vouloir checker la valeur du composant en cours et de rediriger le focus vers un autre composant suivant le résultat. L'évènement onExit se déclenche juste avant à la perte du focus de l'élément, si je me souviens bien.
    Ce que je veux faire, c'est avoir au run le focus sur le CheckBox ("Arrêter la machine à la fin de la sauvegarde") comme ça un coup d'espace peut valider ce choix (décoché par défaut), et ensuite <TAB> pour sortir et là, j'aimerais tomber sur le bouton "Exécuter" pour appuyer sur <ENTRÉE> et lancer la sauvegarde.

    Citation Envoyé par BeanzMaster Voir le message
    J'ai testé sous Windows, ça fonctionne. Donc problème de comportement avec Linux.
    Ouais, ben ça, c'est pas nouveau,

    Citation Envoyé par BeanzMaster Voir le message
    Essayes avec activeControl = button2 ou avec FocusControl(button2); qui proviennent de TForm . Si ça ne fonctionne toujours pas essayes avec l'évènement onEditingDone qui passera au composant choisi dès que tu cocheras/décocheras ta checkbox. Ce n'est peut-être pas ce que tu souhaites.
    Les deux premières propositions = même pâté, c'est Button1 qui prend le focus.
    OnEditingDone fonctionne mais c'est violent : pas moyen de faire espace-espace-espace... pour voir la coche changer d'état, dès après le 1er coup d'espace, hop !, focus au button2.

    Citation Envoyé par BeanzMaster Voir le message
    Au pire, vérifies juste bien l'ordre de "tabOrder" de tes composants Button1 = 1, Checkbox = 2, Button2 = 3. C'est le menu "voir ==> Ordre de tabulation" ce qui t'évite de jouer avec le onExit
    Ça, c'est valable quand il n'y a que 3 compos sur une maquette. Mais là, les compos sont regroupés dans des panels et autres TGroupBox dont certains apparaissent en fonction du contexte (dd externe branché ou pas), et l'ordre de tabulation va être ingérable.

    L'idée c'était de ne pas être obligé de chercher la souris pour cliquer sur "Exécuter", mais comm' d'hab' ça va être compliqué sous Linux, donc comm' d'hab' je vais laisser tomber.

    Merci d'avoir tenté quelque chose.

  4. #4
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Si non dans onKey(up, press) tu peux intercepter le tab et donner le focus a ton bouton
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Si non dans onKey(up, press) tu peux intercepter le tab et donner le focus a ton bouton
    Oui, mais c'est comme avec
    Citation Envoyé par Jipété Voir le message
    OnEditingDone -- ça fonctionne mais c'est violent : pas moyen de faire espace-espace-espace... pour voir la coche changer d'état, dès après le 1er coup d'espace, hop !, focus au button2.
    Bah, c'est comme ça. Ne perds pas ton temps avec ça.
    Merci encore,

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    C'est vrai que ça rend un peu fou...

    Si tu ajoutes un ShowMessage dans le OnExit de la case à cocher avant le SetFocus, il se produit comme attendu, mais si le ShowMessage est remplacé par un appel à une procédure non visuelle, non !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Pas mieux,

  8. #8
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Hello petite question est-ce que ta checkbox et ton bouton sont dans des panel différents ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  9. #9
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    J'ai trouvé 2 trucs chez les anglois. Essayes :

    Google translate
    J'ai eu un problème similaire sous Linux et maintenant j'utilise toujours SetFocusedControl(). De plus, TabSheet doit être visible, j'ai donc défini la mise au point dans un gestionnaire pour l'événement TPageControl.OnChange.

    Cela fonctionne généralement - pas toujours, Gtk étant assez capricieux, mais la plupart du temps, cela fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.CheckBox1Exit(Sender: TObject);
    begin
      SetFocusedControl(Button1);
    end;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.CheckBox1Exit(Sender: TObject);
    begin
      Button1.setFocus;
      Application.processmessages;
    end;
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Yep !
    Citation Envoyé par BeanzMaster Voir le message
    Hello petite question est-ce que ta checkbox et ton bouton sont dans des panel différents ?
    Oh que non !
    Tout est bêtement sur la form -- rappel : là c'est un test sur une maquette minimaliste : la form et dessus la checkbox et 2 buttons car je veux que le taf se fasse sur le button2 sinon on ne verra jamais le bug.

    Et justement, en parlant de bug,
    Citation Envoyé par BeanzMaster Voir le message
    J'ai trouvé 2 trucs chez les anglois. Essayes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.CheckBox1Exit(Sender: TObject);
    begin
      SetFocusedControl(Button2);
    end;
    Pas mieux. Et même pire : une fois le focus sur Button1 (oui ! Vous avez bien lu, tiens d'ailleurs je mets mon code par copier/coller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.CheckBox1Exit(Sender: TObject);
    begin
      SetFocusedControl(Button2);
    end;
    une fois le focus sur Button1 disais-je, l'appui sur <TAB> n'est plus actif, comme si le prog était planté.

    Mais là où on rigole, c'est que si je cache la fiche par la fenêtre de Firefox (qui me permet de répondre ici), quand je découvre la fiche le focus est sur le Button2 !

    Il doit y avoir une histoire de refresh/repaint qui m'échappe, là.

    Confirmé : F9, la fiche s'affiche, TAB et le focus passe à Button1, Alt-Tab pour donner le focus à un autre prog puis encore Alt-Tab pour le redonner à ma fiche à souci et là c'est bon, le Button2 a le focus.
    C'est dramatique ce bazar et je n'ai aucune idée de comment le gérer...

    Testé dans la machine neuve et Laz 2.0.10, c'est + ou - pareil. J'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.CheckBox1Exit(Sender: TObject);
    begin
      Button2.SetFocus; // tout seul --> focus sur Button1 et y reste malgré la manip Alt-Tab 2 fois
      // ajout de App.ProcMess 
      Application.ProcessMessages; // ne change rien au comportement précédent.
      // Par contre, utiliser juste ça (et donc les 2 lignes précédentes commentées) :
      SetFocusedControl(Button2); // foire as usual (focus sur Button1) mais là, la manip Alt-Tab 2 fois ramène le focus sur Button2
      // la question est donc : comment générer Alt-Tab 2 fois *ici* et sans flicker si possible !
      // à vous les studios, ;-)
    end;



    Citation Envoyé par BeanzMaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.CheckBox1Exit(Sender: TObject);
    begin
      Button2.setFocus;
      Application.processmessages;
    end;
    J'avais commencé par ça, bien sûr. Je ne l'ai pas écrit dans le 1er post ? Petit oubli mineur car c'est tellement évident.

  11. #11
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut t'as essayé en faisant un "form1.repaint/refresh" juste apres SetFocusedControl(Button2); ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  12. #12
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 051
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    J'ai testé avec Lazarus 2.0.12-3 / FPC 3.2.2-1 sur Manjaro Linux 64 bits et j'ai bien le comportement voulu : le focus passe du TCheckBox au Button2.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  13. #13
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Yep !

    Citation Envoyé par BeanzMaster Voir le message
    Salut t'as essayé en faisant un "form1.repaint/refresh" juste apres SetFocusedControl(Button2); ?
    Ben oui mais c'est pas mieux
    J'ai même essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.CheckBox1Exit(Sender: TObject);
    begin
      SetFocusedControl(Button2);
      Application.ProcessMessages;
      Form1.Update; //Refresh; //Repaint;
      Application.ProcessMessages;
    end;
    Pour rien ça foire toujours,

    Doit y avoir un bug dans le widgetset, et "ils" ont dû le corriger, la preuve :
    Citation Envoyé par Alcatîz Voir le message
    J'ai testé avec Lazarus 2.0.12-3 / FPC 3.2.2-1 sur Manjaro Linux 64 bits et j'ai bien le comportement voulu : le focus passe du TCheckBox au Button2.
    Plus qu'à attendre que je mette la nouvelle machine en prod' pour tester. Probablement l'affaire d'une à deux semaines.

    Merci à tous, restez attentifs, je ne manquerai pas de faire un retour.

Discussions similaires

  1. Boucle, ne fonctionne pas comme prévu
    Par ArzelPRO dans le forum Langage
    Réponses: 7
    Dernier message: 03/02/2019, 22h18
  2. Mon serveur proxy ne fonctionne pas comme prévu
    Par win_ubuntu dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 28/04/2015, 19h34
  3. Réponses: 2
    Dernier message: 15/04/2015, 10h30
  4. Filtrage au niveau de la requête qui ne fonctionne pas comme prévu
    Par hartecel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/06/2008, 14h06
  5. [Bonne pratique] merge qui ne fonctionne pas comme prévu
    Par forex dans le forum Subversion
    Réponses: 1
    Dernier message: 19/05/2008, 04h28

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