Moin moin,
ich habe da ein Designproblem. Und zwar habe ich drei ListBoxen in einem Panel nebeneinander angeordnet. Listbox1 habe ich links, oben und unten an das Panel angdockt, Listbox3 rechts, oben und unten und Listbox2 in der Mitte, entsprechend oben und unten an dem Panel und links und rechts an Listbox1 und Listbox3. Sobald ich nun das Form vergrößere oder verkleinere, vergrößern und verkleinert sich auch entsprechend mein Panel und damit alle Listboxen in der Höhe so wie ich es möchte. In der Breite scheint es hingegen vollkommen willkürlich zu sein.
Was ich nun aber gerne möchte ist, dass meine drei Listboxen alle gleich breit und gleich hoch sind. Eben in Abhängigkeit von der Fernstergröße. Auch würde ich gerne eine minimale Größe definieren, welche nicht unterschritten werden darf um die Lesbarkeit zu gewährleisten.
Nun ist meine Frage, kann ich das alles schon in Lazarus im Vorfeld (wie z.B. im Qt Creator -> GUI-Designer mit den Spacern und so) zusammenklicken oder muss ich das später händisch im Code lösen? Im Moment stehe ich da echt auf dem Schlauch. Vor allen Dingen, da Design eh nicht eine meiner Stärken ist.
mfg
Tobias
Drei ListBoxen anordnen
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Drei ListBoxen anordnen
Schau doch mal hier https://wiki.freepascal.org/Autosize_/_Layout
Re: Drei ListBoxen anordnen
Am einfachsten geht das mit den ChildSizing-Einstellungen des Containers für die Listboxen, also des Panels. Klicke einfach die drei Listboxen ins Panel, selektiere das Panel und öffne die ChildSizing-Eigenschaft:
Ich finde, das ist eine unheimlich nützliche Eigenschaft um Controls gleichmäßig und autoskaliert anzuordnen. Leider habe ich es zu lange nicht bemerkt und deshalb viel unnötigen Code benötigt.
- Du hast drei Listboxen, also setze ControlsPerLine auf 3
- Um das Childsizing zu aktiveren setze Layout auf cclLeftToRightThenTopToBottom. Damit sind die drei Listboxen nun schon mal nebeneinander.
- Wenn EnlargeHorizontal auf crsHomogeneiousChildResize, werden alle drei Listboxen "homogen" auf die Breite des Containers verteilt. (Dasselbe passiert bei meinem Test mit crsScaleChild - ich dachte damit sollten die drei Controls proportional zur Ausgangsbreite skaliert werden.)
- Dasselbe auch mit EnlargeVertical.
- Fertig
- Wenn du horizontalen Abstand zwischen den Listboxen haben willst, gib ihn unter HorizontalSpacing ein. Linker und rechter Rand unter LeftRightSpacing. Analog für den oberen und unteren Rand TopBottomSpacing.
- Die minimale Breite jeder Listbox kannst du über Constraints.MinWidth festlegen.
Ich finde, das ist eine unheimlich nützliche Eigenschaft um Controls gleichmäßig und autoskaliert anzuordnen. Leider habe ich es zu lange nicht bemerkt und deshalb viel unnötigen Code benötigt.