2 ListBoxen an Breite des Formulars anpassen

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 5253
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

2 ListBoxen an Breite des Formulars anpassen

Beitrag von Mathias »

Ich habe ein Formular, welches 2 ListBoxen nebeneinander enthält. Mit Ziel ist es, wen man zur Laufzeit die Grösse der Formulars ändert, das die Grösse der ListBoxen mit angepasst werden. Die Trennung der beiden Boxen sollte immer schön in der Mitte des Forms sein, inklusive eines Randes.

Ich habe es mal mit folgendem Murks probiert, was nicht mal immer funktioniert. Dies funktioniert nur, wen ich die Höhe des Forms verändere. Verändere ich nur die Breite, klappte es nicht.

Code: Alles auswählen

const
  Rand = 5;

procedure TForm1.ListBox1Resize(Sender: TObject);
begin
  ListBox1.Width := ClientWidth div 2 - Rand * 2;
  ListBox1.Left := Rand;
end;

procedure TForm1.ListBox2Resize(Sender: TObject);
begin
  ListBox2.Width := ClientWidth div 2 - Rand * 2;
  ListBox2.Left := ClientWidth div 2 + Rand;
end; 
Ich vermute mal, für dieses Problem gibt es eine elegante Lösung.
Dateianhänge
Bildschirmfoto vom 2022-03-21 16-50-33.png
Bildschirmfoto vom 2022-03-21 16-50-33.png (4.93 KiB) 437 mal betrachtet
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 9195
Registriert: Mo 11. Sep 2006, 19:01

Re: 2 ListBoxen an Breite des Formulars anpassen

Beitrag von theo »

Mach's halt bei Form Resize
Bei mir geht das so. Rest mit Anchors.

Code: Alles auswählen

procedure TForm1.FormResize(Sender: TObject);
begin
  ListBox1.Width := ClientWidth div 2 - 5 * 2;
  ListBox2.Width := ListBox1.Width;
  ListBox2.Left := ClientWidth div 2 + 5;   
end;      

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

Re: 2 ListBoxen an Breite des Formulars anpassen

Beitrag von wp_xyz »

Am einfachsten geht es mit der ChildSizing Property des Containers (lt. deinem Screenshot wäre das das Formular):
  • ControlsPerLine = 2
  • Layout = cclLeftToRightThenTopToBottom
  • EnlargeHorizontal = crsHomogeneousChildResize
  • EnlargeVertical = crsHomogeneousChildResize
  • HorizontalSapcing = 6 (oder was auch immer du als Rand um die Listboxen haben willst)
  • LeftRightSpacing = 6
  • TopBottomSpacing = 6
Wenn dir das ChildSizing zu unheimlich ist, kann man auch den Anker-Editor nehmen:
  • Zusätzlich zu den beiden Listboxen einen Spacer aufs Formular setzen. Höhe egal, Breite = Abstand der Listboxen. Shape = bsSpacer.
  • Mit dem Anker-Editor den Spacer horizontal zentrieren (mittlerer Button den linken Verankerungs-Gruppe)
  • Die linke Listbox links, oben und unten am Formular (oder dem Parent) verankern. Rechte Seite mit der linken Seite des Spacers verankern.
  • Die rechte Listbox rechts, oben und unten am Formular verankern. Linke Seite mit der rechten Seite des Spacers verankern.
  • Borderspacing der linken Listbox links, oben, unten auf den gewünschten Wert setzen
  • Borderspacing der rechten Listbox rechts, oben, unten analog.
  • Fertig.

Mathias
Beiträge: 5253
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: 2 ListBoxen an Breite des Formulars anpassen

Beitrag von Mathias »

theo hat geschrieben:
Mo 21. Mär 2022, 18:12
Mach's halt bei Form Resize
Bei mir geht das so. Rest mit Anchors.

Code: Alles auswählen

procedure TForm1.FormResize(Sender: TObject);
begin
  ListBox1.Width := ClientWidth div 2 - 5 * 2;
  ListBox2.Width := ListBox1.Width;
  ListBox2.Left := ClientWidth div 2 + 5;   
end;      
Logisch, auf diese Idee hätte ich selbst kommen können. Habe wohl vor lauter Wald die Bäume nicht gesehen.
Jetzt leuchtet mir es ein, wieso es bei der Höhenänderung funktioniert hat. Die Listboxen waren mit mit Achors oben und unten gekoppelt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 5253
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: 2 ListBoxen an Breite des Formulars anpassen

Beitrag von Mathias »

wp_xyz hat geschrieben:
Mo 21. Mär 2022, 18:16
Am einfachsten geht es mit der ChildSizing Property des Containers (lt. deinem Screenshot wäre das das Formular):
  • ControlsPerLine = 2
  • Layout = cclLeftToRightThenTopToBottom
  • EnlargeHorizontal = crsHomogeneousChildResize
  • EnlargeVertical = crsHomogeneousChildResize
  • HorizontalSapcing = 6 (oder was auch immer du als Rand um die Listboxen haben willst)
  • LeftRightSpacing = 6
  • TopBottomSpacing = 6
Wenn dir das ChildSizing zu unheimlich ist, kann man auch den Anker-Editor nehmen:
  • Zusätzlich zu den beiden Listboxen einen Spacer aufs Formular setzen. Höhe egal, Breite = Abstand der Listboxen. Shape = bsSpacer.
  • Mit dem Anker-Editor den Spacer horizontal zentrieren (mittlerer Button den linken Verankerungs-Gruppe)
  • Die linke Listbox links, oben und unten am Formular (oder dem Parent) verankern. Rechte Seite mit der linken Seite des Spacers verankern.
  • Die rechte Listbox rechts, oben und unten am Formular verankern. Linke Seite mit der rechten Seite des Spacers verankern.
  • Borderspacing der linken Listbox links, oben, unten auf den gewünschten Wert setzen
  • Borderspacing der rechten Listbox rechts, oben, unten analog.
  • Fertig.
Das probiere ich mal bei Gelegenheit aus.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten