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 :

[0.9.30.2] Le onActivate ne fonctionne plus comme dans les version précédentes


Sujet :

Lazarus Pascal

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 37
    Points : 27
    Points
    27
    Par défaut [0.9.30.2] Le onActivate ne fonctionne plus comme dans les version précédentes
    Bonjour à tous,

    J'ai installé Lazarus 0.9.30.2, et après avoir programmé un peu, je me suis rendu compte que le onActivate ne marchait plus comme avant (.28.2)

    J'ai donc été voir dans le change log, et en effet apparemment, il ne se déclenche que sur la première activation de la fenêtre...

    Je trouve ça un peu inutile, car au final il fais la même chose que le onLoad/onShow.

    Le problème :

    Dans mon application j'ai deux fenêtres, lorsque je ferme la deuxième fenêtre (fenêtre de configuration), ça revient donc sur la Main, je voudrais faire une routine (pour afficher les nouvelles valeurs) sans avoir à mettre un bouton "refresh" pour déclencher manuellement la routine, mais avec le nouveau onActivate je ne vois plus comment déclencher cette routine...

    J'ai pensé à mettre un booléen "fenetre_perdu" mais bon c'est pareil, pour checker le booléen, pour savoir si il faut déclencher la routine ou non, il faut un évent...

    Si vous avez des idées pour que ça m'évite de repasser sur le .28.2 ça serait avec plaisir.

    Merci

    Jean-François.

  2. #2
    Membre habitué Avatar de Modulpro
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2010
    Messages : 76
    Points : 175
    Points
    175
    Par défaut
    Bonsoir,

    Une solution (pas très propre) serait d'appeler la routine de rafraîchissement lors du "onclose" de la fenêtre de config (ou lors du clic sur le bouton OK s'il y a aussi un bouton annuler).
    Cela risque de créer un problème de références circulaires entre les unités des deux fenêtres, problème qui peut être contourné en mettant une clause uses après le "implementation" d'une des unités.
    Cependant, comme dit précédemment, cela est moins propre, car il faudrait faire autant d'appels qu'il y a de fenêtres susceptibles de provoquer un retour sur le main (ce qui revient à remplacer manuellement le "onactivate")

    Ceci dit, je n'ai pas la 0.9.30, donc impossible pour moi de constater ce problème.
    Cordialement.

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    si ta 2éme fenêtre est modal (est c'est ce que je crois), normalement tu l'appel depuis ta form main, ce que je fais (sous delphi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with TFParam.create(application) do
      try
         if showmodal=1 then
            begin
               // appel une fonction, faire quelque chose,.......
            end;
    finally
      Release;
    end;
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 37
    Points : 27
    Points
    27
    Par défaut
    Le première solution est vraiment pas très propre...

    La deuxième c'est quand tu ouvre la deuxième fenêtre que tu fais ça donc ça peut marcher. Mais moi c'est à la fermeture de la deuxième fenêtre que je veux déclencher (pour mettre à jour des infos dans la première), donc si à la fermeture de la deuxième je dois envoyer un params à la première je dois forcement l'uses et rebelote "Circular" etc....




    C'est toujours pareil sur les version Snapshoot developer ? (0.9.31.xx ?)

    Pour rigoler 5 minutes :

    Gtk2: Application.OnActivate() / Application.OnDeactivate() now fires only once per event, not on each form activation/deactivation.
    Source : http://wiki.lazarus.freepascal.org/L..._release_notes

    Quelle bonne idée ils ont eut !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je ne sais pas si je comprends correctement votre problème mais déjà pour éliminer les références circulaires, on peut procéder ainsi:
    Unit1
    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
    unit Unit1; 
    
    {$mode objfpc}{$H+}
    
    interface
    
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
      unit2;
    
    type
    
      { TForm1 }
    
      TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end; 
    
    var
      Form1: TForm1; 
    
    implementation
    
    {$R *.lfm}
    
    { TForm1 }
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     Label1.Caption := 'Form1';
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2.ShowModal;
    end;
    
    end.
    Unit2
    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
    unit Unit2; 
    
    {$mode objfpc}{$H+}
    
    interface
    
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
    
    type
    
      { TForm2 }
    
      TForm2 = class(TForm)
        Label2: TLabel;
        procedure FormShow(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end; 
    
    var
      Form2: TForm2; 
    
    implementation
    uses Unit1;
    
    { TForm2 }
    
    procedure TForm2.FormShow(Sender: TObject);
    begin
      Label2.Caption := Form1.Label1.Caption;
    end;
    
    procedure TForm2.FormClose(Sender: TObject; var CloseAction: TCloseAction);
    begin
      Form1.Label1.Caption := 'Form2 fermée';
    end;    
    
    {$R *.lfm}
    
    end.
    Dans l'exemple ci-dessus, je crée 2 Forms dans un projet vierge. Un button1 et un label1 prennent place dans Form1 et un label2 dans Form2. Button1Click de Form1 ouvre Form2 dont le label2 se charge (TForm2.FormShow) avec la valeur de Form1.label1. Lors de la fermeture de Form2, son évènement Close actualise le Form1.Label1 avec la valeur précisée 'Form2 fermée'. Sur l'appareil dont je dispose pour formuler cette réponse, je n'ai pas de Linux installé mais je ne pense pas que la modification du déclenchement de Onactivate dans Gtk2 ait une influence sur le code ci-dessus.

    L'exécution des codes dépend du mode d'ouverture de la Form2. Si vous l'appelez avec Show, le "traitement" (ie la synchronisation des évènements) est différent d'un appel par Showmodal. Pour échanger des valeurs entre 2 Forms, vous pouvez également utiliser avec les précautions d'usage une unit dans laquelle vous déclarez les variables partagées, unit appelée dans les uses (interface) des 2 Forms.

    Cordialement. Gilles
    Code réalisé et vérifié avec Lazarus 0.9.31-34335-fpc-2.5.1-20111221-Win32
    Dernière modification par Invité ; 22/12/2011 à 16h59.

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par jeffk_ Voir le message
    J'ai installé Lazarus 0.9.30.2, et après avoir programmé un peu, je me suis rendu compte que le onActivate ne marchait plus comme avant (.28.2)
    Le comportement a été calqué sur celui de Delphi (cf. ci-après). Et c'est à mon avis une bonne chose, même si je suis sur que certains parmi vous argumenteront le contraire !
    Citation Envoyé par jeffk_ Voir le message
    Dans mon application j'ai deux fenêtres, lorsque je ferme la deuxième fenêtre (fenêtre de configuration), ça revient donc sur la Main, je voudrais faire une routine (pour afficher les nouvelles valeurs) sans avoir à mettre un bouton "refresh" pour déclencher manuellement la routine, mais avec le nouveau onActivate je ne vois plus comment déclencher cette routine...
    En effet, et je peux même dire que vous affichez la 2° fenêtre de manière modale ! Dans ce cas, il faut suivre le conseil donné par @edam à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if Form2.Showmodal = mrOk then // ou mrCancel ou une autre réponse
    begin
      // Actualiser la fenêtre appelante
      Self.Refresh;
      // ou toute autre méthode faisant le traitement voulu
      // Self.Actualiser;
    end;
    Maintenant, si la 2° fenêtre est affichée de manière non modale, alors là, les méthodes correspondant aux évènements OnActivate et OnDeactivate seront appelées si elles existent...
    C'est dans ce sens où j'estime que c'est une bonne chose: quand on affiche de manière modale, on a le contrôle sur ce qui se produit et l'on sait quand la fenêtre redevient active, ces évènements n'ont donc pas de sens et les gérer non plus !
    Dans le cas contraire, ils reprennent toute leur importance tout comme leur gestion.
    --
    Philippe.
    Philippe.

Discussions similaires

  1. Delphi XE2 Create Destroy ne fonctionne plus comme avant
    Par alheuredudejeuner dans le forum Composants VCL
    Réponses: 9
    Dernier message: 12/10/2011, 09h22
  2. Fonctionnement des Treview dans les userform
    Par popsmelove dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/01/2008, 13h12
  3. Réponses: 8
    Dernier message: 11/10/2006, 16h41
  4. Requete qui ne fonctionne pas sur toutes les versions de MySQL
    Par goldorax113 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h04

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