AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Gruppen von Controls erzeugen - dynamisch vs. ?

Ein Thema von cltom · begonnen am 3. Dez 2021 · letzter Beitrag vom 4. Dez 2021
Antwort Antwort
Seite 1 von 2  1 2      
cltom

Registriert seit: 22. Sep 2005
221 Beiträge
 
Delphi 12 Athens
 
#1

Gruppen von Controls erzeugen - dynamisch vs. ?

  Alt 3. Dez 2021, 12:17
Hallo,

es sollen eine Reihe von gleichförmigen Controls erzeugt werden (30-50 mal eine Gruppe von rund 10 Komponenten: Edit-Felder, Comboboxen natürlich mit Inhalten, etc. das alles versehen mit Events.) Bis dato hab ich das mit dynamisch erzeugten Controls gelöst. Das klappt auch soweit, aber am Ende: so richtig elegant und bequem ist das nicht. Ich finde es schwierig, ohne FindComponent zu arbeiten und das ist bekanntermaßen empfindlich und langsam. Beim Erzeugen braucht es schon Regelwerk was die Eigenschaften der Controls angeht, Positionen, Abstände, etc. Wenn die Anzahl an diesen Komponenten verändert wird, geht das mit einer unbedeutenden aber merklichen Verzögerung einher, es ist relativ viel Aufwand, dass das klappt.

Kurz: so richtig ideal erscheint mir das nicht.

Was wären Alternativen?

Die Gruppe von Controls auf einen Frame packen und den dynamisch erzeugen? Doch einfach alle Design-Time erzeugen und einfach mit visible arbeiten? Oder gibt es noch andere elegante Methoden, Objekte zur Laufzeit zu erzeugen, die dann ohne Findcomponent auskommen?

Danke für Inspiration!

Geändert von cltom ( 3. Dez 2021 um 12:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.462 Beiträge
 
Delphi 12 Athens
 
#2

AW: Gruppen von Controls erzeugen - dynamisch vs. ?

  Alt 3. Dez 2021, 12:37
Dafür bietet sich die seit Delphi 10.4 enthaltene TControlList an. Für ältere Delphi-Versionen würde ich in der Tat den Frame-Ansatz in Betracht ziehen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
221 Beiträge
 
Delphi 12 Athens
 
#3

AW: Gruppen von Controls erzeugen - dynamisch vs. ?

  Alt 3. Dez 2021, 13:14
Dafür bietet sich die seit Delphi 10.4 enthaltene TControlList an. Für ältere Delphi-Versionen würde ich in der Tat den Frame-Ansatz in Betracht ziehen.
ok, sehr schön, 10.4 krieg ich hoffenlich bald mal (ich mach noch mit XE2 herum). Danke!
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#4

AW: Gruppen von Controls erzeugen - dynamisch vs. ?

  Alt 3. Dez 2021, 13:58
Wenn du schon die Controls dynamisch erzeugts, was spricht dagegen die erzeugten Instanzen einem Array zuzuweisen und über das Array auf die Werte der Controls zugreifen.


Delphi-Quellcode:

type
  TAutolackComponentRow = record
    Farbname:TEdit;
    Matt:TCheckbox;
    Preis:TEdit;
    end;


type
  TmyForm = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    fControlRows:Array[0..10] of TAutolackComponentRow;
  public
  end;


procedure TmyForm.FormCreate(Sender: TObject);
var
  a:Integer;
begin
  for a:=0 to 10 do
    begin
    fControlRows[a].Farbname := TEdit.Create(self)
    // parent, Position setzen etc
    fControlRows[a].Matt := TCheckbox.Create(self)
    // parent, Position setzen etc
    fControlRows[a].Preis := TEdit.Create(self)
    // parent, Position setzen etc
  end;
end;
Auf die entsprechende Komponente greifst du dann über das Array zu.


Delphi-Quellcode:

fControlRows[1].Farbname.text := 'Blau';
fControlRows[5].Matt.checked := true;
fControlRows[7].Preis.checked := '10,25';
for a:=0 to 10 do
  begin
    fControlRows[a].Preis.left := 30;
    fControlRows[a].Preis.top := 25 * a;
  end;
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de

Geändert von bernau ( 3. Dez 2021 um 14:02 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Gruppen von Controls erzeugen - dynamisch vs. ?

  Alt 3. Dez 2021, 14:03
Hi zusammen

Und was ist der Unterschied zu TObjectList, ausser dass diese Objekte verschiedener Vorfahren verwalten kann (TControl, TGraphicConrtol etc)?

Wenn du schon die Controls dynamisch erzeugts, was spricht dagegen die erzeugten Instanzen einem Array zuzuweisen und über das Array auf die Werte der Controls zugreifen.
Eigentlich spricht da nichts dagegen - ausser dass Listen mit weniger Verwaltungsaufwand erweitert werden können.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor ( 3. Dez 2021 um 14:11 Uhr)
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
221 Beiträge
 
Delphi 12 Athens
 
#6

AW: Gruppen von Controls erzeugen - dynamisch vs. ?

  Alt 3. Dez 2021, 14:27
Wenn du schon die Controls dynamisch erzeugts, was spricht dagegen die erzeugten Instanzen einem Array zuzuweisen und über das Array auf die Werte der Controls zugreifen.


Delphi-Quellcode:

type
  TAutolackComponentRow = record
    Farbname:TEdit;
    Matt:TCheckbox;
    Preis:TEdit;
    end;


type
  TmyForm = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    fControlRows:Array[0..10] of TAutolackComponentRow;
  public
  end;


procedure TmyForm.FormCreate(Sender: TObject);
var
  a:Integer;
begin
  for a:=0 to 10 do
    begin
    fControlRows[a].Farbname := TEdit.Create(self)
    // parent, Position setzen etc
    fControlRows[a].Matt := TCheckbox.Create(self)
    // parent, Position setzen etc
    fControlRows[a].Preis := TEdit.Create(self)
    // parent, Position setzen etc
  end;
end;
Auf die entsprechende Komponente greifst du dann über das Array zu.


Delphi-Quellcode:

fControlRows[1].Farbname.text := 'Blau';
fControlRows[5].Matt.checked := true;
fControlRows[7].Preis.checked := '10,25';
for a:=0 to 10 do
  begin
    fControlRows[a].Preis.left := 30;
    fControlRows[a].Preis.top := 25 * a;
  end;
schöner Gedanke. Ist mir ehrlich gesagt so nicht gekommen! Liesse sich einfach umsetzen und hat den Vorteil, dass ich eine ganze Gruppe ansprechen kann und ohne FindComponent auskomme. sehr schön, danke!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.462 Beiträge
 
Delphi 12 Athens
 
#7

AW: Gruppen von Controls erzeugen - dynamisch vs. ?

  Alt 3. Dez 2021, 14:46
Und was ist der Unterschied zu TObjectList, ausser dass diese Objekte verschiedener Vorfahren verwalten kann (TControl, TGraphicConrtol etc)?
Beziehst du dich damit auf meinen Vorschlag mit TControList? In dem Fall ist der Unterschied schon signifikant. Im Gegensatz tu TObjectList, was einfach eine Liste von TObject-Instanzen oder dessen Nachfahren ist, handelt es sich bei TControlList um ein visuelles Grid-ähnliches Control, in dem man ein Layout für seine Controls (TLabel, TEdit usw.) einmal entwirft und diese dann zur Laufzeit in der gewünschten Anzahl dargestellt werden und auch bedienbar sind.

https://docwiki.embarcadero.com/RADS...olList_Control
https://www.youtube.com/watch?v=PfHV9AhV2NM
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#8

AW: Gruppen von Controls erzeugen - dynamisch vs. ?

  Alt 3. Dez 2021, 14:50
Hi zusammen
Und was ist der Unterschied zu TObjectList, ausser dass diese Objekte verschiedener Vorfahren verwalten kann (TControl, TGraphicConrtol etc)?
Du musst nicht casten. Ausser du verwendest eine generische Objectliste. Dann müssen aber auch alle Controls gleich sein.

Wenn du schon die Controls dynamisch erzeugts, was spricht dagegen die erzeugten Instanzen einem Array zuzuweisen und über das Array auf die Werte der Controls zugreifen.
Eigentlich spricht da nichts dagegen - ausser dass Listen mit weniger Verwaltungsaufwand erweitert werden können.
Ich finde Arrays intuitiver.... In diesem Fall.

Wenn ich ein paar Edits zweidimensional auf einem Form plaziere, kann ich über ein zweidimensionales Edit einfacher drauf zugreifen.

Beim Erzeugen der Controls kann ich die Arraygröße abfragen. Dann muss ich nur noch das Array vergrößern und du und hast die Menge der Edits angepasst.

Ist aber letztendlich Geschmackssache.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de

Geändert von bernau ( 3. Dez 2021 um 14:53 Uhr)
  Mit Zitat antworten Zitat
cltom

Registriert seit: 22. Sep 2005
221 Beiträge
 
Delphi 12 Athens
 
#9

AW: Gruppen von Controls erzeugen - dynamisch vs. ?

  Alt 4. Dez 2021, 13:38
Danke Euch!

Hab das jetzt umgestellt auf die Array-Methode. Das passt hier tatsächlich ganz gut, weil auch die Daten in einem Array landen und das eine gewisse logische Parallele ergibt.

In jedem Fall macht es den Code so viel besser lesbar:

aus:
SomeClass.SomeArray.ValueTypeID[i] := (FindComponent('cmb_value_' + IntToStr(i) + '_TypeID') As TComboBox).ItemIndex;
wird:
SomeClass.SomeArray.ValueTypeID[i] := MyInputArray[i].ValueTypeID.ItemIndex;
deutlich schneller ist es außerdem.



Geändert von cltom ( 4. Dez 2021 um 14:24 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#10

AW: Gruppen von Controls erzeugen - dynamisch vs. ?

  Alt 4. Dez 2021, 14:26
Dafür bietet sich die seit Delphi 10.4 enthaltene TControlList an. Für ältere Delphi-Versionen würde ich in der Tat den Frame-Ansatz in Betracht ziehen.
ok, sehr schön, 10.4 krieg ich hoffenlich bald mal (ich mach noch mit XE2 herum). Danke!
Achtung: diese ControlList kann nur solche Controls enthalten, die kein Window Handle erzeugen.
Es ist also ein wenig eingeschränkt was da geht. Das ist aber deshalb so programmiert worden, damit
es sehr schnell geht und auch Listen mit tausenden Controls flüssig aufgebaut werden. Das Erzeugen
eines Window Handles dauert scheinbar geraume Zeit...
  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 18:48 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