Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Elemente zur Laufzeit erzeugen (https://www.delphipraxis.net/216131-elemente-zur-laufzeit-erzeugen.html)

em-sigma 2. Nov 2024 18:55

Elemente zur Laufzeit erzeugen
 
Hallo,

ich bin gerade dabei ein Programm zu schreiben, das fast alle Elemente zur Laufzeit selbst erzeugen soll (statt alles im Editor zusammenzuklicken).

z.B.:
Delphi-Quellcode:
   for i:=1 to 4 do begin
      GroupBoxX[i]:=tGroupBox.Create(TabSheet1);
      GroupBoxX[i].Parent:=TabSheet1;
      GroupBoxX[i].SetBounds(
        GroupCoords[i].L,
        GroupCoords[i].T,
        GroupCoords[i].W,
        GroupCoords[i].H
      );
      GroupBoxX[i].Caption:=GroupCoords[i].N;
      GroupBoxX[i].Tag:=i;
   end;
   for i:=5 to 8 do begin
      GroupBoxX[i]:=tGroupBox.Create(TabSheet2);
      GroupBoxX[i].Parent:=TabSheet2;
      GroupBoxX[i].SetBounds(
        GroupCoords[i].L,
        GroupCoords[i].T,
        GroupCoords[i].W,
        GroupCoords[i].H
      );
      GroupBoxX[i].Caption:=GroupCoords[i].N;
      GroupBoxX[i].Tag:=i;
   end;
Es gibt dafür ein Konstanten-Array (GroupCoords ist ein Array mit Records mit L,T,W,H,N) mit den entsprechenden Daten.
Leider muß ich bei Create und Parent das Ziel direkt angeben.

Gibt es eine Möglichkeit, wie ich die beiden Angaben auch im Record unterbringen kann?
Das würde den Code um einiges verkürzen.

Vielen Dank
Beste Grüße

himitsu 2. Nov 2024 20:05

AW: Elemente zur Laufzeit erzeugen
 
Bastel dir einen eigenen "Constructor", für Ableitungen der gewünschten Komponenten,
bzw. als Class-Helper für alle TComponent.

Delphi-Quellcode:
type
  TComponentCreateHelper = class helper for TComponent
    class function Create(...): TComponent; overload; static;
    // oder
    class function Create<T>(...): T; overload; static;
  end;
Dort kannst du selbst entschreiden, was du wie übergeben willst ... auch Records.

peterbelow 3. Nov 2024 12:56

AW: Elemente zur Laufzeit erzeugen
 
Du hast da im Prinzip das gleiche Problem wie der VCL DFM-File Loader. Im DFM-File ist der Name des Parent-Controls als Text gespeichert und wird beim Laden per FindComponent-Methode des Owner-Forms zu einer Objektreferenz aufgelöst. Du kannst das genauso machen: Speichere die Namen (Name-Property)von zu verwendendem Owner und Parent in Feldern des Records. Das Ganze ist aber ziemlich fragil wenn der Name einer der Komponenten im Designer geändert wird; bau da eine Fehlerbehandlung in deine Laderoutine ein falls FindComponent was nicht findet.

em-sigma 6. Nov 2024 15:25

AW: Elemente zur Laufzeit erzeugen
 
Danke für die Anregungen.
Aber ich hab's nun doch etwas anders gelöst.
Nochmals Danke.

Beste Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:24 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-2025 by Thomas Breitkreuz