Question sur fonction assigned()

Résolu
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 - 11 juil. 2009 à 08:47
thierrybo Messages postés 15 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 12 novembre 2010 - 9 oct. 2010 à 17:14
Bonjour à tous,
Comment savoir si une fenêtre est créée / affichées, je m'explique:
Quand je crée une fenêtre avec
      form1 := tform1.create(self) - self étant une fenêtre parent, je crée ma fenêtre bien
si dans mon code je teste assigned(form1) , j'aurai True, bien.
si dans l'évenement OnClose de Form1 il y a Action : = cafree pour détruire la fenêtre, celle-ci sera détruite, mais  la valeur du pointeur Form1 ne sera pas mise à nil, et dans ce cas, si je teste assigned(Form1) j'aurai True alors que la fenetre n'existe plus. En fait la procedure free détruit l'objet et libère l'expace mais ne met pas le pointeur à nil.

En fait, je veux enabler/disabler des actions (boutons, menus, ...)  dans une forme si d'autres forms sont présentes (Action1.enabled := True/False), mais comment être sûr que les fenetres sont présentes assigned(xxx) peut me retourner une valeur fausse.
Une solution serait de renseigner une variabl dans form1.create : form1_aff = true et dans form1.destroy : form1_aff=false, et je pourrais faire action1.enabled := not form1_aff, ... et ainsi de suite pour les autres forms, mais ce n'est pas très élégant.
L'autre solution serait de boucler sur toutes les forms de l'application, ça ne me plait pas non-plus.
Avez-vous une idée ?
Bonne journée à tous.

14 réponses

thierrybo Messages postés 15 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 12 novembre 2010 1
9 oct. 2010 à 17:14
Solilog nous disait le dimanche 12 juillet 2009 à 18:17:37
Bonjour,
Je dois être pinailleur,désolé.
Oui ça marche parce que tu forces Form2:= nil dans TForm2.FormClose ce que je veux éviter car "en théorie" c'est interdit de mettre un pointeur de classe à nil avant la fin des traitements (le close doit ensuite appeler free, destroy pour libérer la mem) et ça risque de ne pas ou de mal libérer la mem. Peut-être que je pinaille.


Bonjour,

désolé de remonter un vieux topic, mais comme je suis en apprentissage de l'organisation des fenêtres dans Delphi et que j'ai résolu mon problème justement en forçant Form2 à nil, j'en parle ici. Mon appli n'utilise que des fenêtres non modales, chaque form ne pouvant avoir qu'une seule instance et ne pouvant pas survivre à son parent.
Dans le livre "Mastering Delphi 7" de Marco Cantu, voici ce qu'il indique pour gérer des fenêtres non modales à instance unique où utilise justement cette technique, Mastering Delphi 7 > Part I: Foundations > Chapter 7: Working with Forms > Dialog Boxes and Other Secondary Forms, paragraphe "Creating Single-Instance Secondary Forms" :

The situation is a little more complex when you want to display only one copy of a modeless form. You have to create the form, if it is not already available, and then show it:

if not Assigned (Form2) then
Form2 : = TForm2.Create (Application);
Form2.Show;

With this code, the form is created the first time it is required and then is kept in memory, visible on the screen or hidden from view. To avoid using up memory and system resources unnecessarily, you'll want to destroy the secondary form when it is closed. You can do that by writing a handler for the OnClose event:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
// important: set pointer to nil!
Form2 := nil;
end;

Notice that after you destroy the form, the global Form2 variable is set to nil, which contradicts the rule set earlier for forms with multiple instances, but as this is a single-instance we are in the exact opposite case. Without this code, closing the form would destroy its object, but the Form2 variable would still refer to the original memory location.
1
Rejoignez-nous