Drei ListBoxen anordnen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
navyseabear
Beiträge: 16
Registriert: So 21. Jan 2018, 09:27

Drei ListBoxen anordnen

Beitrag von navyseabear »

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

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Drei ListBoxen anordnen

Beitrag von fliegermichl »


wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Drei ListBoxen anordnen

Beitrag von wp_xyz »

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:
  • 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.
Übrigens: Die RadioButtons werden in einer TRadioGroup nach demselben Schema verteilt, wenn ihr AutoFill true ist. Mir kleben die RadioButtons immer etwas zu sehr am linken Rand - das kann man einfach ändern, wenn man das ChilrSizing.LeftRightSpacing der RadioGroup vergrößert.

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.

Antworten