Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi dynamisch erzeugte elemente in mehren zeilen (https://www.delphipraxis.net/162051-dynamisch-erzeugte-elemente-mehren-zeilen.html)

roland0 3. Aug 2011 15:41

dynamisch erzeugte elemente in mehren zeilen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

Delphi-Quellcode:
  SetLength(CaptionPanelArray, i);
    for i:=0 to 10 do
     begin
      //Panel erzeugen
      CaptionPanelArray[i] := TJvCaptionPanel.Create(Self);
      CaptionPanelArray[i].CaptionPosition := dptop;
      CaptionPanelArray[i].Height := 200;
      CaptionPanelArray[i].Width := 300;
      CaptionPanelArray[i].DragMode := dmAutomatic;
      CaptionPanelArray[i].Color := clwhite;
      CaptionPanelArray[i].Parent := Form1;
      CaptionPanelArray[i].Top := 10;
      CaptionPanelArray[i].Left := 10;
      CaptionPanelArray[i].left := 10 + ((CaptionPanelArray[i].width + 10) * i);
     end;
Mit diesem Code erzeuge ich dynamisch Panels, die später mit Kontaktinformationen gefüllt werden sollen.
Das Problem ist, dass ich es nicht hinbekomme mehrer Zeilen zu erzeugen, wenn der rechte Rand des Formulars erreicht ist, soll eine neue Zeile eröffnet werden. Wie z.B. in Outlook Kontakte. Momentan liegt alles in einer Zeile. (Siehe Bild im Anhang)
Die Anzahl der Panels ist später von der Anzahl der Datensätze abhängig. Labels zur Datenanzeigen in dem Panel werden schon erzeugt, sind aber hier in dem Code nicht zu sehen.
Hat jemand eine Idee?
Für die Hilfe und Unterstützung bedanke ich mich.

LG
Roland

sirius 3. Aug 2011 15:46

AW: dynamisch erzeugte elemente in mehren zeilen
 
Vom Design her würde ich eine art Layout-Komponente darunter legen (so wie TScrollbox). Ich weiss nicht, ob die neueren Delphis schon eine passende Komponente haben. Ansonsten musst du sie selber erstellen. Und diese Komponente legt dann fest, wo jedes Panel hinkommt.
Und die Positionsbestimmung ist nur ein klein wenig Mathematik..

DeddyH 3. Aug 2011 15:47

AW: dynamisch erzeugte elemente in mehren zeilen
 
Du kannst doch ausrechnen, ob Panel.Left + Panel.Width kleiner als Parent.ClientWidth ist. Wenn nicht, Panel.Top entsprechend erhöhen und Panel.Left zurücksetzen.

roland0 3. Aug 2011 15:54

AW: dynamisch erzeugte elemente in mehren zeilen
 
Danke für die schnellen Tipps.
Ich werde beides versuchen. Bei Nichtgelingen melde ich mich wieder.

LG
Roland

himitsu 3. Aug 2011 16:53

AW: dynamisch erzeugte elemente in mehren zeilen
 
In neueren Delphis sollen ja TFlowPanel und TGridPanel für solche Fälle gedacht sein,
lso hier speziell das TFlowPanel.


Warum setzt du eigentlich Left doppelt?

Delphi-Quellcode:
MaximaleAnzahlProZeile := {Parent}.ClientWidth div Breite;

...
xxx[i].Left := (i mod MaximaleAnzahlProZeile) * Breite;
xxx[i].Top := (i div MaximaleAnzahlProZeile) * Höhe;

roland0 3. Aug 2011 22:36

AW: dynamisch erzeugte elemente in mehren zeilen
 
Mit dem Flowpanel klappt es so wie ich es mir vorstelle.
Vielen Dank für diesen Tipp.

Leider hat das Flowpanel keine ScrollBar.

Kann ich dem Flowpanel eine Scrollbar zuweisen?

LG

blackfin 3. Aug 2011 22:50

AW: dynamisch erzeugte elemente in mehren zeilen
 
Zitat:

Leider hat das Flowpanel keine ScrollBar.
Kann ich dem Flowpanel eine Scrollbar zuweisen?
Packe das TFlowPanel einfach in eine TScrollBox, aber nicht mit alClient, sondern alNone! :-) (mit alClient scrollt das Flowpanel nicht!)
Die Höhe des Panels kannst du ja erstmal mit der Scrollbox gleichsetzen (heisst, die Scrollbars sind initial nicht sichtbar).

Wenn du aber dann deine Controls innerhalb des Flow-Panels hinzufügst, erweiterst du einfach nach Bedarf die Höhe des FlowPanels im Code.
Wie das?: Wenn du ein Control innerhalb des FlowPanels erzeugt hast, kannst du nach dem Positionieren über Control.Top die reale, vertikale Position im FlowPanel auslesen, die dadurch entsteht, dass das FlowPanel evtl. automatisch umgebrochen hat, und wenn dann Control.Top + Control.Height die Höhe des Flowpanels überschreitet, einfach die Höhe des FlowPanels um die fehlende Höhe erweitern.
Die Scrollbox fügt dann automatisch eine Scrollbar hinzu, sobald das FlowPanel die Höhe der Scrollbox überschreitet, und, voila, schon scrollt das Ding innerhalb der Scrollbox automatisch.

Oder du setzt von Anfang an eine feste, maximale Höhe des FlowPanels, die wesentlich höher ist als die der Scrollbox und die du mit den Controls nicht überschreiten wirst.
Das ist aber nicht so schön (scrollbarer Leerraum, wenn ungenutzte Höhe) und weniger dynamisch :-)

Das gleiche geht natürlich auch mit der Breite, aber das ist denke ich in deinem Fall nicht Sinn der Sache, denn dann wäre ja das Flowpanel überflüssig :-)

stahli 4. Aug 2011 09:35

AW: dynamisch erzeugte elemente in mehren zeilen
 
Du kannst auch gern meine ScrollBoxFlow nutzen :-)

roland0 4. Aug 2011 11:00

AW: dynamisch erzeugte elemente in mehren zeilen
 
Ich habe mir dein ScrolBoxFlow angesehen. Sieht gut aus.

Wie kann ich diese denn jetzt verfügbar machen?

Ich arbeite mit Delphi 2009.

LG

stahli 4. Aug 2011 11:32

AW: dynamisch erzeugte elemente in mehren zeilen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Oh, die pas war gar nicht dabei :oops:
Hier mal nachträglich als Anhang...


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.
Seite 1 von 2  1 2      

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