AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)
Thema durchsuchen
Ansicht
Themen-Optionen

Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)

Ein Thema von Blitzschutz1 · begonnen am 7. Apr 2022 · letzter Beitrag vom 8. Apr 2022
Antwort Antwort
Blitzschutz1

Registriert seit: 2. Dez 2011
Ort: Vogtland (über Bayern)
25 Beiträge
 
Delphi 10.4 Sydney
 
#1

Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)

  Alt 7. Apr 2022, 20:03
Ich stehe gerade mächtig auf dem Schlauch...
Es werden 10 Button in einer schleife erzeugt, die in 5 Spalten und zwei Zeilen angeodnet werden sollen (es können aber auch 15 Button in 5 Spalten und drei Zeilen usw. sein). Das Button-Array ist als dynamisch deklariert. CONST_SOUNDBUTTONS ist derzeit 10.

Code sieht wie folgt aus:
Delphi-Quellcode:
var i, zeile, spalte: Integer;
    AbstandX, OffsetX: Integer;
    AbstandY, OffsetY: Integer;
begin

  SetLength(MyBtns, 0);

  AbstandX := 10; // Abstand der einzelnen Spalten
  OffsetX := 25; // Abstand der ersten Spalte von links

  AbstandY := 20; // Abstand der einzelnen Zeilen
  OffsetY := 100; // Abstand der ersten Zeile von oben

  zeile := 0;
  spalte := 0;

  for i := 0 to CONST_SOUNDBUTTONS - 1 do
  begin
    SetLength(MyBtns, Length(MyBtns) + 1);

    MyBtns[Length(MyBtns)-1] := TButton.Create(NIL);
    MyBtns[Length(MyBtns)-1].Parent := TabSheet2;
    MyBtns[Length(MyBtns)-1].Name := 'btnSound' + IntToStr(i);
    //MyBtns[Length(MyBtns)-1].Caption := 'Sound ' + IntToStr(i+1);

    // nur zum Ansehen der aktuellen Spalten- und Zeilenwerte
    MyBtns[Length(MyBtns)-1].Caption := IntToStr(spalte) + '|' +
                                        IntToStr(zeile);


    MyBtns[Length(MyBtns)-1].Height := 25;
    MyBtns[Length(MyBtns)-1].Width := 75;


    MyBtns[Length(MyBtns)-1].Left :=
      spalte * (AbstandX + MyBtns[Length(MyBtns)-1].Width) + OffsetX;

    MyBtns[Length(MyBtns)-1].Top :=
      zeile * (AbstandY + MyBtns[Length(MyBtns)-1].Height) + OffsetY;


    if ((i MOD 4 = 0) AND (i > 0)) then
    begin
      spalte := 0;
    end
    else
    begin
      Inc(spalte);
    end;

    if i MOD 5 = 0 then
    begin
      Inc(zeile);
    end;

  end;
end;
Meine Frage: Was mache ich falsch. Wo ist mein Denkfehler. Rauskommen tut derzeit siehe Bild...
Miniaturansicht angehängter Grafiken
button-anordnung.png  
Wenn die Klugen nachgeben geschieht das was die Dummen wollen!
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
439 Beiträge
 
Delphi 12 Athens
 
#2

AW: Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)

  Alt 7. Apr 2022, 20:14
Hmm ich würde alles in ein FlowPanel packen und damit hast du die beste Kontrolle über Ausrichtung und Größe der enthaltenen Buttons:

https://docwiki.embarcadero.com/Libr...rls.TFlowPanel
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#3

AW: Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)

  Alt 7. Apr 2022, 21:17
Du machst es dir unnötig kompliziert.
I ist schon der Index für das Array und das Array kann man am Anfang gleich auf die richtige Länge setzen.
Wenn man den gerade erzeugten Button in eine Variable legt, erspart man sich den ständigen Zugriff auf das Array.
Das erkennen einer neuen Zeile geht auch einfacher.
Delphi-Quellcode:
var i, zeile, spalte: Integer;
    AbstandX, OffsetX: Integer;
    AbstandY, OffsetY: Integer;
    Btn: TButton;
begin

  SetLength(MyBtns, CONST_SOUNDBUTTONS);

  AbstandX := 10; // Abstand der einzelnen Spalten
  OffsetX := 25; // Abstand der ersten Spalte von links

  AbstandY := 20; // Abstand der einzelnen Zeilen
  OffsetY := 100; // Abstand der ersten Zeile von oben

  zeile := 0;
  spalte := 0;

  for i := 0 to CONST_SOUNDBUTTONS - 1 do
  begin
    Btn := TButton.Create(Self);
    MyBtns[I] := Btn;
    Btn.Parent := TabSheet2;
    Btn.Name := 'btnSound' + IntToStr(i);
    //Btn.Caption := 'Sound ' + IntToStr(i+1);

    // nur zum Ansehen der aktuellen Spalten- und Zeilenwerte
    Btn.Caption := IntToStr(spalte) + '|' +
                                        IntToStr(zeile);

    Btn.Height := 25;
    Btn.Width := 75;


    Btn.Left :=
      spalte * (AbstandX + Btn.Width) + OffsetX;

    Btn.Top :=
      zeile * (AbstandY + Btn.Height) + OffsetY;
    Inc(Spalte);

    if Spalte = 5 then
    begin
      Spalte:= 0;
      Inc(Zeile);
    end;
  end;
end;
  Mit Zitat antworten Zitat
Blitzschutz1

Registriert seit: 2. Dez 2011
Ort: Vogtland (über Bayern)
25 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)

  Alt 7. Apr 2022, 21:38
Delphi-Quellcode:
 
    Inc(Spalte);

    if Spalte = 5 then
    begin
      Spalte:= 0;
      Inc(Zeile);
    end;
Genau!

Der Mensch ist ein komisches Wesen! Einmal auf dem falschen gedanklichen Weg und man kann stundenlang testen, denken und kommt doch nicht auf den rechten Pfad.

Danke!
Wenn die Klugen nachgeben geschieht das was die Dummen wollen!
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#5

AW: Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)

  Alt 8. Apr 2022, 09:31
Alternative:  for i := 1 to CONST_SOUNDBUTTONS do
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#6

AW: Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)

  Alt 8. Apr 2022, 11:05
Bessere Alternative:
for i := Low(MyBtns) to High(MyBtns) do
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#7

AW: Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)

  Alt 8. Apr 2022, 11:50
Wenn Low(MyBtns) gleich 0 ist, tritt das Problem aber wieder auf.
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
251 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)

  Alt 8. Apr 2022, 12:06
Aus Performance gründen Parent immer als letztes zuweisen, da das Fenster Handle dann erstellt wird.

Den Namen kann man leer lassen, die Zuweisung verursacht einen check auf Duplikate.
Wenn Du die buttons identifizieren willst, nimm lieber einen Tag.

Zitat:
Es werden 10 Button in einer schleife erzeugt, die in 5 Spalten und zwei Zeilen angeordnet werden sollen
Probier mal:
MyBtns[i].SetBounds(OffsetX + (i mod 5) * (75+XAbstand), OffsetY + (i div 5) * (25+YAbstand), 75, 25);

https://docwiki.embarcadero.com/Libr...trol.SetBounds
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF

Geändert von jziersch ( 8. Apr 2022 um 21:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#9

AW: Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)

  Alt 8. Apr 2022, 12:28
Wenn Low(MyBtns) gleich 0 ist, tritt das Problem aber wieder auf.
Bei dynamischen Arrays ist Low() immer 0. Nötigenfalls muss man Low() dann eben als Offset berücksichtigen. Ein dynamisches Array von 1 bis Length zu durchlaufen kann jedenfalls nicht die Lösung sein, es sei denn, man steht auf Fehlermeldungen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#10

AW: Anordnen von zur Laufzeit erzeugten Komponenten (hier Button)

  Alt 8. Apr 2022, 12:32
Meine Version funktioniert natürlich nur, wenn das Array von 1 bis n geht.

Bei 'nem Array, dass bei 0 beginnt, ist sie natürlich kontraproduktiv bzw. unsinnig.
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:58 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