Fenstergröße an Inhalt anpassen?

Rund um die LCL und andere Komponenten
Antworten
Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Fenstergröße an Inhalt anpassen?

Beitrag von Timm Thaler »

Ich habe ein Formularfenster für einen Einstellungen-Dialog.

Da packe ich schön die Elemente mit dem Ankereditor aneinander. Nun sind die Elemente unter Linux ja größer als unter Windows. Also muss ich das Fenster etwas größer machen, damit sie auch dann reinpassen.

Es wäre doch jetzt schön, wenn sich nicht nur die Elemente wie zum Beispiel das Panel an die Fensterbreite anpassen, sondern umgekehrt auch die Fensterhöhe an den Platz den die Elemente benötigen.

Oder im gegebenen Fall das Panel an die Höhe der enthaltenen Elemente, und das Fenster wiederum an die Höhe des Panels plus der Buttons darunter.

Geht das, so eine rückwärtsbezogene Verankerung übergeordneter Elemente an den Inhalt? Die absolute Größe des Dialogfensters ist mir ja egal, es soll nur alles reinpassen.
form1.png
form1.png (11.49 KiB) 1030 mal betrachtet

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Fenstergröße an Inhalt anpassen?

Beitrag von Timm Thaler »

Habs mal auf dem Raspi geöffnet - und natürlich passen die Elemente nicht ins Fenster.

Hmpf!
form2.png
form2.png (21.46 KiB) 1022 mal betrachtet

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

Re: Fenstergröße an Inhalt anpassen?

Beitrag von wp_xyz »

Eine generelle Anleitung ist schwer zu geben, weil jeder Fall wieder etwas anders ist. Und ganz automatisch geht es in schwierigen Fällen sowieso nicht, so dass man oft leichter vorwärts kommt, wenn man Annahmen machen kann.

Im beigefügten Beispiel habe ich dein Formular nachgebaut, wobei, weil ich nicht weiß, was auf der zweiten Seite ist, ich die drei Edits unten auf die zweite Seite verschoben habe. Und das sind die "Annahmen": die Controls auf der 1.Seite nehmen mehr Platz ein als die auf der zweiten, und das Label "Baudrate" auf der 1.Seite ist das längste.

Prinzipiell arbeite ich viel mit AutoSizing. Bei einem PageControl geht das nicht, daher habe die Controls auf der 1. Seite (der größeren) in ein Panel gesetzt. Alle Controls sind am Panel direkt oder indirekt verankert, so dass ich kein Control mehr mit der Maus verschieben kann (sonst fliegt es, wenn ich das AutoSize aktiviere, in die Ecke). Bei den Labels habe ich das längste ausgesucht und mit der linken Seite am Panel verankert, alle anderen Labels schließen rechtsbündig an diesem "Referenz-Label" an. Für den Fall dass in Realität, z.B. in der Übersetzung, ein anderes Label länger wird, habe ich links ausreichend (?) Platz gelassen (andernfalls müsste man zur Laufzeit die Labellängen ausmessen und das BorderSpacing anpassen, oder die Verankerung im Code neu setzen). Die Combobox des Referenzlabel sitzt hinter dem Referenzlabel verankert, usw...

Die Controls auf der zweiten Seite sind genauso verankert, allerdings reicht hier das Tabsheet als Anker aus, weil die zweite Seite ja die kleinere ist.

Dann setze ich das Panel auf AutoSize=true. Genauso das AutoSize des Formulars -- das macht im Entwurf noch keinen Unterschied. Wenn nun das Programm läuft, sieht alles gut aus, allerdings ändert sich die Größe des Formulars, wenn man auf die zweite Seite umschaltet.

Das kann man auf zwei Arten mit einem Handler für OnActivate oder OnShow lösen (aber nicht OnCreate, denn da ist das AutoSize noch nicht ausgeführt):
(1) Setze AutoSize zurück auf false: AutoSize ist ausgeführt, die Formulargröße passt also, so kann sich aber beim Umschalten auf Seite zwei nicht mehr ändern, weil AutoSize eben nicht mehr aktiv ist.
(2) Setze Constraints.MinWidth und Constraints.MinHeight (des Formulars) auf die Breite und Höhe des Formulars. Nun kann das Formular auch bei aktivem AutoSize nicht kleiner als die Constraints werden.

Andere Beispiele findest du in LazStats (https://sourceforge.net/p/lazarus-ccr/s ... /lazstats/), an dem ich gelegentlich arbeite.
Dateianhänge
form_autosize.zip
(3.02 KiB) 67-mal heruntergeladen

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Fenstergröße an Inhalt anpassen?

Beitrag von Timm Thaler »

Hm, interessante Ideen, da muss ich mal rumprobieren.

Antworten