Forum: Object-Pascal / Delphi-Language
by himitsu,
20. Okt 2021
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)
Rein logisch macht es einfach
procedure FreeAndNil(var Obj);
begin
if Assigned(Pointer(Obj)) then TObject(Obj).Destroy; // TObject(Obj).Free;
Pointer(Obj) := nil;
Forum: Object-Pascal / Delphi-Language
by himitsu,
20. Okt 2021
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.
Forum: Object-Pascal / Delphi-Language
by himitsu,
19. Okt 2021
<IOrModel> nimmt doch nur diesen Typen oder Nachfahren an?
Und da IOrModel ein Interface ist, war und ist Free doch eh falsch?
Forum: Object-Pascal / Delphi-Language
by himitsu,
19. Okt 2021
Records dürfen das schon lange haben. (dort aber leider nicht, wenn ohne Parameter)
Wobei es dort "nur" Constructor heißt, aber Keiner ist.
Das "< ,constructor>" nur wegen dem FreeAndNil?
FreeAndNil war doch schon immer falsch, wenn dort Interfaces drin sind.