Bonjour,
Si tu utilise la même variable pour référencer toutes tes instances, tu va forcement avoir un problème.
Le mieux serait que ta fenêtre secondaire, soit autonome.
Dans le FormClose, tu met Action à caFree
Ta form principale, n'a donc pas à se souvenir (référecer) les différentes instances qu'elle a lancée.
Tu as quelque chose du style.
1 2 3 4 5 6 7
| procedure lance_ecran;
var
f : TForm1 ;
begin
f := TForm1.Create(Form_Appelante) ;
f.Show ;
end; |
f est oublié dès que l'instance est lancée (puisque variable locale)
Le fait de passer en paramètre FormAppelante, fait que dans Form1 tu pourra faire des choses du style :
TForm_Appelante( Owner).AppelPourNotifierUnTruc( self)
et dans ta form appelante
1 2 3 4 5 6 7 8 9 10
| procedure TFormAppelante.AppelPourNotifierUnTruc( f : TForm);
begin
with f as TForm1 do begin
...
...
end;
// éventuellement
// (mais mettre Action à caHide dans FormClose de TForm1)
TForm1( f ).Free ;
end |
Si tu veux réellement que ta form principale connaisse toutes ses filles ...
Il faudrait que dans ta form principale, tu ai dans le FormCreate :
ma_liste_fenetre := TObjectList.Create( false );
et dans le FormDestroy
LancerEcran va devenir :
1 2 3 4 5 6 7 8
| procedure lance_ecran;
var
f : TForm1 ;
begin
f := TForm1.Create(Form_Appelante) ;
ma_liste_fenetre.Add( f );
f.Show ;
end; |
LA libération va être compliqué, comme expliqué en début, la TForm1 devra appeler une procédure de FormAppelante en s'auto-référençant en paramètre.
Il sera alors possible de faire une recherche dans la liste :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| procedure TFormAppelante.AppelPourNotifierUnTruc( f : TForm);
var
i : integer ;
f1 : TForm1 ;
begin
f1 := nil ;
for i := 0 to ma_liste_fenetre.Count-1 do begin
if ma_liste_fenetre.Items.Item[i] = f then begin
f1 := TForm1( ma_liste_fenetre.Items.Item[i] );
break ;
end ;
end ;
// je peux travailler avec mon instance
if assigned( f1 ) then begin
f1.Ceci ;
// et éventuellement
ma_liste_fenetre.remove( f1 );
f1.free ;
end
else
ShowMessage('J''ai foiré quelque part, car je ne retouve plus ma fenêtre');
end |
Tu pourras aussi faire un truc du style :
1 2 3 4 5 6 7 8 9 10 11
| procedure TFormAppelante.AToutesLesFilles;
var
i : integer ;
f1 : TForm1 ;
begin
for i := 0 to ma_liste_fenetre.Count-1 do begin
f1 := TForm1( ma_liste_fenetre.Items.Item[i] );
// un "with as" aurait fonctionné aussi
f1.Ceci ;
end ;
end |
Bon c'est de "l'à peu près" et demande à être affiné.
Cordialement
Partager