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 :

Événement PageControl TabSheetEnter non pris en compte [Lazarus]


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 727
    Points : 15 125
    Points
    15 125
    Par défaut Événement PageControl TabSheetEnter non pris en compte
    Vous allez dire que j'abuse, mais comment une chose pareille est-elle possible ?

    Soit une fiche avec dessus un TPageControl et 2 TabSheets ("clic-droit / nouvelle page" 2 fois), un bouton et une case à cocher sur TabSheet1, un timer, et c'est tout.

    Trois événements à gérer :
    - le PageControl1Change, mandatory sinon les TabSheetEnter ne sont pas pris en compte, et encore, ça dépend du contexte, voir + bas ; incroyable mais vrai !
    - l'entrée dans le TabSheet1, qui va activer
    - l'arrivée dans le Timer (interval à 2 sec, histoire de bien voir les changements) qui nous affiche l'heure.

    Ce que je constate, c'est que l'événement TabSheet1Enter est pifométriquement pris en compte, en fonction de critères qui m'échappent, regardez les commentaires dans PageControl1Change :
    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
    45
    46
    47
    48
    49
    50
      TForm1 = class(TForm)
        Button1: TButton;
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        Timer1: TTimer;
        procedure PageControl1Change(Sender: TObject);
        procedure TabSheet1Enter(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        { private declarations }
        bTabSheet1Enter: boolean;
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.PageControl1Change(Sender: TObject);
    begin
      case PageControl1.ActivePageIndex of
        0: Button1.SetFocus; // passe dans TabSheet1Enter
        //0: Checkbox1.Checked:=True; // ne passe pas dans TabSheet1Enter
        //0: Caption := TimeToStr(Now); // ne passe pas dans TabSheet1Enter
        1: Caption := TimeToStr(Now);
      end;
    end;
     
    procedure TForm1.TabSheet1Enter(Sender: TObject);
    begin
      Caption := 'onglet '+ TimeToStr(Now);
      bTabSheet1Enter := True;
      Timer1.Enabled := True;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Timer1.Enabled := False;
      if bTabSheet1Enter then begin
        Caption := 'timer '+ TimeToStr(Now);
        bTabSheet1Enter := False;
      end;
    end;
    Si le fait de mettre le focus à un bouton fait passer par le "Enter" du TabSheet concerné, j'ai pensé que basculer une case à cocher le ferait aussi, mais non... Quant à la mise à l'heure, je me doutais bien que ça n'irait pas.

    Si quelqu'un pouvait m'expliquer, ça serait trop cool, parce que là, ça dépasse grandment mon entendement ! Grand merci par avance,
    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
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Vous allez dire que j'abuse, mais comment une chose pareille est-elle possible ?
    Bonsoir Jipété !

    Je te vois en grande détresse, mais je risque de ne pas te sortir de ce pétrin : en effet, chez moi, avec Windows 10, tout fonctionne normalement .

    Pour vérifier que la case à cocher fonctionnait bien, j'ai juste légèrement modifié ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Checkbox1.Checked := not CheckBox1.Checked;
    Eh bien, la coche change à chaque changement de panneau...

    Si j'ai le temps, j'essaierai demain avec Linux. Sinon, ce sera lundi !
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 727
    Points : 15 125
    Points
    15 125
    Par défaut
    Bonsoir, Gilles,

    et merci de ton test et de ton retour.

    Citation Envoyé par gvasseur58 Voir le message
    Je te vois en grande détresse, mais je risque de ne pas te sortir de ce pétrin : en effet, chez moi, avec Windows 10, tout fonctionne normalement .

    Pour vérifier que la case à cocher fonctionnait bien, j'ai juste légèrement modifié ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Checkbox1.Checked := not CheckBox1.Checked;
    Eh bien, la coche change à chaque changement de panneau...
    Mais tout ça amène une autre question : es-tu sûr d'avoir bien compris ma demande ? L'idée n'était pas de trafiquer avec la case à cocher, l'idée est de passer par l'événement TabSheet1Enter et force est de constater que si chez moi aussi la case à cocher change d'état à chaque arrivée sur le premier onglet (et pas à chaque changement de panneau comme tu l'écris), en tout état de cause je ne vois jamais l'heure s'afficher dans le Caption de la fiche, or c'est ça que je voudrais voir !

    Pour qu'on soit bien d'accord :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.PageControl1Change(Sender: TObject);
    begin
      case PageControl1.ActivePageIndex of
        0: Checkbox1.Checked := not CheckBox1.Checked; // change d'état à chaque activation du premier onglet
        //0: Checkbox1.Checked:=True; // ne passe pas dans TabSheet1Enter
        //0: button1.SetFocus; // passe dans TabSheet1Enter
        //0: Caption := TimeToStr(Now); // heure affichée mais ne passe pas dans TabSheet1Enter
     
        1: Caption := DateToStr(Now); // date affichée
      end;
    end;
    Et si je fais comme ça, étudie bien les commentaires (attention à l'essai 2, pas visible du premier coup d'œil, utilise l'ascenseur) :
    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
    procedure TForm1.TabSheet1Enter(Sender: TObject);
    begin
      Checkbox1.Checked := not CheckBox1.Checked;
    end;
     
    // essai 1 : jamais vu de changement de la case à cocher
    procedure TForm1.PageControl1Change(Sender: TObject);
    begin
      case PageControl1.ActivePageIndex of
        0: Caption := TimeToStr(Now); // heure affichée mais ne passe pas dans TabSheet1Enter
        1: Caption := DateToStr(Now); // date affichée
      end;
    end;
     
    // essai 2 : la case à cocher change d'état à chaque arrivée sur le premier onglet
    procedure TForm1.PageControl1Change(Sender: TObject);
    begin
      case PageControl1.ActivePageIndex of
        0: Button1.SetFocus; // passe dans TabSheet1Enter
        1: Caption := DateToStr(Now); // date affichée
      end;
    end;
    C'est spécial et curieux, non ?
    Comme si le SetFocus du Button activait correctement l'événement TabSheet1Enter... Parce que si je remplace Button1.SetFocus par Button1.Caption := 'essai'; je ne passe plus dans l'événement
    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é
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    si tu casse la chaine d'evenement(message windows) il ne faut pas t'etonner de perdre le focus


    j'ai eu le même soucis dans un contexte different
    j'assigne dynamiquement une fenetre dans le tabsheet et pour palier a cela j'ai fait des BringToFront pour forcer a conserver le focus
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 727
    Points : 15 125
    Points
    15 125
    Par défaut
    Citation Envoyé par anapurna Voir le message
    si tu casse la chaine d'evenement(message windows) il ne faut pas t'etonner de perdre le focus
    Ah ben alors, je casse sans le savoir, car pour moi, que j'appelle le SetFocus d'un bouton ou un changement d'état d'un CheckBox, il y a accès de la part du système à des composant sur l'onglet 1. Après, je ne maîtrise/contrôle pas...

    J'en suis là, regarde bien les commentaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.PageControl1Change(Sender: TObject);
    begin
      case PageControl1.ActivePageIndex of
    //    0: Button1.SetFocus; // passe dans TabSheet1Enter
        0: Button1.Caption := 'pagechange '+TimeToStr(Now);; // caption changé ici mais ne passe pas dans TabSheet1Enter
        1: Caption := TimeToStr(Now); // heure courante bien affichée
      end;
    end;
     
    procedure TForm1.TabSheet1Enter(Sender: TObject);
    begin
      Button1.Caption:='Enter '+ TimeToStr(Now); // jamais vu sauf si je décommente "SetFocus" dans PageChange
    end;
    Citation Envoyé par anapurna Voir le message
    j'assigne dynamiquement une fenetre dans le tabsheet et pour palier a cela j'ai fait des BringToFront pour forcer a conserver le focus
    Pas encore fait de recherches là-dessus mais je pressens que ça va être tendu sous Linux,

    À suivre...
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 727
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 727
    Points : 15 125
    Points
    15 125
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Pas encore fait de recherches là-dessus mais je pressens que ça va être tendu sous Linux,
    Plus simple que prévu, mais moins efficace qu'espéré...

    Bref, j'ai encore trifouillé à gauche à droite, et je crois que je m'en suis sorti : en tout cas ça fonctionne dans les 2 environnements, et sans m'insulter, ouf !

    En fait, 1- je faisais compliqué avec mon histoire de TabSheetEnter, et 2- comme ce que je voulais c'était donner le focus à un TrackBar, j'ai simplifié et d'une pierre deux coups et ça... fonctionne !
    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
    procedure TForm1.PageControl1Change(Sender: TObject);
    begin
      case PageControl1.ActivePageIndex of
        0: begin; bFocus2Bar := True; Timer1.Enabled := True; end;
        1: Caption := TimeToStr(Now); // témoin de fonctionnement
      end;
    end;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Timer1.Enabled := False;
      if bFocus2Bar then begin // boolean d'utilisation car le timer est aussi utilisé pour autre chose
        Caption := 'timer '+ TimeToStr(Now);// témoin de fonctionnement
        bFocus2Bar := False;
        TrackBar1.SetFocus;
      end;
    end;
    Bon, on ne saura pas pourquoi l'événement TabSheetEnter est si capricieux, et ça, c'est dommage...
    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

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    as tu essayé de passer par un message
    genre


    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
     
    const
      WM_MYSETFOCUS = WM_USER + 1;  
    ....  
     
    procedure TForm1.PageControl1Change(Sender: TObject);
    begin
      ....
      PostMessage(Self.Handle,WM_MYSETFOCUS,0,LPARAM(MONPAGECONTROL));
    end  
     
    TForm1 = Class(TFORM)
     ...
      procedure WMMYSETFOCUS(var Msg: TMessage); message WM_MYSETFOCUS;
    ...
    end;
    ...
     
    procedure TForm1.WMMYSETFOCUS(var Msg: TMessage);
    var
      Ctrl: TWinControl;
    begin
      Ctrl := TWinControl(msg.lparam);
      ActiveControl := Ctrl;
    end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 727
    Points : 15 125
    Points
    15 125
    Par défaut
    Bonsoir,
    Citation Envoyé par anapurna Voir le message
    salut

    as-tu essayé de passer par un message
    Non, pas du tout. À partir du moment où j'ai une solution qui fonctionne, j'arrête de me prendre la tête et je fais avancer le reste du projet.

    Encore merci et bon week-end,
    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. événement non pris en compte
    Par BECHE dans le forum Débuter
    Réponses: 11
    Dernier message: 20/01/2010, 09h41
  2. [QR 4.05] Propriété imprimante non pris en compte
    Par portu dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 30/09/2008, 14h21
  3. [ASE][SQL]WHERE non pris en compte
    Par Benjamin78 dans le forum Sybase
    Réponses: 1
    Dernier message: 24/03/2006, 12h00
  4. Accents non pris en compte dans les requêtes SELECT
    Par YanK dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/08/2005, 10h57
  5. [event] keyListener non pris en compte
    Par pierre.zelb dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 03/08/2005, 08h35

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