![]() |
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; |
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 :(
|
Re: Slicing for Delphi™
Du brauchst es doch nur da einzusetzen, wo du 'ne StringList als Result zurückgibst?
also
Delphi-Quellcode:
Das Ganze würde ich auch nicht für die Basisklasse umsetzen.
Function GetStrings(Index: Integer): IInterfacedStringList;
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: |
Re: Slicing for Delphi™
Zitat:
|
Re: Slicing for Delphi™
Liste der Anhänge anzeigen (Anzahl: 1)
:angel:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz