Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Verständnisfrage zu form.close (https://www.delphipraxis.net/125215-verstaendnisfrage-zu-form-close.html)

khh 2. Dez 2008 15:07


Verständnisfrage zu form.close
 
hallo zusammen,
ich erzeuge aus einem Form1 ein zweites form und zeige diese modal an.

kdbearbeitenform := Tkdbearbeitenform.Create(nil);
kdbearbeitenform.showmodal;

mit Klick auf einen Button im Form kdbearbeitenform wird das Form geschlossen.

close;


nun habe ich gedacht, ich muss in der proc FormClose das Form mit free "zerstören" da es ja möglich ist aus Form1 immer wieder mit

kdbearbeitenform := Tkdbearbeitenform.Create(nil);
kdbearbeitenform.showmodal;

ein neues Form zu erzeugen.


wenn ich das so mache, bleibt mein Prog beim Schliessen stehen, ohne free funktioniert es fehlerlos?

Aber wird der Speicher so überhaupt freigegeben, oder streikt das Porg vieleicht nach xy-maligen Erzeugen des 2ten Form?

Danke Gruss KH

mashutu 2. Dez 2008 15:27

Re: Verständnisfrage zu form.close
 
Zitat:

Zitat von khh
hallo zusammen,
ich erzeuge aus einem Form1 ein zweites form und zeige diese modal an.
[...]

Und danach mit free freigeben.
Delphi-Quellcode:
 kdbearbeitenform := Tkdbearbeitenform.Create(nil);
try
 kdbearbeitenform.showmodal;  
finally
 kdbearbeitenform.free;
end;
Zitat:

Zitat von khh
wenn ich das so mache, bleibt mein Prog beim Schliessen stehen, ohne free funktioniert es fehlerlos?

Das glaube ich nicht, dass es fehlerlos funktioniert, wenn Du es mit Owner = NIL kreierst und nur mit close zumachst.
close setzt (vereinfacht gesagt) lediglich die visible-eigenschaft auf false.

Ausserdem solltest Du nicht 'close' verwenden, sondern den Buttons entsprechende "modalresult"-Values zuweisen.

khh 2. Dez 2008 15:39

Re: Verständnisfrage zu form.close
 
Zitat:

Zitat von mashutu
Das glaube ich nicht, dass es fehlerlos funktioniert, wenn Du es mit Owner = NIL kreierst und nur mit close zumachst.
close setzt (vereinfacht gesagt) lediglich die visible-eigenschaft auf false.

Ausserdem solltest Du nicht 'close' verwenden, sondern den Buttons entsprechende "modalresult"-Values zuweisen.

eben drum hab ich nachgefragt.

und wenn ich einen owner zuweise, wirds ja auch erst beim entfernen des owners mit entfernt, wennich das richtig sehe.

khh 2. Dez 2008 15:46

Re: Verständnisfrage zu form.close
 
Zitat:

Zitat von khh
Zitat:

Zitat von mashutu
Das glaube ich nicht, dass es fehlerlos funktioniert, wenn Du es mit Owner = NIL kreierst und nur mit close zumachst.
close setzt (vereinfacht gesagt) lediglich die visible-eigenschaft auf false.

Ausserdem solltest Du nicht 'close' verwenden, sondern den Buttons entsprechende "modalresult"-Values zuweisen.

eben drum hab ich nachgefragt.

und wenn ich einen owner zuweise, wirds ja auch erst beim entfernen des owners mit entfernt, wennich das richtig sehe.

und modalresult:= mrClose gibt den speicher frei ?

mrClose gibts gar nicht :-(

mashutu 2. Dez 2008 16:04

Re: Verständnisfrage zu form.close
 
Zitat:

Zitat von khh
und wenn ich einen owner zuweise, wirds ja auch erst beim entfernen des owners mit entfernt, wennich das richtig sehe.

Das siehst Du richtig. Da du aber u.U. nicht verhindern kannst, dass das Form mehrmals erstellt wird musst Du es auch manuell freigeben.

Zitat:

Zitat von khh
und modalresult:= mrClose gibt den speicher frei ?

Latuernich nicht. Das Setzen des Modalresult kann und darf den Speicher nicht freigeben. Es beendet das modale Anzeigen des Fensters.
Normalerweise willst Du ja den Modalresult hinterher auswerten, wie willst Du das denn machen, wenn sich das Fenster bereits aus dem Speicher verabschiedet hat?

Delphi-Quellcode:
  frm := tMyForm.create(NIL);
  try
     myvalue := frm.showmodal;
  finally
     frm.free;
  end;
Zitat:

Zitat von khh
und modalresult:= mrClose gibt den speicher frei ?

mrClose gibts gar nicht :-(

Nimm halt mrOK oder irgendeinen anderen (von Null verschiedenen) Integerwert, wenn Du es nicht auswerten musst.

khh 2. Dez 2008 18:47

Re: Verständnisfrage zu form.close
 
ok, ichdanke dir

Sir Rufo 2. Dez 2008 19:27

Re: Verständnisfrage zu form.close
 
öh, nur mal so als tipp, wie man ein Formular zum Verduften aus dem Speicher bewegt und ohne es an ein Parent zu hängen:

Also irgendwo rufe ich auf:
Delphi-Quellcode:
TMeinFormular.Create( nil ).Show;
und das Formular wird einfach geöffnet (oh Wunder :mrgreen: )

Das Formular braucht jetzt noch eine kleine Erweiterung im OnClose-Event:
Delphi-Quellcode:
procedure TMeinFormular.OnClose( Sender : TObject );
begin
  FreeOnRelease;
  Release;
end;
und es verpufft nach dem Schließen aus dem Speicher.

cu

Oliver

[edit] huch ... sehe gerade das ist für lazarus ... ich hoffe das geht da auch so :mrgreen: [/edit]

Apollonius 2. Dez 2008 19:54

Re: Verständnisfrage zu form.close
 
Das ist sogar noch etwas komplizierter als notwendig. Im OnClose-Event gibt es doch extra den var-Parameter Action. Wenn man diesen auf caFree setzt, wird das Formular freigegeben.

Hansa 3. Dez 2008 02:03

Re: Verständnisfrage zu form.close
 
Zitat:

Zitat von Apollonius
Das ist sogar noch etwas komplizierter..Wenn man diesen auf caFree setzt, wird das Formular freigegeben.

Das ist offensichtlich zu einfach. :shock: :lol:

khh 3. Dez 2008 06:29

Re: Verständnisfrage zu form.close
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von Apollonius
Das ist sogar noch etwas komplizierter..Wenn man diesen auf caFree setzt, wird das Formular freigegeben.

Das ist offensichtlich zu einfach. :shock: :lol:

na dan werd ich das mal probieren ,-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 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