Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   RAD 11 Delphi - Wie erstelle ich Collections ? (https://www.delphipraxis.net/213725-rad-11-delphi-wie-erstelle-ich-collections.html)

paule32.jk 15. Sep 2023 14:13

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.

Olli73 15. Sep 2023 16:24

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.

himitsu 15. Sep 2023 16:35

AW: RAD 11 Delphi - Wie erstelle ich Collections ?
 
aus Array registrieren - geht das ?
Zitat:

Zitat von himitsu (Beitrag 1526992)
Warum eine komische Collection?
Delphi-Referenz durchsuchenTDictionary
Delphi-Quellcode:
TDictionary<string,TArray<deintyp>>


paule32.jk 16. Sep 2023 10:01

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 ?

Olli73 16. Sep 2023 10:59

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.

paule32.jk 16. Sep 2023 11:55

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

Olli73 16. Sep 2023 12:11

AW: RAD 11 Delphi - Wie erstelle ich Collections ?
 
Zitat:

Zitat von paule32.jk (Beitrag 1527004)
okay.

kann man nun Dein Beispiel so erweitern,

Zitat:

- das man nur das Property SC im Container hat,
Das "SL" kannst du ja rauswerfen...

Zitat:

- ein Property für einen Property-Editor, evtl. Marke Eigenbau,
Du kannst einen eigenen Property-Editor programmieren, habe ich aber noch nie gemacht.

Zitat:

- das 2. Property an ein TComponent wie TImage oder TMemo übergeben kann ?
Wie meinst du das?

Zitat:

sprich:
- man hat pro SC, ein entsprechendes Objekt auf der Form Zugriff
Dann musst du das create und assign weglassen...

Olli73 16. Sep 2023 12:21

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:

https://docwiki.embarcadero.com/Libr...etSubComponent

paule32.jk 16. Sep 2023 13:08

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...

Olli73 16. Sep 2023 13:24

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.
Seite 1 von 2  1 2      

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