Discussion:
Elemente je nach Fensterposition anders anordnen
(zu alt für eine Antwort)
Dietmar Braun
2014-11-07 23:42:16 UTC
Permalink
Hallo zusammen,

folgendes Problem:
Ich habe eine StayOnTop-Anwendung, die z.B. auf den oberen
Bildschirmbereich (von links nach rechts fuellend) oder auf den
Seitenbereich (von oben nach unten) gezogen werden kann.

Wie erreiche ich nun, dass die Elemente im Fenster je nach
Fensterposition und -groesse von links nach rechts oder von oben nach
unten angeordnet werden, so dass keine Scrollbars im Fenster erscheinen?

Wuenschenswert waere auch noch, dass (falls noch Platz rechts oder unten
ist), dieser mit einem Textfeld o.ae. gefuellt werden kann, in dem
weitere Informationen stehen.

Zusatzproblem: Per Knopfdruck sollen die Steuerelemente in einer anderen
Reihenfolge angeordnet werden (aber immer noch alle sichtbar!) -
zusaetzlich soll ein "Reset"-Button den Originalzustand wieder herstellen.

Ich hoffe, ich habe mich zu dieser spaeten Stunde noch einigermassen
verstaendlich ausgedrueckt ;) Und wenn Eure Tips auch unter Lazarus
funktionieren, umso besser, da es eigentlich eine Lazarus- und keine
Delphi-Anwendung ist.

Vielen Dank und gute Nacht,
Dietmar

---
This email has been checked for viruses by Avast antivirus software.
http://www.avast.com
Hans-Peter Diettrich
2014-11-08 11:41:50 UTC
Permalink
Post by Dietmar Braun
Hallo zusammen,
Ich habe eine StayOnTop-Anwendung, die z.B. auf den oberen
Bildschirmbereich (von links nach rechts fuellend) oder auf den
Seitenbereich (von oben nach unten) gezogen werden kann.
Wie erreiche ich nun, dass die Elemente im Fenster je nach
Fensterposition und -groesse von links nach rechts oder von oben nach
unten angeordnet werden, so dass keine Scrollbars im Fenster erscheinen?
Ungetestet: Das Alignment aller Elemente entsprechend ändern.
Zuerst die Größe des Fensters ändern, so daß es genügend Platz für das
größte (höchste bzw. breiteste) Element bietet.
Dann für Fenster oben: Element.Align=alLeft, links: Element.Align=alTop.

Falls das garnicht klappt, oder dabei die Reihenfolge
durcheinanderkommt: Layout-Liste verwenden (s.u.)

Alternativ: siehe ganz unten.
Post by Dietmar Braun
Wuenschenswert waere auch noch, dass (falls noch Platz rechts oder unten
ist), dieser mit einem Textfeld o.ae. gefuellt werden kann, in dem
weitere Informationen stehen.
Dafür TextFeld.Align=alClient setzen (beide Fälle).
Post by Dietmar Braun
Zusatzproblem: Per Knopfdruck sollen die Steuerelemente in einer anderen
Reihenfolge angeordnet werden (aber immer noch alle sichtbar!) -
zusaetzlich soll ein "Reset"-Button den Originalzustand wieder herstellen.
Kommt drauf an, wie die Reihenfolge definiert ist.
Bei einer Layout-Liste mit den Namen aller Elemente die jeweilige Liste
abklappern, die Elemente suchen (FindControl?) und Top bzw. Left auf den
Wert des Vorgängers + Delta setzen; Delta sollte größer als 0 und
kleiner als die Breite bzw. Höhe des Vorgängers sein, z.B. 5. Die genaue
Position sollte dann von Delphi ermittelt werden, so daß sich die
Elemente nicht überlappen und keine Lücken dazwischen auftreten.

Falls das nicht klappt: alles zu Fuß.
Die Elemente (mit Align=alNone) der Reihe nach auf die Position+Größe
ihres Vorgängers positionieren (Top+Height bzw. Left+Width). Am besten
die *nächste* Position merken, wenn ein Element positioniert wurde, dann
kann man mit (0,0) starten und in der Schleife NextTop oder NextLeft
entsprechend erhöhen.
Post by Dietmar Braun
Ich hoffe, ich habe mich zu dieser spaeten Stunde noch einigermassen
verstaendlich ausgedrueckt ;) Und wenn Eure Tips auch unter Lazarus
funktionieren, umso besser, da es eigentlich eine Lazarus- und keine
Delphi-Anwendung ist.
Verständlich soweit schon, Auslassungen mußt Du selber ausbügeln ;-)
(Z.B. wenn Deine Elemente nicht alle gleich groß sind, ggf. gedreht
werden müssen...)
Ob/wie das mit Lazarus funktioniert: ausprobieren!


Eine vollautomatische Anpassung könnte auch mit einem Tab-Control
funktionieren, das kann man dann auf Anzeige oben/unten/links/rechts
umstellen. Dabei sind die Elemente natürlich nur Tabs (Reiter), mit Text
und ggf. Icon, und für das Anklicken etc. muß man selbst ermitteln,
welcher Tab angeklickt wurde (ein OnClick Handler für alle Tabs). Der
Text wird dabei je nach Orientierung vertikal bzw. horizontal
ausgegeben, was zu Platzproblemen mit der kürzeren (links angeordeten)
Darstellung führen kann. Dann hat man aber immer noch die Wahl, die
Darstellung auf mehrere Zeilen bzw. Spalten verteilen zu lassen.

Oder mit einer ToolBar...

DoDi

Loading...