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 :

Problème de SetFocus sur bouton dans TabSheet inopérant au PageControl.OnChange [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 Problème de SetFocus sur bouton dans TabSheet inopérant au PageControl.OnChange
    Bonsoir,

    tout est dans le titre : un PageControl, 4 TabSheets, sur le troisième un bouton et d'autres trucs, et l'événement OnChange du PageControl comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TMainform.pgChange(Sender: TObject);
    begin
      Application.ProcessMessages; // rajouté mais ne change rien
      case pg.ActivePageIndex of
        0: ;
        1: ;
        2: btnBrowse.SetFocus; // pas de focus... :-(
        3: ;
      end;
      Application.ProcessMessages; // rajouté mais ne change rien
    end;
    Debian 7/32, Laz 1.0.10
    Une idée ?
    Merci,
    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 averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    bonjour,

    essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TMainform.pgChange(Sender: TObject);
    begin
     case pg.ActivePageIndex of
        0: ;
        1: ;
        2: begin
            pg.ActivePage.SetFocus;     
            btnBrowse.SetFocus; //  focus ou non ? 
            end;
        3: ;
      end;
    end;
    Amicalement, nullosse

  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
    Bonjour nullosse (et les autres),

    bien tenté, mais désolé, pas mieux...
    Perso, j'ai aussi tenté dans le OnShow du TabSheet, sans plus de résultat

    Une autre idée ?
    Bonne journée,
    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
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Que votre TButton appartienne ou pas au TPageControl, je proposerais plutôt une action au niveau de la souris.
    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 TForm1.pgMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
       case pg.ActivePageIndex of
          0:  ActiveControl:= pg;
          1:  ActiveControl:= pg;
          2:  ActiveControl:= btnBrowse;
          3:  ActiveControl:= pg;
        end;
     end;
     
    procedure TForm1.btnBrowseClick(Sender: TObject);
    begin
      showmessage('');
    end;
    Vous remarquerez que
    • le code initial (dans pgChange) donne bien le focus au TButton (c'est imperceptible)... puis rend le focus au PageControl...
    • votre TButton a bien le focus : Pour s'en convaincre, après avoir cliqué sur le 3ème onglet qui sélectionne le TButton, il suffit d'appuyer sur la touche [Entrée] du clavier pour voir apparaître le ShowMessage de btnBrowseClick()


    Cordialement. Gilles

    Code testé sous Ubuntu 12.04.3-64 bits - Lazarus 1.2RC2 du 10/01/2014 - FPC 2.6.2 Rév SVN 43686
    Dernière modification par Invité ; 20/01/2014 à 11h49.

  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
    Citation Envoyé par selzig Voir le message
    Bonjour,

    Si comme je le suppose, votre TButton n'appartient pas au TPageControl, je proposerais plutôt une action au niveau de la souris. (...)
    Mon TButton appartient à un TPanel posé (en alTop) sur le TTabSheet concerné.

    Et malgré ce code, le focus ne passe toujours pas au bouton

    Citation Envoyé par selzig Voir le message
    (...) Vous remarquerez que le code initial (dans pgChange) donne bien le focus au TButton (c'est imperceptible)... puis rend le focus au PageControl...

    Cordialement. Gilles

    Code testé sous Ubuntu 12.04.3-64 bits - Lazarus 1.2RC2 du 10/01/2014 - FPC 2.6.2 Rév SVN 43686
    Je ne vois rien, ou alors faut le voir en pas-à-pas ? Mais ça ne changera pas mon problème, qui doit être puis rend le focus au PageControl...
    Truc de ouf'
    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
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    On le voit mieux (mais c'est toujours presque imperceptible) s'il est placé en dehors du PageControl.

    Le TPanel n'a pas d'influence. Je n'ai pas de Debian ici pour tester, et définitivement pas de 32 . Je place le projet sur mon serveur ftp pour test. Mais ici, cela fonctionne -> La sélection du troisième onglet (le 2), donne bien le focus au TButton.

    C'est très curieux votre histoire. Il n'y a pas d'autre code qui puisse modifier le comportement du PageControl ou de la Form ?

    Je viens de vérifier sous Gnome Shell (le projet était sous Unity) : le comportement est identique. RAS.

    Cordialement. Gilles
    Dernière modification par Invité ; 20/01/2014 à 12h20.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 856
    Points : 11 290
    Points
    11 290
    Billets dans le blog
    6
    Par défaut
    Comment le changement d'onglet intervient-il ?
    Manuellement, par l'utilisateur, ou par code ?
    Voir ceci si option 2 (événements pas déclenchés, en Delphi);
    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 !

  8. #8
    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
    Yop !

    Gilles, je suis également parti d'un nouveau projet complètement vierge avec juste un TPageControl, 4 TTabSheets et 1 TButton sur le 3e. Go figure...

    Yves, merci de t'intéresser à mes petites misères mais, non, c'est l'utilisateur (ma pomme ) qui clique sur le 3e onglet.

    Bref, Gilles m'a mis sur la piste avec cette histoire de focus qui retourne au TabSheet, et donc je m'en suis sorti en m'inspirant de ce lien, comme ça :
    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
      private
        { private declarations }
        procedure EnterTS2(Sender: TObject; var Result: Boolean);
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    var
      enter_ts2: Boolean;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      enter_ts2 := False;
      Application.OnIdle := @EnterTS2;
    end;
     
    procedure TForm1.pgChange(Sender: TObject);
    begin
      case pg.ActivePageIndex of
        0:  ;
        1:  ;
        2:  enter_ts2 := True;
        3:  ;
       end;
    end;
     
    procedure TForm1.EnterTS2(Sender: TObject; var Result: Boolean);
    begin
      if enter_ts2 then
      begin
        enter_ts2 := False;
        button1.SetFocus;
      end;
      Result := True;
    end;
    Ça fonctionne tip-top , j'espère juste ne pas avoir d'effets de bord incongrus (1re fois que j'utilise "OnIdle"...)

    Merci à tous, je coche mais on peut continuer à discuter.
    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

  9. #9
    Membre averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    bonjour,
    tu peux aussi essayer d'utiliser un setfocus asynchrone (cela marche chez moi sous Ubuntu ) comme ceci :

    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
     procedure AsyncSetFocus(aPointer: PtrInt);     
    ...
    procedure TForm1.pgChange(Sender: TObject);
    var lPointer:PtrInt=0;
    begin    
    case pg.ActivePageIndex of
        0: ;
        1: ;
        2:  lPointer := PtrInt(btnBrowse);
        3: ;
      end;
       if lPointer<>0 then
         Application.QueueAsyncCall( @AsyncSetFocus, lPointer);      
    end;
     
    procedure TForm1.AsyncSetFocus(aPointer: PtrInt);
    begin
      if (aPointer<>0) and TWinControl(aPointer).CanFocus then
         TWinControl(aPointer).SetFocus
    end;
    Amicalement, nullosse

  10. #10
    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
    Bonjour à tous,
    Citation Envoyé par Nullosse Voir le message
    tu peux aussi essayer d'utiliser un setfocus asynchrone (cela marche chez moi sous Ubuntu ) (...)
    Je ne connaissais pas donc je n'en aurais jamais eu l'idée, mais en tout cas ça fonctionne aussi !
    Bien joué
    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

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/11/2012, 08h17
  2. Réponses: 15
    Dernier message: 13/03/2007, 17h25
  3. [VBA-E] SetFocus sur TextBox dans UserForm_Initialize ne fonctionne pas ?
    Par Jipété dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 27/11/2006, 11h39
  4. [FLASH 8 Pro] OnRelease sur bouton dans un SWF chargé!!
    Par Julien.alkaza dans le forum Flash
    Réponses: 14
    Dernier message: 13/04/2006, 07h55
  5. [CSS]problème centrage texte de bouton dans une boîte
    Par Aurelius dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 06/09/2005, 16h01

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