Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zur Laufzeit Comboboxen hinzufügen (https://www.delphipraxis.net/203408-zur-laufzeit-comboboxen-hinzufuegen.html)

KomischerKautz 14. Feb 2020 09:16

Delphi-Version: 7

Zur Laufzeit Comboboxen hinzufügen
 
Hallo,
ich würde gerne zur Laufzeit meines Programms per Buttonclick Comboboxen hinzufügen, dabei soll bei jedem weiteren Click eine neue Combobox unter der vorherigen angehängt werden.
Wie kann ich das am besten realisieren?

AuronTLG 14. Feb 2020 09:35

AW: Zur Laufzeit Comboboxen hinzufügen
 
Es gibt zwei Möglichkeiten.

1. Wenn, wie bei deinem anderen Thread, die Anzahl der möglichen Comboboxen limitiert ist, kannst du sie wie da schon vorher im Designermodus auf die Form legen und dann nach und nach sichtbar schalten.

2. Ist dies nicht der Fall, so musst du mit dynamischen Komponenten arbeiten, d.h. du kreierst die Comboboxen zur Laufzeit selbst.

Dies sähe z.B. so aus:

Code:
Procedure KreiereComboBox;
Var ACombobox : TComboBox;

Begin
AComboBox := TComboBox.Create(GroupBox1);
AComboBox.Parent := GroupBox1;
AComboBox.Height := 14;
AComboBox.Width := 50;
AComboBox.Left  := 5;
AComboBox.Top   := 10;

AComboBox.Items.Add('Bla');
AComboBox.Items.Add('Bla');
AComboBox.Items.Add('Bla');
AComboBox.ItemIndex := 0;

AComboBox.Name    := 'XYZComboBox';
AComboBox.OnChange := BlaBlaBlubChange;
End;
Im Prinzip kreierst du die ComboBox als Variable und modifizierst sie so wie du sie brauchst, also Items einfügen, Größe und Position festlegen, Ereignisse verknüpfen etc.

Willst du später auf diese ComboBoxen nochmal zugreifen, ist es am sinnvollsten, diese dynamisch erzeugten Comboboxen z.B. in einer Liste abzuspeichern, um einen einfachen Zugriff zu haben, da diese im Gegensatz zum im Designer erzeugten Komponenten nicht direkt ansprechbar sind.

Luckie 14. Feb 2020 10:58

AW: Zur Laufzeit Comboboxen hinzufügen
 
Man sollte aber noch den Parent setzen, damit sie auch gezeichnet wird und den Owner, damit der Owner das Zerstören übernimmt.

KodeZwerg 14. Feb 2020 11:53

AW: Zur Laufzeit Comboboxen hinzufügen
 
Hier ein konstrukt wie man evtl an solch eine sache rangehen könnte.
Nur im Notepad geschrieben, also ungetestet!
Delphi-Quellcode:
var
  Form1: TForm1;
  cbList: TList;

implementation

// wenn als click-event, dann sollte hier nur die cbList initialisiert werden und im click dann einfach adden
procedure TForm1.FormCreate(Sender: TObject);

var i: integer
   cb: TComboBox;  
begin
  cbList := TList.Create;
  for i := 0 to 9 do
  begin
    cb := TComboBox.Create(self);
    cb.Parent := self;
    cb.Top := (i * (cb.Height + 3));
    // weitere optionen setzen
    cbList.Add(cb);
  end;

  // als beispiel alle boxen mit text versehen:
  for i := 0 to cbList.Count-1 do
    TComboBox(cbList[i]).Text := Format('ComboBox %d', [i]);

end;
Ich hoffe es hilft, im close event halt die cbList durchiterieren und .Free ranpappen.

himitsu 14. Feb 2020 11:58

AW: Zur Laufzeit Comboboxen hinzufügen
 
Der trauchige Witz ist, dass in der VCL sich auch der Parent um die Freigabe kümmert. (vermutlich auch im FMX der selbe Mist, aber hab mich nicht getraut nachzusehn)

AuronTLG 14. Feb 2020 12:04

AW: Zur Laufzeit Comboboxen hinzufügen
 
Ach genau, Parent vergessen. Habs angepasst.
Ja, in FMX isses genauso, muss man auch Parent und Owner festlegen.
Mit dynamischen Komponenten zu arbeiten macht unglaublich viel Spaß. Deswegen greife ich für gewöhnlich auf TFrames zurück, wenn es nicht nur um einzelne Komponenten geht. Das macht die Sache deutlich angenehmer.

KodeZwerg 14. Feb 2020 12:30

AW: Zur Laufzeit Comboboxen hinzufügen
 
Zitat:

Zitat von Frühlingsrolle (Beitrag 1457504)
Zitat:

[...] Comboboxen hinzufügen, dabei soll bei jedem weiteren Click eine neue Combobox unter der vorherigen angehängt werden.
Noch erfüllt keins der Beispiele diese Anforderung. Das Prinzip ist aber ersichtlich.

Für meins dann so in etwa... bezeichner könnten falsch sein, immer noch nur notepad..
Delphi-Quellcode:
var
  Form1: TForm1;
  cbList: TList;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  cbList := TList.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var cb: TComboBox;
begin
  cb := TComboBox.Create(self);
  cb.Parent := self;
  cb.Top := (cbList.Count * (cb.Height + 3));
  // weitere eigenschaften setzen
  cbList.Add(cb);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i: integer;
begin
// einfach mal testen ob's nötig ist, ich möchte mich nicht festlegen
  for i := 0 to cbList.Count-1 do
    TComboBox(cbList[i]).Free;
  cbList.Free;
end;

KomischerKautz 14. Feb 2020 12:44

AW: Zur Laufzeit Comboboxen hinzufügen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1457508)
Zitat:

Zitat von Frühlingsrolle (Beitrag 1457504)
Zitat:

[...] Comboboxen hinzufügen, dabei soll bei jedem weiteren Click eine neue Combobox unter der vorherigen angehängt werden.
Noch erfüllt keins der Beispiele diese Anforderung. Das Prinzip ist aber ersichtlich.

Für meins dann so in etwa... bezeichner könnten falsch sein, immer noch nur notepad..
Delphi-Quellcode:
var
  Form1: TForm1;
  cbList: TList;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  cbList := TList.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var cb: TComboBox;
begin
  cb := TComboBox.Create(self);
  cb.Parent := self;
  cb.Top := (cbList.Count * (cb.Height + 3));
  // weitere eigenschaften setzen
  cbList.Add(cb);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i: integer;
begin
// einfach mal testen ob's nötig ist, ich möchte mich nicht festlegen
  for i := 0 to cbList.Count-1 do
    TComboBox(cbList[i]).Free;
  cbList.Free;
end;


Super! Das funktioniert einwandfrei. Vielen Dank für euere Hilfe!
Nun abschließend noch; den Inhalt von Comboboxen fülle ich ja normalerweise in der StringList der Combobox in den Properties. Das funktioniert hier wie es scheint nicht, da ja noch keine Combobox vorhanden ist, welche ich füllen kann.
Wie kann ich nun den Inhalt aller erzeugter Comboboxen vorbestimmen?

mkinzler 14. Feb 2020 13:06

AW: Zur Laufzeit Comboboxen hinzufügen
 
In dem du den Wert zur Laufzeit hinzufügst bzw. setzt. (ComboBox.Items)

DeddyH 14. Feb 2020 13:07

AW: Zur Laufzeit Comboboxen hinzufügen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1457508)
Zitat:

Zitat von Frühlingsrolle (Beitrag 1457504)
Zitat:

[...] Comboboxen hinzufügen, dabei soll bei jedem weiteren Click eine neue Combobox unter der vorherigen angehängt werden.
Noch erfüllt keins der Beispiele diese Anforderung. Das Prinzip ist aber ersichtlich.

Für meins dann so in etwa... bezeichner könnten falsch sein, immer noch nur notepad..
Delphi-Quellcode:
var
  Form1: TForm1;
  cbList: TList;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  cbList := TList.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var cb: TComboBox;
begin
  cb := TComboBox.Create(self);
  cb.Parent := self;
  cb.Top := (cbList.Count * (cb.Height + 3));
  // weitere eigenschaften setzen
  cbList.Add(cb);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i: integer;
begin
// einfach mal testen ob's nötig ist, ich möchte mich nicht festlegen
  for i := 0 to cbList.Count-1 do
    TComboBox(cbList[i]).Free;
  cbList.Free;
end;

Im FormCreate Liste erzeugen und im FormClose freigeben? Viel Spaß bei der Fehlersuche. Und wie schon mehrfach erwähnt muss man die Komponenten nicht selbst freigeben, wenn man ihnen einen Owner und/oder einen Parent zugewiesen hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:25 Uhr.
Seite 1 von 4  1 23     Letzte »    

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