Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Action := caFree im OnClose (https://www.delphipraxis.net/119510-action-%3D-cafree-im-onclose.html)

Neutral General 27. Aug 2008 19:05


Action := caFree im OnClose
 
Hi,

Habe gerade folgenden Quelltext vorliegen (vereinfacht):

Delphi-Quellcode:
program EinProgram;

uses EineUnit;

begin
  EineForm := TEineForm.Create(Application);
  try
    EineForm.ShowModal;
  finally
    if EineForm <> nil then
      FreeAndNil(EineForm);
  end;
end.

//// Die Unit mit der Form

unit EineUnit;

interface

type
  TEineForm= class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  EineForm: TEineForm;

implementation

procedure TEineForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

end.
Meine Logik sagt mir: "Das wird krachen!". Denn beim Schließen der Form wird diese freigegeben und im finally-block des Hauptprogramms wird auch immer freigegeben, weil beim freigeben ja nicht genilt wird und der Vergleich deswegen immer true ergibt.

In der Praxis läuft dieser Code aber wunderbar. Ich musste feststellen, dass ich z.B. im finally-block vor dem FreeAndNil noch auf EineForm.Caption sowohl lesend als auch schreiben zugreifen kann.

Meine Frage: :wiejetzt: :gruebel:

mkinzler 27. Aug 2008 19:06

Re: Action := caFree im OnClose
 
FreeAndNil() überprüft, ob das Objekt noch besteht

Neutral General 27. Aug 2008 19:08

Re: Action := caFree im OnClose
 
Zitat:

Zitat von mkinzler
FreeAndNil() überprüft, ob das Objekt noch besteht

Nein tuts nicht. Außerdem erklärt das nicht, dass ich vor FreeAndNil im finally block noch auf EineForm zugreifen kann.

Apollonius 27. Aug 2008 19:30

Re: Action := caFree im OnClose
 
Schau mal in TCustomForm.Close: Wenn CloseAction weder caNone noch caHide noch caMinimize ist, wird Release aufgerufen. Release schickt mit PostMessage die Nachricht CM_RELEASE an das Formular, bei deren Erhalt es sich selbst freigibt. Du kommst dem jedoch zuvor und beim Zerstören des Handles geht die Nachricht verloren.

Neutral General 27. Aug 2008 20:05

Re: Action := caFree im OnClose
 
Also wäre die sauberste Methode einfach Aktion = caHide zu lassen und das Formular im finally-block freizugeben?

Apollonius 27. Aug 2008 20:21

Re: Action := caFree im OnClose
 
Ja, du brauchst gar keine Ereignisbehandlungsroutine für OnClose.

DP-Maintenance 28. Aug 2008 05:49

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "Klatsch und Tratsch" nach "Object-Pascal / Delphi-Language" verschoben.
Ich verschiebe es mal nach hier.


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