![]() |
RAD 11 Delphi - Wie erstelle ich Collections ?
Hallo,
wie der Betreff schon sagt: wie erstelle ich Collections, die im Designer erstellt werden können ? Habe dazu schon ein wenig Cose-Schnippsel:
Delphi-Quellcode:
unit ResComponent;
interface uses System.SysUtils, System.Classes, System.Generics.Collections, System.Contnrs; type TResourceHolderElements = class private FElementId: Integer; FName: String; public constructor Create(const AElementId: Integer; const AName: String); property ElementID: Integer read FElementId; property Name: String read FName; end; TResourceHolderCategories = class(TComponent) private FName: String; FElements: TObjectList<TResourceHolderElements>; public constructor Create(const AName: String); destructor Destroy; override; property Name: String read FName; property Elements: TObjectList<TResourceHolderElements> read FElements; end; TResourceHolderElementName = record public ElementId: Integer; Name: String; constructor Create(const AElementID: Integer; const AName: String); end; TComponent1 = class(TComponent) private protected public published end; procedure Register; implementation constructor TResourceHolderCategories.Create(const AName: string); begin FName := AName; FElements := TObjectList<TResourceHolderElements>.Create; end; destructor TResourceHolderCategories.Destroy; begin FElements.Free; inherited Destroy; end; constructor TResourceHolderElementName.Create(const AElementID: Integer; const AName: string); begin ElementID := AElementID; Name := AName; end; constructor TResourceHolderElements.Create(const AElementId: Integer; const AName: string); begin FElementID := AElementID; FName := AName; end; procedure Register; begin RegisterComponents('KALLUP', [TComponent1, TResourceHolderCategories]); end; end. |
AW: RAD 11 Delphi - Wie erstelle ich Collections ?
Hier mal eine nicht visuelle Komponente, die eine Stringlist (hier nicht relevant) und eine Collection von StringListen enthält.
Delphi-Quellcode:
unit StringsContainer;
interface uses Windows, Messages, SysUtils, Classes; type TStringsColItm = class(TCollectionItem) private FESL: TStringList; procedure SetESL(Value: TStringList); public constructor Create(Collection: TCollection); override; destructor Destroy; override; published property ESL: TStringList read FESL write SetESL; end; TStringsCol = class(TCollection) private function GetItem(Idx: Integer): TStringsColItm; procedure SetItem(Idx: Integer; Value: TStringsColItm); public property XItems[Idx: Integer]: TStringsColItm read GetItem write SetItem; default; published end; TStringsContainer = class(TComponent) private { Private declarations } FSL: TStringList; FSC: TStringsCol; procedure SetSL(Value: TStringList); procedure SetSC(Value: TStringsCol); protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; published { Published declarations } property SL: TStringList read FSL write SetSL; property SC: TStringsCol read FSC write SetSC; end; procedure Register; implementation constructor TStringsColItm.create(Collection: TCollection); begin inherited; FESL := TStringList.Create; end; destructor TStringsColItm.destroy; begin FESL.Free; inherited; end; function TStringsCol.GetItem(Idx: Integer): TStringsColItm; begin result := TStringsColItm(inherited Items[Idx]); end; procedure TStringsCol.SetItem(Idx: Integer; Value: TStringsColItm); begin inherited Items[Idx] := Value; end; procedure TStringsContainer.SetSL(Value: TStringList); begin FSL.Assign(Value); end; constructor TStringsContainer.Create(AOwner: TComponent); begin inherited; FSL := TStringList.Create; FSC := TStringsCol.Create(TStringsColItm); end; destructor TStringsContainer.destroy; begin FSL.Free; FSC.Free; inherited; end; procedure Register; begin RegisterComponents('MyComps', [TStringsContainer]); end; procedure TStringsColItm.SetESL(Value: TStringList); begin FESL.Assign(Value); end; procedure TStringsContainer.SetSC(Value: TStringsCol); begin FSC.Assign(Value); end; end. |
AW: RAD 11 Delphi - Wie erstelle ich Collections ?
|
AW: RAD 11 Delphi - Wie erstelle ich Collections ?
@olli73:
Danke für Deine Bemühungen ! Du verwendest zwei mal TStringList.Create im Code ... liegen dann nicht 2 Kopien des gleichen Typs im Speicher ? |
AW: RAD 11 Delphi - Wie erstelle ich Collections ?
das eine (FSL) ist eine Stringlist der Komponente, also keine Collection, hier nicht relevant. Das andere (FESL) ist dann eine StringList pro CollectionItem.
|
AW: RAD 11 Delphi - Wie erstelle ich Collections ?
okay.
kann man nun Dein Beispiel so erweitern, - das man nur das Property SC im Container hat, - ein Property für einen Property-Editor, evtl. Marke Eigenbau, - das 2. Property an ein TComponent wie TImage oder TMemo übergeben kann ? sprich: - man hat pro SC, ein entsprechendes Objekt auf der Form Zugriff |
AW: RAD 11 Delphi - Wie erstelle ich Collections ?
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: RAD 11 Delphi - Wie erstelle ich Collections ?
Beim letzten Punkt bin ich mir nicht sicher, ob ich dich richtig verstanden habe.
Falls du doch eine Subkomponente haben möchtest, musst du ggf. noch "SetSubComponent" aufrufen: ![]() |
AW: RAD 11 Delphi - Wie erstelle ich Collections ?
ich Versuche es mal verständlicher:
- ein Property für Collection - pro Collection Item ein Property, wo man einen Property-Editor öffnen kann, mit dessen Hilfe man eine Datei laden kann, und die Bytes dieser Datei and das Property in der Collection übergeben kann - die Datei-Daten - die Bytes also, wenn man RAD Weg nimmt, in der DFM gespeichert werden, so wie man das mit den TImage machen kann - dort liegt doch auch unter den Property "Picture" die Daten für das Bild. Man könnte auch zwei Properties nehmen, eins für den Editor, und eins für die Daten. Wobei ich da mir noch nicht sicher bin, ob und wie man da DesignTime Editor in einen DesignTime Package, mit einen Runtime-Package auslagert. Weil, ich irgendwo hier mal gelesen habe, das Emberracado das mitschleifen von DesignEditor Packages aus Eigenen Haus, untersagt - deshalb die Sache, mit den selber basteln... |
AW: RAD 11 Delphi - Wie erstelle ich Collections ?
Warum nicht einfach ein property vom Typ TFileName machen, dann hast du schonmal einen Dateiauswahldialog, und im Setter die Datei dann als Base64-String speichern, dies landet dann in der DFM.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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