Précédent   Forum des professionnels en informatique > Autres langages > Pascal > Lazarus
Lazarus Forum d'entraide sur Lazarus, l'EDI RAD multiplateforme basé sur Free Pascal
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/12/2011, 15h26   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2010
Messages : 36
Détails du profil
Informations personnelles :
Âge : 21

Informations forums :
Inscription : janvier 2010
Messages : 36
Points : 12
Points : 12
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.
jeffk_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 21h57   #2
Membre habitué
 
Avatar de Modulpro
 
Homme Emilien
Étudiant
Inscription : octobre 2010
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Emilien
Âge : 18
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2010
Messages : 59
Points : 112
Points : 112
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.
Modulpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/12/2011, 11h03   #3
Membre Expert
 
Avatar de edam
 
Inscription : décembre 2003
Messages : 1 716
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 1 716
Points : 1 783
Points : 1 783
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 :
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
edam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 15h03   #4
Candidat au titre de Membre du Club
 
Inscription : janvier 2010
Messages : 36
Détails du profil
Informations personnelles :
Âge : 21

Informations forums :
Inscription : janvier 2010
Messages : 36
Points : 12
Points : 12
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 :

Citation:
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 !
jeffk_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 15h30   #5
Membre expérimenté
 
Homme Gilles
Enseignant
Inscription : novembre 2006
Messages : 599
Détails du profil
Informations personnelles :
Nom : Homme Gilles
Âge : 53
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : novembre 2006
Messages : 599
Points : 570
Points : 570
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 :
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 :
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
selzig est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/12/2011, 18h12   #6
Membre chevronné
 
Philippe
Inscription : avril 2002
Messages : 452
Détails du profil
Informations personnelles :
Nom : Philippe
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 452
Points : 683
Points : 683
Envoyer un message via ICQ à Ph. B.
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 :
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.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h35.


 
 
 
 
Partenaires

Hébergement Web