Entwickler-Ecke

Sonstiges (Delphi) - Shapes bis zur ClientBreite automatisch generieren lassen


Lernenochdazu - Do 07.07.22 10:16
Titel: Shapes bis zur ClientBreite automatisch generieren lassen
Guten Tag, habt ihr eine Idee wie ich Shapes bis zur ClientWidth automatisch 3 Reihen untereinander generieren lassen kann? Ein Shape soll eine Width von 100 haben und eine Height von 32. Zudem soll zwischen den Shapes 5 Abstand sein. LG


Th69 - Do 07.07.22 11:06

Hallo,

dazu einfach ein Array (oder eine TList o.ä.) anlegen und dann in zwei geschachtelten Schleifen (x, y) die Shape-Objekte erzeugen, s.a. Komponenten zur Laufzeit erzeugen [https://www.delphi-treff.de/tipps-tricks/komponenten/allgemein/komponenten-zur-laufzeit-erzeugen/].
Am besten dazu eine eigene Funktion CreateShape(TControl parent, int x, int y) erzeugen, welche ein neues Shape-Objekt erzeugt (daher ist der letzte Code im obigen Link auch nicht so optimal).

PS: Auf das Array (bzw. die Liste) kann verzichtet werden, wenn du danach im Code nicht mehr darauf zugreifen möchtest, sondern es nur zur statischen Anzeige benutzt wird.


jaenicke - Do 07.07.22 13:37

Dafür bietet sich TFlowPanel an. Darauf kannst du Komponenten legen bzw. zur Laufzeit drauf setzen und je nach Breite des Panels ordnet es diese automatisch an. Die Abstände kannst du realisieren, indem du bei den einzelnen Shapes die Eigenschaft Margin entsprechend der gewünschten Abstände setzt und AlignWithMargins auf True setzt.

Nebenbei weise ich mal auf mein altes Demo-Projekt hin, bei dem ich eine ähnliche Grafik ohne Shapes oder ähnliche Komponenten realisiert habe. Heute würde ich den Code sicherlich anders schreiben, aber vielleicht gibt es dir ja eine Idee: Periodensystem Xtreme 1.1 beta [https://entwickler-ecke.de/viewtopic.php?t=91534]

Moderiert von user profile iconTh69: URL-Titel hinzugefügt


Lernenochdazu - Fr 08.07.22 11:14

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Dafür bietet sich TFlowPanel an. Darauf kannst du Komponenten legen bzw. zur Laufzeit drauf setzen und je nach Breite des Panels ordnet es diese automatisch an. Die Abstände kannst du realisieren, indem du bei den einzelnen Shapes die Eigenschaft Margin entsprechend der gewünschten Abstände setzt und AlignWithMargins auf True setzt.


Ich habe ein TFlowPanel verwendet und darauf mein Shape gepackt. AliginWithMargins aktiviert und bei Margins die Abstände eingestellt. Allerdings sehe ich nach wie vor nur dieses eine Shape und es werden keine weiteren dynamisch generiert.


Th69 - Fr 08.07.22 13:16

Auch beim TFlowPanel [https://docwiki.embarcadero.com/Libraries/Sydney/de/Vcl.ExtCtrls.TFlowPanel] mußt du die Controls alle selber erzeugen und dann zuweisen (mittels Parent) - es sorgt nur für die passende Ausrichtung (entsprechend des FlowStyle [https://docwiki.embarcadero.com/Libraries/Sydney/de/Vcl.ExtCtrls.TCustomFlowPanel.FlowStyle]) - es kann ja nicht wissen, wieviele und mit welchen Eigenschaften diese erzeugt werden sollen.