Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mehrere Objekte zur Laufzeit erzeugen (https://www.delphipraxis.net/189330-mehrere-objekte-zur-laufzeit-erzeugen.html)

fisipjm 1. Jun 2016 13:58

Delphi-Version: 5

Mehrere Objekte zur Laufzeit erzeugen
 
Hi,

ich stehe gerade vor folgendem Problem. Ich möchte mehrere Komponenten, um genau zu sein 2 Tedits, 1 TLable und 1 Tspeedbutton jeweils dynamisch zur Laufzeit erzeugen. Dazu habe ich jeweils ein Dynamisches Array erzeugt und lass mit die Teile per Parent auf ein Panel Mappen.

Irgendwie schein mein Delphi aber ein Problem damit zu haben wenn ich mehr als 3 Komponenten zur Laufzeit einbinden möchte. 2 gehen Problemlos, sobald ich die 3. Hinzunehmen spinnt mein Delphi und hängt sich auf. Kennt ihr das verhalten?
Anbei mal die 3 Prozeduren.

Delphi-Quellcode:
  private
    TabellenCombo : array of TComboBox;
    FeldCombo : array of TComboBox;
    dynDelBtn : Array of TSpeedbutton;

procedure TForm1.CreateNewDynDelButton;
begin
  inherited;
  SetLength(dynDelBtn, length(dynDelBtn)+1);
  dynDelBtn[length(dynDelBtn)]        := TSpeedbutton.Create(self);
  dynDelBtn[length(dynDelBtn)].Parent := self.DokExpPanel;
  dynDelBtn[length(dynDelBtn)].Name   := 'DynBtn'+inttostr(length(dynDelBtn));
  dynDelBtn[length(dynDelBtn)].Visible := True;
  dynDelBtn[length(dynDelBtn)].Left   := 5;
  dynDelBtn[length(dynDelBtn)].Top    := (dynDelBtn[length(dynDelBtn)].Height + 10) * length(dynDelBtn);
  dynDelBtn[length(dynDelBtn)].Width  := 20;
  dynDelBtn[length(dynDelBtn)].Height := 15;
  dynDelBtn[length(dynDelBtn)].Glyph  := nil;
  ImageList1.GetBitmap(0, dynDelBtn[length(dynDelBtn)].Glyph);
  dynDelBtn[length(dynDelBtn)].OnClick:=DeleteMeBtn;

end;

procedure TForm1.CreateNewTableCombo;
begin
  SetLength(TabellenCombo, length(TabellenCombo)+1);
  TabellenCombo[length(TabellenCombo)]:=TComboBox.Create(self);
  TabellenCombo[length(TabellenCombo)].Parent := self.DokExpPanel;
  TabellenCombo[length(TabellenCombo)].Name := 'Tabellen'+inttostr(length(TabellenCombo));
  TabellenCombo[length(TabellenCombo)].Left := 30;
  TabellenCombo[length(TabellenCombo)].Top := (TabellenCombo[length(TabellenCombo)].Height + 10) * length(TabellenCombo);
end;

procedure TForm1.CreateNewFieldCombo;
begin
  SetLength(FeldCombo, length(FeldCombo)+1);
  FeldCombo[length(FeldCombo)]:=TComboBox.Create(self);
  FeldCombo[length(FeldCombo)].Parent := Self.DokExpPanel;
  FeldCombo[length(FeldCombo)].Name := 'Felder'+inttostr(length(FeldCombo));
  FeldCombo[length(FeldCombo)].Left := 200;
  FeldCombo[length(FeldCombo)].Top := (FeldCombo[length(FeldCombo)].Height + 10) * length(FeldCombo);
end;
Danke im Voraus für die Hilfe :thumb:

franktron 1. Jun 2016 14:01

AW: Mehrere Objekte zur Laufzeit erzeugen
 
Auf den ersten Blick würde ich sage das das hier falsch ist

SetLength(dynDelBtn, length(dynDelBtn)+1);
dynDelBtn[length(dynDelBtn-1)] muss das heißen da das Array bei 0 anfängt

fisipjm 1. Jun 2016 14:08

AW: Mehrere Objekte zur Laufzeit erzeugen
 
Eieie ich glaub ich brauch ein Kaffee, Danke jetzt läufts :oops::thumb:

Headbucket 1. Jun 2016 14:14

AW: Mehrere Objekte zur Laufzeit erzeugen
 
Weiterhin sollte wohl in den meisten Fällen der Owner der Buttons das Panel sein:

Delphi-Quellcode:
dynDelBtn[length(dynDelBtn)-1] := TSpeedbutton.Create(self.DokExpPanel);


Ansonsten könnte es interessant werden, wenn das Panel vor dem Button zerstört wird. Vllt ist das aber auch extra von dir gewollt.

Grüße
Karsten

jaenicke 1. Jun 2016 14:15

AW: Mehrere Objekte zur Laufzeit erzeugen
 
Nebenbei:
Statt immer auf dynDelBtn[length(dynDelBtn)] zuzugreifen, sprich jedesmal einen Arrayzugriff zu machen, würde ich eine lokale Variable dafür nehmen. Das ist nicht nur sauberer, sondern auch schneller.
Es reicht ja den Inhalt der lokalen Variablen dann in das Array zu schreiben.

Luckie 1. Jun 2016 14:35

AW: Mehrere Objekte zur Laufzeit erzeugen
 
Und warum ein dynamisches Array? Du weißt doch genau, wie viele Elemente du brauchst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:17 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