AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Forms & ARC "spielereien"

Ein Thema von Mavarik · begonnen am 1. Jul 2013 · letzter Beitrag vom 3. Jul 2013
Antwort Antwort
Seite 1 von 2  1 2      
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
Crocotronic

Registriert seit: 9. Mai 2013
258 Beiträge
 
#2

AW: Forms & ARC "spielereien"

  Alt 1. Jul 2013, 18:07
Was hälst du von
Delphi-Quellcode:
 Form2:= TForm2.Create(nil);
 try
  Form2.ShowModal;
 finally
  Form2.Destroy;
  Form2:= nil;
 end;
?
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: Forms & ARC "spielereien"

  Alt 1. Jul 2013, 18:18
Was hälst du von
Delphi-Quellcode:
 Form2:= TForm2.Create(nil);
 try
  Form2.ShowModal;
 finally
  Form2.Destroy;
  Form2:= nil;
 end;
?
OK mal abgesehen davon, dass man Destroy nicht aufrufen soll, funktioniert es mit einem Testprogramm zwar, aber ich musste leider feststellen, dass
ShowModal in IOS nicht funktioniert, da dann einige Sachen nicht animiert werden!

Mavarik
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: Forms & ARC "spielereien"

  Alt 1. Jul 2013, 18:39
Der "richtige" Weg ist Form.DisposeOf aufzurufen (welches aber nicht in älteren Delphi Versionen vorhanden ist). Die Funktion hat Embarcadero genau für diesen Fall eingebaut, nachdem sie das "Free" zweckentfremdet haben. Aber "DisposeOf sollte man nur in Sonderfällen aufrufen". Leider sind aber die alle (GUI) Controls Sonderfälle, da irgendwo im inneren der FMX eine Strong-Reference auf sie existiert.
So kann man ein Konzept auch ad absurdum führen.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Forms & ARC "spielereien"

  Alt 1. Jul 2013, 18:47
Ich kenne mich mit Delphi-Projekten unter iOS nicht aus, aber das Application-Objekt (falls es das unter iOS auch gibt), merkt sich doch alle seine Formen. Bislang doch nur ein Sonderfall bei Formen, oder?
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: Forms & ARC "spielereien"

  Alt 1. Jul 2013, 18:57
Bislang doch nur ein Sonderfall bei Formen, oder?
Kann schon sein. Die FMX wurde ohne ARC (im Kopf) entwickelt und erst nachträglich ARC-kompatibel gefrickelt. Aber eigentlich geht mir die FMX sonstwo vorbei, so schlecht wie die geschrieben ist (und das bezieht sich nicht nur auf die Performance).
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: Forms & ARC "spielereien"

  Alt 1. Jul 2013, 20:14
Der "richtige" Weg ist Form.DisposeOf aufzurufen...
Jo das gibt an ganz neuen Stellen die Exceptions...
  Mit Zitat antworten Zitat
Elfriede

Registriert seit: 26. Aug 2003
8 Beiträge
 
#8

AW: Forms & ARC "spielereien"

  Alt 1. Jul 2013, 21:23
Wir sollte mal schauen, nach welchen Mustern das FMX-Framework sich verhält. Den kompletten Total-Ausfall, den Du da beschreibst, konnte ich so nicht nachvollziehen. Anbei der Lebens-Zyklus eines Child-Forms, das ich über eine Schaltfläche auf dem Haupt-Form aufgerufen habe:

screen-shot-2013-07-01-21.20.34.png

Zumindest im Simulator - diese Einschränkung muss ich noch machen. Vielleicht kann ich meinem Mitbewohner nachher wieder sein iPhone klauen, dann kann ich es auch dort versuchen.


Elli
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.254 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Forms & ARC "spielereien"

  Alt 1. Jul 2013, 21:42
Hallo,

wenn Du dir mal den Projektquelltext anschaust, dann machen die die Forms so:


Application.CreateForm(TFormxyz, Formxyz);

Dann wird die Form wahrschein lich beim Destory des Applicationsobject kommen ....

Wenn Du natürlich 100 Forms hast, dann wird dies wahrscheinlich nicht gehen ....

Ich hatte mich mit dem Arc auch einwenig beschäftigt und gesehen, das der RefCount bei manchen Sachen nicht mit 1 erstellt wird sondern mit einer großen Zahl.

Also mal testen formxyz.Refcount ausgeben lassen!
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Forms & ARC "spielereien"

  Alt 2. Jul 2013, 09:08
Hallo,

wenn Du dir mal den Projektquelltext anschaust, dann machen die die Forms so:


Application.CreateForm(TFormxyz, Formxyz);

Dann wird die Form wahrschein lich beim Destory des Applicationsobject kommen ....
Das stimmt nur für Forms, die man im Projekt als auto-create angegeben hat - Frank erzeugt das Form selber.

Generell wird ARC wohl ein kleines Problemchen mit so fire and forget Aktionen haben. Im ersten Beispiel müsste es schon knallen (bzw das Form sofort wieder geschlossen und freigegeben werden), wenn die lokale Variable die einzige Referenz wäre. Das Form wird angezeigt und danach die Routine verlassen (Show ist nicht blockierend). Das heißt also, irgendwo wird es eine Referenz auf das Form geben. Ich bin der Meinung, Beispiel 3 sollte das sein, was funktionieren sollte - die AV in der FMX.Platform.iOS sollte abgefangen werden (bzw nil safe implementiert werden).
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 2. Jul 2013 um 09:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz