![]() |
Delphi-Version: 2005
Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Hallo zusammen,
in der ![]()
Delphi-Quellcode:
Ich bin der Meinung, ein
procedure TForm3.DeleteFromRegBtnClick(Sender: TObject);
var reg : TRegistry; begin reg := TRegistry.Create(KEY_WRITE); reg.RootKey := HKEY_LOCAL_MACHINE; reg.DeleteKey('Software\\MyCompanyName\\MyApplication'); reg.DeleteKey('Software\\MyCompanyName'); reg.CloseKey(); end;
Delphi-Quellcode:
bzw.
reg.Free
Delphi-Quellcode:
ist erforderlich, um MemoryLeaks zu vermeiden. Im 2. Code-Abschnitt darüber ist es jedoch genauso programmiert wie im hier eingefügten.
FreeAndNil(reg)
Sowas ist mir dort schon mehrfach aufgefallen. Ist die Online-Hilfe von Embarcadero so schlecht? Jeder Programmieranfänger oder auch Fortgeschrittene, wird diese Hilfe nutzen und sich an den Beispielen orientieren. Und da man sich i.d.R. auf die Hilfe verlässt, merkt man sich das Vorgehen und macht es zukünftig falsch. |
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Ich würde das auch in eine try...finally packen
|
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Hallo,
Zitat:
Aber stimmt schon, gerade mit D2009/D2010 sollten die mal ihre Beispiele mit FastMM4-FullDebug prüfen. Vielleicht hat das ja jemand des C++-Teams 1 zu 1 nach Delphi übersetzt (in C+ gibt es Auto-Pointer, die aber hier auch nicht verwendet worden sind) Und ja, es fehlt das reg.Free;
Delphi-Quellcode:
reg:= TRegistry.Create;
try finally reg.Free; end; Heiko |
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
CloseKey schließt nur den Schlüssel
und TRegistry.Free ist natürlich dennoch für's Freigeben des Objekts nötig. Allerdings könnte man sich hier
Delphi-Quellcode:
das CloseKey sparen, da es in Free mit enthalten ist.
var
reg : TRegistry; begin reg := TRegistry.Create(KEY_WRITE); reg.RootKey := HKEY_LOCAL_MACHINE; reg.DeleteKey('Software\\MyCompanyName\\MyApplication'); reg.DeleteKey('Software\\MyCompanyName'); reg.CloseKey; red.Free; end; (vielleicht haben die in der Eile einfach nur das Falsche weggelassen :stupid: ) PS: Ein Schreibzugriff auch HKEY_LOCAL_MACHINE als Beispiel? Ein normaler Benutzer hat da doch keine Rechte mehr dafür, seit Vista/Seven. :shock: |
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Zitat:
|
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Zitat:
|
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Ich nicht. ;)
|
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Die Beispiele in der Online-Hilfe sind schon immer teilweise sehr unelegant/fehlerbehaftet gewesen (Objekte nicht freigegeben, unübersichtliche Verwendung von with, Vergleiche auf true, etc.). Man kann sie nur als Anschauungsbeispiel für die Verwendung der speziellen Routine verwenden (wozu sie ja auch gedacht sind), sollte sie aber nicht unbedingt als das NonPlusUltra der Programmierkunst verstehen.
|
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Zitat:
Das geht nur, wenn man nur einen Key geöffnet hatte, denn es wird nur der jeweils letzte geöffnete bei Free geschlossen. Zu jedem Open also am Besten auch ein Close (wie sich das gehört ;-)) |
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Zitat:
Dann könnte man "Free" im vorliegenden Beispiel weg lassen, auch wenn ich es anders schöner finde. Gerade bei einer Erweiterung des Codes muss "Free" ggf. ergänzt werden und sowas vergisst man dann leicht. Meiner Meinung nach sollten die Beispiele jedoch allgemein gehalten werden. Normalerweise guckt man kurz nach, wie es geht und überträgt es auf seine Aufgabenstellungen. Naja gut, dann werde ich nur noch auf die OH verweisen, wenn ich die Beispiel-Codes davor angesehen habe. |
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Warum das .Free() gehört dann ins finally
|
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Ich für meinen Teil habe mir angewöhnt, solchen Code folgendermaßen zu schreiben (das mache ich mittlerweile schon automatisch):
Delphi-Quellcode:
Erst danach springe ich in Zeile 3 und schreibe den Code, der mit dieser Instanz irgendetwas tut. Mit dieser Vorgehensweise bin ich bislang recht gut gefahren.
Bla := TBla.Create;
try finally Bla.Free; end; |
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Moin Detlef,
Zitat:
MfG Fabian |
AW: Ist TRegistry.Free nach TRegistry.Create nicht notwendig?
Delphi 2006 kann es jedenfalls schon.
Ich mach's sonst auch wie Deddy. Aber darum geht's mir in diesem Thema nicht. Ich wollte euch nur darauf hinweisen machen, die Beispiele aus der Hilfe genau zu prüfen bzw. je nach Code zu meiden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz