Einzelnen Beitrag anzeigen

Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#1

Forms & ARC "spielereien"

  Alt 1. Jul 2013, 17:33
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
  Mit Zitat antworten Zitat