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:
{
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;
Die Problematik ist Folgende:
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
A fool with a tool remains a fool.