Thema: Delphi Slicing for Delphi™

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#21

Re: Slicing for Delphi™

  Alt 22. Apr 2009, 20:20
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat