Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TForm sauber schleißen (https://www.delphipraxis.net/172450-tform-sauber-schleissen.html)

ATS3788 4. Jan 2013 17:26

TForm sauber schleißen
 
Frohes neues Jahr meine Delphi Buddies

Die ist ein Problem was mich schon einige Jahre verfolgt
und ich habe nie eine saubere Lösung gefunden.

Ein neues Form wird erstellt, OK
Delphi-Quellcode:
if FormIndex = nil then begin
FormIndex := TFormIndex.Create(self);
FormIndex.Show;
FormIndex.hMainWin := self.Handle;
FormIndex.Visible := true;
Bei ShowModal kein Problem.
Nur es soll kein Modales Fenster sein.

Das Fenster soll bei "Close" den Speicher freigeben und den Zeiger
auf Nil setzen. Ich möchte das Fenster von
FormIndex schließen.
Delphi-Quellcode:
procedure TFormIndex.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if self <> nil then
FreeAndNil(self);
............
Wenn ich das bei Destroy mache, geht gar nicht, bei FormClose
gibt es manchmal Schutzverletzungen.

Bei CanClose habe ich es noch nicht ausprobiert.

Meine Frage, wie ist es richtig zu bewerkstelligen und
wo kann man nachlesen wie ein Fenster geschlossen wird.

DeddyH 4. Jan 2013 17:32

AW: TForm sauber schleißen
 
Wenn Du einen Owner angibst, sollte es eigentlich schon damit getan sein, im OnClose Action auf caFree zu setzen. IIRC benachrichtigen TComponents ihren Owner, wenn sie freigegeben werden. Sollte ich mich irren, kann man das aber auch nachbauen.

Sir Rufo 4. Jan 2013 17:39

AW: TForm sauber schleißen
 
Wozu es gut sein soll weiß ich zwar nicht, aber so geht es:
Delphi-Quellcode:
type
  TFormIndex = class( TForm )
  ...
  public
    destructor Destroy; override;
  end;

...

destructor TFormIndex.Destroy;
begin
  if FormIndex = Self then
    FormIndex := nil;
  inherited;
end;
BTW: Wir erinnern uns, globale Variablen sind doof und sollten idR vermieden werden, auch wenn Delphi das mit seinem RAD Ansatz vormacht und damit einen quasi Standard vorgaukeln möchte.

Furtbichler 4. Jan 2013 18:03

AW: TForm sauber schleißen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1197654)
Wir erinnern uns, globale Variablen sind doof und sollten idR vermieden werden, auch wenn Delphi das mit seinem RAD Ansatz vormacht und damit einen quasi Standard vorgaukeln möchte.

Delphi-Quellcode:
Application
= Doof. Und
Delphi-Quellcode:
Screen
auch. :lol:

Bei Delphi sieht man das eben nicht so eng, es ist ja schließlich auch keine richtige OOP-Programmiersprache.

Sir Rufo 4. Jan 2013 18:56

AW: TForm sauber schleißen
 
Zitat:

Zitat von Furtbichler (Beitrag 1197657)
Zitat:

Zitat von Sir Rufo (Beitrag 1197654)
Wir erinnern uns, globale Variablen sind doof und sollten idR vermieden werden, auch wenn Delphi das mit seinem RAD Ansatz vormacht und damit einen quasi Standard vorgaukeln möchte.

Delphi-Quellcode:
Application
= Doof. Und
Delphi-Quellcode:
Screen
auch. :lol:

Die Implementierung ist tatsächlich doof und könnte auch besser gemacht werden (siehe
Delphi-Quellcode:
Printer
).

ATS3788 5. Jan 2013 08:41

AW: TForm sauber schleißen
 
Danke
für die Antworten.
Sir Rufo es geht nur ums
verstehen und Deine Methode ist
echt interessant.

Martin Michael

Furtbichler 5. Jan 2013 11:09

AW: TForm sauber schleißen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1197666)
Die Implementierung ist tatsächlich doof und könnte auch besser gemacht werden (siehe
Delphi-Quellcode:
Printer
).

Dann hätten wir doofe Singletons. Und globale Variablen sind ja nichts anderes als Singletons ohne Schutzmechanismen. Ach egal.

ATS3788 5. Jan 2013 12:36

AW: TForm sauber schleißen
 
Hallo
Sir Rufo wahrscheinlich habe ich nicht richtig erklärt
was ich möchte. Ich habe Ein Main Form und von diesem
steure ich 2 andere Sub Fenster. Habe dies nun damit gelöst
indem ich vom Sub Index Fenster bei FormClose mit sendMessage dem Main Fenster
mitteile bitte FreeAndNil und das funktioniert wunderbar.

Danke für die Antworten

Martin Michael

Furtbichler 5. Jan 2013 12:40

AW: TForm sauber schleißen
 
Eine schöne und einfache Lösung. Zeig doch mal den Code, dann haben alle etwas davon.

Gerd01 5. Jan 2013 17:01

AW: TForm sauber schleißen
 
Wenn Du eine Form modal aufrufst ist dieser Konstrukt das Mittel der Wahl:

Code:
With TMyForm.Create ( Application oder NIL, etc ) do
Try
  ...
  ShowModal;
  ...
Finally
  Free;
End;
Wenn Du eine Form nicht modal aufrufst ( z.B. mit Show )
dann schreibe in die Formclose der jeweiligen Form:

Code:
procedure TMyForm.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
end;
und schließe alle offenen Forms bei Programmende oder wenn gewünscht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.
Seite 1 von 2  1 2      

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