Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Slicing for Delphi™ (https://www.delphipraxis.net/131414-slicing-delphi%99.html)

himitsu 22. Apr 2009 20:20

Re: Slicing for Delphi™
 
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;

Meflin 22. Apr 2009 20:27

Re: Slicing for Delphi™
 
OK, aber das bedeutet doch dann, dass der Benutzer wenn er Slicing verwenden will immer TInterFacedStringList verwenden muss (wenn er eigentlich mit TStringList arbeiten will) - das würde ich eigentlich gerne vermeiden :(

himitsu 22. Apr 2009 20:37

Re: Slicing for Delphi™
 
Du brauchst es doch nur da einzusetzen, wo du 'ne StringList als Result zurückgibst?

also
Delphi-Quellcode:
Function GetStrings(Index: Integer): IInterfacedStringList;
Das Ganze würde ich auch nicht für die Basisklasse umsetzen.


Witzig wäre es, wenn du deine Slicing-Erweiterung als Class-Helper für TStrings erstellst,
dann hätte man diese Funktion gleich automatisch in allen TStrings-Nachfahren (wie TStringList) drin,
und das sogar auch noch bei allen Instanzen, die man nichtmal selber erstellt hat (wie z.B. .Lines von TMemo). :angel:

Meflin 22. Apr 2009 20:54

Re: Slicing for Delphi™
 
Zitat:

Zitat von himitsu
Witzig wäre es, wenn du deine Slicing-Erweiterung als Class-Helper für TStrings erstellst

Im Moment ist es einer für TStringList, aber haste Recht, kann mna ja gleich für TStrings machen :thumb:

himitsu 22. Apr 2009 22:23

Re: Slicing for Delphi™
 
Liste der Anhänge anzeigen (Anzahl: 1)
:angel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz