![]() |
Delphi 7 Hack für Assigned -> Ersatz für Delphi 2010 gesu
Hallo zusammen.
In unserer Delphi 7 Applikation gibt es eine Funktion, die unter Delphi 7 funktionierte. Möglicherweise ein Hack aus einer Computerzeitschrift oder einem Forum. Code folgt:
Delphi-Quellcode:
Die Problematik ist Folgende:
{
Prüft ein Objekt auf einen NIL-Pointer (assigned) und auf die Gültikeit des Zeigers (SizeOfMem) Eingabeparameter ppeObjRef : zu prüfendes Objekt Rückgabe Boolean --> Objekt-Rferenz gültig oder nicht } function ObjektAssigned(ppeObjRef: TObject): Boolean; type PPVmt = ^PVmt; PVmt = ^TVmt; TVmt = record SelfPtr: TClass; Other: array[0..17] of Pointer; end; var Vmt: PVmt; begin Result := False; if Assigned(ppeObjRef) then begin try Vmt := PVmt(ppeObjRef.ClassType); Dec(Vmt); Result := ppeObjRef.ClassType = Vmt.SelfPtr; except // Exception ignorieren, Result ist False end; end; end; Wenn ein Objekt mit MyObject.Free freigegeben wird, wird von Assigned(MyObject) immer noch True zurückgegeben, obwohl das Objekt schon im Nirwana ist. Obige Funktion gibt in einem solchen Fall False zurück, und das ist genau das gewünschte Verhalten. Unter Delphi 7 hat das sehr schön funktioniert, aber unter Delphi 2010 knallt's. Kennt jemand diesen Hack und weiß, wie man ihn auf Delphi 2010 portiert? Die Funktion FreeAndNil() ist mir bekannt und ich würde sie im äußersten Notfall auch einsetzen, aber wenn es irgend geht dann lieber nicht. Vielen Dank im Voraus |
Re: Delphi 7 Hack für Assigned -> Ersatz für Delphi 2010
Zitat:
|
Re: Delphi 7 Hack für Assigned -> Ersatz für Delphi 2010
Deine Funktion funktioniert bei mir übrigens auch unter Delphi7 nicht:
Delphi-Quellcode:
Beide MessageBoxen werden angezeigt.
procedure TForm1.Button1Click(Sender: TObject);
var tmp: TObject; begin tmp := TObject.Create; tmp.Free; if Assigned(tmp) then ShowMessage('Assigned nachher!'); if ObjektAssigned(tmp) then ShowMessage('ObjektAssigned nachher!'); end; |
Re: Delphi 7 Hack für Assigned -> Ersatz für Delphi 2010
Zitat:
|
Re: Delphi 7 Hack für Assigned -> Ersatz für Delphi 2010
Tja, es hat sich da halt auch mal was verändert.
(neue RTTI, anderer Speichermanager uwm.) A: Außerdem waren solche Funktionen eh nie zu 100% zuverläßig und B: sollte man schon immer in soeinem Fall, wo der Zeiger nach dem Freigeben via Assign geprüft werden soll, FreeAndNil verwenden. Dann ist der Zeiger auch schön NIL. PS: Wenn zufällig ein ein anders Objekt in der Zwischenzeit den selben Speicherplatz belegt, dann dann würde deise Prüfung auch TRUE liefern, da ja "irgendein" Objekt vorhanden ist. Zitat:
|
Re: Delphi 7 Hack für Assigned -> Ersatz für Delphi 2010
Hallo,
eine garantiert zuverlässige Funktion gibt es möglicherweise nicht, eine Alternative für D2010 schon: ![]() FreeAndNil ist sicher die bessere Lösung, und auch darauf kann man in den meisten Fällen verzichten, wenn der Code sauber aufgebaut ist. Im EDN gab es dazu mehrere Threads, in denen unter anderem Joanna Carter einige ![]() Gruß Hawkeye |
Re: Delphi 7 Hack für Assigned -> Ersatz für Delphi 2010
Zitat:
|
Re: Delphi 7 Hack für Assigned -> Ersatz für Delphi 2010
Was ich mir schon seit ca. 13 Jahren wünsche (Delphi 2), ist ein Compiler- oder IDE-Schalter, der ein Objekt automatisch nilt, wenn ich Free aufrufe. Da werden über die Jahre Features eingebaut, die vor Mächtigkeit nur so strotzen, aber dieses kleine, oft gewünschte und unermesslich nützliche Feature kriegt die Compilercompany nicht hin? - Aua.
So, jetzt zum konstuktiven Teil. FreeAndNil ist die bessere Alternative, keine Frage! Zu uns: wir haben ca. 500 MB Quelltexte, historisch gewachsen. Zwei primäre Gründe haben mich zu der Frage veranlasst. 1. Die Destruktoren heißen nicht immer Free. 2. Die Sourcen sind zu ca. einem Viertel generiert. Auf jeden Fall danke ich euch für eure Vorschläge und Verweise auf andere Threads. Den Vorschlag von Hawkeye219 werde ich auf jeden Fall mal ausprobieren. |
Re: Delphi 7 Hack für Assigned -> Ersatz für Delphi 2010
Zitat:
|
Re: Delphi 7 Hack für Assigned -> Ersatz für Delphi 2010
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
if Self <> nil then
Destroy; Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 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