Hallo Zusammen!
Was erwartet man von ARC?
App mit 2 Forms... Main & Form1
Beispiel 1
Delphi-Quellcode:
Procedure TMain.Button1Click(Sender: TObject);
Var
F : TForm1;
begin
F := TForm1.Create(NIL);
F.Show
end;
Was erwartet man?
Das Form wird angezeigt und nachdem man "out of Scope" ist, wird das Fenster wieder geschlossen und die
OnDestroy aufgerufen, oder?
Nöö eben nicht. F.RefCount ist 2 daher wird das Fenster weder geschlossen noch die Destroy aufgerufen.
Beispiel 2
Delphi-Quellcode:
Procedure TMain.Button1Click(Sender: TObject);
Var
F : TForm1;
begin
F := TForm1.Create(NIL);
F.Show
F := NIL;
end;
Bringt logischerweise auch nix.
Noch besser finde ich allerdings folgendes:
Beispiel 3
Delphi-Quellcode:
procedure TMain.Button1Click(Sender: TObject);
var
[WEAK] F : TForm1;
begin
F := TForm1.Create(NIL);
F.Show;
end;
Hierbei ist F.RefCount=1 nachdem "out of scope" sollte jetzt F.RefCount endlich mal 0 sein, oder?
Naja... Auf jeden Fall wird das Fenster dargestellt und funktiniert "ganz prima"
Also wie zum Geier kann ich das Fenster schliessen und den onDestroy aufrufen?
Wie wäre es mit... Moment muss die
IDE neu starten (nicht genug Arbeitsspeicher) da war wohl ein Memory Leak!
Weiter geht's...
Delphi-Quellcode:
Procedure TForm1.FormClose(Sender: TObject;
var Action : TCloseAAction);
begin
Action := TCloseAction.caFree;
// Let's do the MDI Style
end;
Na endlich die OnDestroy wird aufgerufen... Aber halt...
Debugger
Exception-Klasse SIGSEGV(11) ausgelöst. (Zeile 3569 in FMX.Platform.iOS)
> Form.MouseLeave blöde nur das Form jetzt schon NIL ist...
OK Dann anders!
Beispiel 4
Delphi-Quellcode:
procedure TMain.Button1Click(Sender: TObject);
var
F : TForm1;
begin
F := TForm1.Create(NIL);
F.Showmodal;
F.Free;
end;
Mit einem Button ModalResult := mrOK setzen...
UND? OK Fenster ist weg...
Unnötig zu erwähnen, dass die OnDestroy wieder nicht aufgerufen wird!
Noch jemand ne Idee?
Mavarik