Discussion:
Verhalten von Controls beim Resizing von Formularen
(zu alt für eine Antwort)
Peter Schütt
2016-05-23 10:16:53 UTC
Permalink
Hallo,
ich beschäftige mich zur Zeit mit dem Verhalten von Controls auf Formularen, wenn diese vom Benutzer vergrößert oder verkleinert werden.

Eine Möglichkeit ist natürlich align oder anchors, was mir aber an einer Stelle nicht reicht.

Was ich gerne hätte:
Gegeben sind drei Panel nebeneinander.
Wenn ich nun das Form vergrößere, dann soll das mittlere Panel 50% des zusätzlichen Platzes, das vordere 30% und das hintere 20% des zusätzlichen Platzes bekommen.

Wie macht man so etwas am Geeignetsten?

Ciao
Peter Schütt
Holger Schieferdecker
2016-05-23 10:41:53 UTC
Permalink
Post by Peter Schütt
Hallo,
ich beschäftige mich zur Zeit mit dem Verhalten von Controls auf Formularen, wenn diese vom Benutzer vergrößert oder verkleinert werden..
Eine Möglichkeit ist natürlich align oder anchors, was mir aber an einer Stelle nicht reicht.
Gegeben sind drei Panel nebeneinander.
Wenn ich nun das Form vergrößere, dann soll das mittlere Panel 50% des zusätzlichen Platzes, das vordere 30% und das hintere 20% des zusätzlichen Platzes bekommen.
Wie macht man so etwas am Geeignetsten?
Ob das am geeignetsten ist weiß ich nicht, mir fiele die Methode von
Hand ein (ungetestet):

Du kannst Dir die ursprüngliche Größe des Forms merken, evtl. im
OnCreate. Anschließend kann in OnResize die neue Größe mit der
originalen Größe verglichen werden und dann der zusätzliche Platz
entsprechend der Faktoren auf die Breite der Panels verteilt werden.
Dazu müßtest Du noch die passenden Positionen der Panels berechnen und
neu setzen. Also etwa

Panel2.Left:=Panel1.Left+Panel1.Width+Abstand;

Abzufangen wäre der Fall, daß die neue Formulargröße kleiner ist als die
Designgröße.

Diese Methode würde jeglichen Platz, der gegenüber der Designbreite
hinzukommt, entsprechend der Faktoren verteilen. Wenn das jedoch
jedesmal auf die zuletzt eingestellte Formularbreite und nicht auf die
Designbreite wirken soll, mußt Du im OnResize jedesmal die neue Breite
irgendwo merken. Dann kann es jedoch passieren, daß durch Rundungsfehler
nach vielen Größenänderungen die Verhältnisse nicht mehr passen.

HTH
Holger
Peter Schütt
2016-05-24 20:15:20 UTC
Permalink
Hallo,
von Hand geht ja immer.

Aber kann man das nicht im Designmodus so konfigurieren?

Ciao
Peter Schütt
--
www.pstt.de
Hans-Peter Diettrich
2016-05-25 06:32:31 UTC
Permalink
Post by Peter Schütt
Hallo,
von Hand geht ja immer.
Aber kann man das nicht im Designmodus so konfigurieren?
Geht das nicht mit Firemonkey?

Lazarus enthält einen Ansatz für adaptive Layouts, zu den tatsächlich
erzielbaren Effekten kann ich aber nichts sagen.

Das größte Problem bei adaptiven Layouts sind zu viele
Einstellmöglichkeiten, die zu Inkonsistenzen führen können. Der einzig
saubere Ansatz, den ich kenne, sind die Layout Manager von Java. Die
könnte man auch in Delphi in speziellen Container-Controls oder Frames
implementieren, die dann auch beim Design benutzt und konfiguriert
werden können. Wobei die Erstellung von Frames nicht so viele Kenntnisse
über die Erstellung von Custom-Controls erfordert, keine Installation in
der IDE usw.

Im einfachsten Fall schreibt man die Resize-Handler so, daß sie auch im
Design-Modus verwendbar sind. In Deinem Fall also ein Frame, das die zu
verändernden Panels enthält, und diese anhand einstellbarer Properties
an jede Größenänderung anpaßt.

DoDi

Loading...