![]() |
AW: Delphi 11 versteht mein generic nicht mehr
Zitat:
@Stevie Danke für die schöne Erklärung, bei Spring4D merkt man das du der Master bist, hab es am Anfang als Grundframework verwendet für viele Aufgaben, aber ich hab nicht alle Mechanismen durchgeblickt und bin auf einfache eigene Lösungen umgestiegen ^^' Von dort hab ich das auch mit den constructor her und entsprechend so interpretiert das es erzwingt das T eine Klasse ist. |
AW: Delphi 11 versteht mein generic nicht mehr
FreeAndNil setzt(e) zwar die Variable auf NIL,
aber ein Interface bekommt davon nichts mir, da dabei Intf._Relase nicht aufgerufen wird. Außerdem wird Obj.Destroy ausgeführt, bzw. wird versucht, aber das gibt es ja im Interface so garnicht, also eigentlich müsste es hier auch schön knallen, wenn in der Variable wirklich ein Interface steckt, anstatt einer Objekt-Referenz. |
AW: Delphi 11 versteht mein generic nicht mehr
Eventuell wäre sowas in System.Sysutils etwas resilienter gewesen gegenüber einem Wechsel von
Delphi-Quellcode:
zu
class
Delphi-Quellcode:
oder umgekehrt:
interface
Delphi-Quellcode:
Ein
procedure FreeAndNil(const [ref] Obj: TObject); inline; overload;
procedure FreeAndNil(const [ref] Obj: IInterface); inline; overload; ... procedure FreeAndNil(const [ref] Obj: IInterface); overload; begin IInterface(Pointer(@Obj)^) := nil; end;
Delphi-Quellcode:
wäre dabei natürlich immer noch außen vor, aber das ist wohl auch gar nicht so schlecht.
record
|
AW: Delphi 11 versteht mein generic nicht mehr
Zitat:
Die Freigabe erfolgt auch auf ein Objekt, das ist mit den constraints für T sichergestellt, deswegen kann ich auch ein Objekt vorher erzeugen ( T.Create). |
AW: Delphi 11 versteht mein generic nicht mehr
Das Problem ist, dass FreeAndNil halt nur für Objekte arbeitet(e).
Jetzt mit der neuen Signatur, wäre eine Unterscheidung zwischen Interface und Objekt möglich. (siehe Post vom Uwe) Zitat:
Delphi-Quellcode:
Und wenn jetzt in Obj aber ein IInterface liegt, dann kann es beim
procedure FreeAndNil(var Obj);
begin if Assigned(Pointer(Obj)) then TObject(Obj).Destroy; // TObject(Obj).Free; Pointer(Obj) := nil; end; // OK, eigentlich begin try if Assigned(Pointer(Obj)) then TObject(Obj).Destroy; // TObject(Obj).Free; finally Pointer(Obj) := nil; end; end;
Delphi-Quellcode:
nur Probleme geben.
TObject(Obj).Destroy;
Also erstmal knallt es und da
Delphi-Quellcode:
die Referenzzählung nicht macht,
Pointer(Obj) := nil;
welche beim
Delphi-Quellcode:
eigentlich auch noch intern ein
IInterface(Intf) := nil;
Delphi-Quellcode:
ausführen würde.
if Assigned(Pointer(Intf)) then IInterface(Obj)._Release;
OK, wenn man die Zählung ignoriert, dann stört es nicht, falls es vorher nicht schon knallen würde. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 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 by Thomas Breitkreuz