AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein RAD 11 Delphi - Wie erstelle ich Collections ?
Thema durchsuchen
Ansicht
Themen-Optionen

RAD 11 Delphi - Wie erstelle ich Collections ?

Ein Thema von paule32.jk · begonnen am 15. Sep 2023 · letzter Beitrag vom 16. Sep 2023
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#1

RAD 11 Delphi - Wie erstelle ich Collections ?

  Alt 15. Sep 2023, 14:13
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.
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#2

AW: RAD 11 Delphi - Wie erstelle ich Collections ?

  Alt 15. Sep 2023, 16:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: RAD 11 Delphi - Wie erstelle ich Collections ?

  Alt 15. Sep 2023, 16:35
aus Array registrieren - geht das ?
Warum eine komische Collection?
Delphi-Referenz durchsuchenTDictionary
TDictionary<string,TArray<deintyp>>
$2B or not $2B

Geändert von himitsu (15. Sep 2023 um 16:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: RAD 11 Delphi - Wie erstelle ich Collections ?

  Alt 16. Sep 2023, 10:01
@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 ?
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#5

AW: RAD 11 Delphi - Wie erstelle ich Collections ?

  Alt 16. Sep 2023, 10:59
das eine (FSL) ist eine Stringlist der Komponente, also keine Collection, hier nicht relevant. Das andere (FESL) ist dann eine StringList pro CollectionItem.
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: RAD 11 Delphi - Wie erstelle ich Collections ?

  Alt 16. Sep 2023, 11:55
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
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#7

AW: RAD 11 Delphi - Wie erstelle ich Collections ?

  Alt 16. Sep 2023, 12:11
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...
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#8

AW: RAD 11 Delphi - Wie erstelle ich Collections ?

  Alt 16. Sep 2023, 12:21
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
  Mit Zitat antworten Zitat
Benutzerbild von paule32.jk
paule32.jk

Registriert seit: 24. Sep 2022
Ort: Planet Erde
356 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: RAD 11 Delphi - Wie erstelle ich Collections ?

  Alt 16. Sep 2023, 13:08
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...
Frag doch einfach
Alles was nicht programmiert werden kann, wird gelötet
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
755 Beiträge
 
#10

AW: RAD 11 Delphi - Wie erstelle ich Collections ?

  Alt 16. Sep 2023, 13:24
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr.
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