Da hier die Form "lokal" ist und von außen geschlossen wird
Delphi-Quellcode:
// weg mit der bösen globalen Variable!!!
procedure TForm1.Button1Click(Sender: TObject);
var
Form2: TForm2;
begin
Form2 := TForm2.Create(Self);
// oder nil, da wir das ja eh alles immer selber freigeben
try
Form2.PopupParent := Self;
// damit die Form2 immer über der Form1 liegt (nicht nötig bei ShowModal)
Form2.Show;
// hier natürlich ShowModal, da sonst ja das Release/Free die Form auch ohne Exception sofort schließt ;)
raise Exception.Create('
Ein Fehler');
finally
Form2.Free;
end;
end;
Delphi-Quellcode:
type
TForm1 =
class(TForm)
...
protected
procedure Notification(AComponent: TComponent; Operation: TOperation);
private
Form2: TForm2;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
try
Form2.PopupParent := Self;
// damit die Form2 immer über der Form1 liegt (nicht nötig bei ShowModal)
Form2.Show;
// hier natürlich ShowModal, da sonst ja das Free
raise Exception.Create('
Ein Fehler');
except
FreeAndNil(Form2);
raise;
end;
end;
procedure TForm1.Notification(AComponent: TComponent; Operation: TOperation);
begin
if Operation = opRemove
then begin
if AComponent = Form2
then // Form2 sagt mir, dass es mich jetzt verlassen will > siehe das Create(Self)
Form2 :=
nil;
// stattdessen könnte man auch die Form2-Variable im TForm2.Destroy auf nil setzen, aber TForm2 weiß ja eigentlich nichts von dieser Variable
end;
inherited;
end;
// und nicht das caFree im TForm2.OnClose vergessen, außer man will die bestehende Form später erneut anzeigen können