Soo
ich hab das nu ma mit den Interfaces probiert, nur so wirklich funkt das nicht.
Testklasse:
Delphi-Quellcode:
unit uTestClass;
interface
uses
SysUtils;
type
TTestClass =
class(TObject, IInterface)
protected
FRefCount: integer;
function _AddRef: Integer;
stdcall;
function _Release: Integer;
stdcall;
function QueryInterface(
const IID: TGUID;
out Obj): HResult;
stdcall;
public
class function NewInstance: TObject;
override;
property RefCount: Integer
read FRefCount;
end;
implementation
{ TTestClass }
function TTestClass._AddRef: Integer;
begin
FRefCount := RefCount + 1;
Result := FRefCount;
// [X] HALTEPUNKT
end;
function TTestClass._Release: Integer;
begin
FRefCount := FRefCount - 1;
Result := FRefCount;
// [X] HALTEPUNKT
if Result = 0
then
Destroy;
end;
function TTestClass.QueryInterface(
const IID: TGUID;
out Obj): HResult;
begin
if GetInterface(IID, Obj)
then
Result := 0
else
Result := E_NOINTERFACE;
end;
class function TTestClass.NewInstance: TObject;
begin
Result :=
inherited NewInstance;
TTestClass(Result).FRefCount := 1;
end;
Dazu wird an einer bestimmten Stelle folgender Code aufgerufen:
Delphi-Quellcode:
var
t: TTestClass;
begin
t := TTestClass.Create();
t := nil;
end;
Tja, was soll ich sagen, weder _AddRef noch _Release werden aufgerufen. So funktioniert das schon mal auf alle Fälle nicht.
@Marphy:
Das Ding bei deinem Vorschlag ist ja, das erstma die Liste initialisiert werden muss. Dann muss ich ja auch noch alle Nase lang die temp. Variablen deklarieren um damit zu arbeiten. Wenn ich die nicht deklariere, dann komm ich ja nicht über das "MyList.Add()" hinaus. Danach muss ich dann auch noch mich zumindest um das Freigeben der Liste kümmern.
In etwa bin ich wieder bei +/- 0, ich muss weiterhin die Variablen deklarieren und ich muss weiterhin mich ums freigeben kümmern (auch wenn ein wenig einfacher nu). Ich finde, da lohnt sich das neuschreiben einer TVectorList Klasse noch nicht mal plus das umschreiben des bisherigen Codes für das Ergebnis.
Aber danke für den Denkanstoß!
MfG
- Thebe