einfach eine StringList mit 'nem Interface versehen
und dann nur noch dem Interface die nötigen Funktionen mitgeben...
hier fehlen jetzt nur noch einige Funktionen im Interface, also welche man noch unbedingt aus den Public-Abschnitten benötigt.
Delphi-Quellcode:
Type
IInterfacedStringList = Interface
['{E7FD1CCD-B023-491F-BEBA-3CEC190370D6}']
//Private
Function Get(Index: Integer): String;
Function GetCount: Integer;
//Public
Function Add (Const S: String): Integer;
Function IndexOf(Const S: String): Integer;
Property Count: Integer Read GetCount;
Property Strings[Index: Integer]: String Read Get; Default;
Function Find (Const S: String; Var Index: Integer): Boolean;
//...
End;
TInterfacedStringList = Class (TStringList, IInterfacedStringList)
Protected
FRefCount: Integer;
Function QueryInterface(Const IID: TGUID; Out Obj): HResult; StdCall;
Function _AddRef: Integer; StdCall;
Function _Release: Integer; StdCall;
Public
Procedure AfterConstruction; Override;
Procedure BeforeDestruction; Override;
Class Function NewInstance: TObject; Override;
Property RefCount: Integer Read FRefCount;
End;
Function TInterfacedStringList.QueryInterface(Const IID: TGUID; Out Obj): HResult;
Begin
If GetInterface(IID, Obj) Then Result := 0
Else Result := E_NOINTERFACE;
End;
Function TInterfacedStringList._AddRef: Integer;
Begin
Result := InterlockedIncrement(FRefCount);
End;
Function TInterfacedStringList._Release: Integer;
Begin
Result := InterlockedDecrement(FRefCount);
If Result = 0 Then Destroy;
End;
Procedure TInterfacedStringList.AfterConstruction;
Begin
Inherited;
InterlockedDecrement(FRefCount);
End;
Procedure TInterfacedStringList.BeforeDestruction;
Begin
If RefCount <> 0 Then System.Error(reInvalidPtr);
Inherited;
End;
Class Function TInterfacedStringList.NewInstance: TObject;
Begin
Result := Inherited NewInstance;
TInterfacedStringList(Result).FRefCount := 1;
End;
Ein Therapeut entspricht 1024 Gigapeut.