Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Frage zur Reg-Unit (https://www.delphipraxis.net/33668-frage-zur-reg-unit.html)

Stefan Hueg 10. Nov 2004 22:25


Frage zur Reg-Unit
 
Ich habe eine kurze Frage.

Nachdem ich die Reg-Unit deklariert und eine Instanz davon initialisiert habe (reg:=TRegistry.Create), und dann OpenKey aufgerufen habe, deinitialisiere ich das ganze dann mit FreeAndNil.

Muss ich VOR FreeAndNil reg.CloseKey ausführen oder is das egal?

Christian Seehase 10. Nov 2004 22:32

Re: Frage zur Reg-Unit
 
Moin Stefan,

kurze Frage
Zitat:

Zitat von Stefan Hueg
Muss ich VOR FreeAndNil reg.CloseKey ausführen

kurze Antwort:
Ja.

Längere Erklärung: ;-)
Durch das FreeAndNil werden nur die (Speicher)Resourcen freigegeben, die das Objekt belegt, durch das CloseKey auch das Handle, das durch OpenKey belegt wird.

Grundsätzlich:
Jede Resource, die Du anforderst/belegst, musst Du auch wieder freigeben.
BTW: try/finally (Resourcenschutzblock) nicht vergessen, soweit das Belegen und Freigeben innerhalb einer Prozedur/Funktion/Methode erfolgt.

Stefan Hueg 10. Nov 2004 22:41

Re: Frage zur Reg-Unit
 
Kann das FreeAndNil auch eine Exception produzieren, also muss ich das mit try\except kapseln?

Christian Seehase 10. Nov 2004 22:46

Re: Frage zur Reg-Unit
 
Moin Stefan,

Zitat:

Zitat von Stefan Hueg
Kann das FreeAndNil auch eine Exception produzieren,

kann es, wenn die übergebene Variable nicht auf ein gültiges Objekt zeigt.

Zitat:

Zitat von Stefan Hueg
also muss ich das mit try\except kapseln

müssen nicht, hängt vom Zusammenhang ab.

jim_raynor 11. Nov 2004 06:17

Re: Frage zur Reg-Unit
 
Zitat:

Zitat von Stefan Hueg
Muss ich VOR FreeAndNil reg.CloseKey ausführen oder is das egal?

Nein musst du nicht, egal was die anderen sagen. :love:

Begründung. Auch FreeAndNil ruft den Destructor des Objektes auf. Im Destructor von TRegistry wird CloseKey automatisch aufgerufen. :warn:

Luckie 11. Nov 2004 06:22

Re: Frage zur Reg-Unit
 
Zitat:

Zitat von jim_raynor
Begründung. Auch FreeAndNil ruft den Destructor des Objektes auf. Im Destructor von TRegistry wird CloseKey automatisch aufgerufen. :warn:

Kannst du diese Aussage mit Code belegen?

mirage228 11. Nov 2004 06:26

Re: Frage zur Reg-Unit
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von jim_raynor
Begründung. Auch FreeAndNil ruft den Destructor des Objektes auf. Im Destructor von TRegistry wird CloseKey automatisch aufgerufen. :warn:

Kannst du diese Aussage mit Code belegen?

Ich war mal so frei den Code aus der Registry.pas meiner Delphi 7 Professional zu kopieren:
Delphi-Quellcode:
destructor TRegistry.Destroy;
begin
  CloseKey;
  inherited;
end;
Also wird CloseKey wohl im Destruktor aufgerufen! (Was man nich alles so erfährt?! :shock: )

mfG
mirage228

jim_raynor 11. Nov 2004 06:30

Re: Frage zur Reg-Unit
 
Zur Zeit leider nicht, vielleicht denke ich heute Abend dran. :(

Auf jeden Fall ist ja bei den Prof und Enterprise Editions von Delphi der Quellcode der VCL dabei. Unter anderen auch die der Registry unit. Und da ist meines Wissens nach in TRegistry.Destroy der Aufruf von CloseKey drin. Mal ehrlich, wäre wirklich schlimm wenn nicht.

[edit]Gut, dann hat sich das ja jetzt erledigt ;)[/edit]

Luckie 11. Nov 2004 06:37

Re: Frage zur Reg-Unit
 
Zitat:

Zitat von mirage228
Also wird CloseKey wohl im Destruktor aufgerufen! (Was man nich alles so erfährt?! :shock: )

Gut. Ich bin trotzdem der Meinung, dass man alles, was man selber aufmacht auch wieder selber zu machen sollte.
Delphi-Quellcode:
if OpenKey(...) then
begin
  ...;
  ...;
  CloseKey;
end;

Bernhard Geyer 11. Nov 2004 07:23

Re: Frage zur Reg-Unit
 
Zitat:

Zitat von Stefan Hueg
Muss ich VOR FreeAndNil reg.CloseKey ausführen oder is das egal?

Jede vernünftig implementierte Komponente wird im Destruktor alle evtl. noch nötigen Speicher-/Resourcenfreigaben durchführen (Vor allem wenn sie ein Nachfahre von TComponent ist und in der IDE per Drag&Drop verwendet werden kann). Um sicher zu sein (vor allem wenn man den Sourcecode nicht hat) kann man auch noch Freigaben selbst anstoßen durch entsprechende Close, ...- Funktionen.


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