2012-12-20 5 views
5

Ich habe eine Form mit drei Hauptkomponenten:Wie verhindere ich, dass zwei nach unten gerichtete Steuerelemente von der umgekehrten Reihenfolge abweichen?

  1. A Flow die
  2. Ein zweiter Flow zum Client Richten eingestellt ist auf Bottom
  3. A StatusBar Satz Bottom ausrichten auszurichten.

Alles beginnt gut aussieht. Das FlowPanel, das nach unten ausgerichtet ist, wird jedoch ebenfalls auf AutoSize gesetzt. Es enthält ein Panel, das sich selbst zusammenklappen kann. Das interne Panel enthält zusammenfassende Informationen, die der Benutzer ausblenden kann. Dies verringert die Größe des FlowPanels auf eine sehr kleine Größe, ist jedoch nicht vollständig verschwunden. Es gibt immer noch eine Schaltfläche, über die der Benutzer das Übersichtsfenster erneut erweitern kann.

Das Problem tritt auf, wenn das Panel wieder expandiert wird und das FlowPanel wächst. Zu diesem Zeitpunkt ist die Reihenfolge der Statusleiste und des FlowPanels umgekehrt. Sie sind immer noch so eingestellt, dass sie unten liegen, aber jetzt ist die Statusleiste oberhalb meines FlowPanels.

Ich kann dies in einer Test-App ohne das Collapsing-Panel duplizieren, indem Sie einfach die Schaltfläche auf das Formular setzen, um die Höhe des unteren Flow-Panels zu sehen. Wenn die Höhe erhöht wird, ändert sich die Reihenfolge. Wenn es verringert wird, bleibt alles in der gleichen Reihenfolge. Der einzige Code in meiner Testform ist:

FlowPanel2.Height := FlowPanel2.Height * 2; 

ich auch diese getestet mit der Bodenplatte eine regelmäßige TPanel anstelle einem Flow mit den gleichen Ergebnissen zu sein.

Irgendwelche Ideen, warum dies geschieht und wie man es verhindert?

Moving Status bar image

+4

Eine ziemlich bekannte und irritierende Quirck von Ausrichtung und Autosize-Interaktion. Fügen Sie eine OnResize-Ereignisbehandlungsroutine hinzu, in der Sie den oberen Rand der Statusleiste auf die Höhe des Containers + 1 oder die obere + Höhe des Bedienfelds festlegen, dem es folgen soll. (Blick auf LOLCats, also ein Kommentar und keine Antwort). –

+0

@Mark: Hey, du hast ** meinen ** Hut auf!:-P –

Antwort

8

Meine Lösung:

  1. Platz ein Statusbar auf Form und richten Sie an den Client
  2. Platz ein Flow auf Container_Panel und ausrichten zu Bottom
  3. nach Unten
  4. Platz ein Panel (Container_Panel) auf Form und ausrichten
  5. Platz ein Flow auf Container_Panel und
an den Kunden ausrichten

Jetzt sollten Sie keine Probleme haben, mit dass mehr

+2

Eine weitere Option, die "Container_Panel" überflüssig macht, ist die Verwendung von "Align = alCustom", um die benutzerdefinierte Ausrichtung zu implementieren. Aber für Versionen, die 'alClient' nicht unterstützen, oder Sie wollen einfach keinen Code dafür schreiben, dann funktioniert der 'Container_Panel'-Ansatz gut, auf Kosten der Verwendung eines zusätzlichen' HWND'-Handles. –

7

ich dies manchmal haben. Meine Lösung ist, den oberen Teil des Steuerelements, das unten sein soll, auf einen "ausreichend großen" Wert zu setzen - so etwas wie OtherControl.Top + OtherControl.Height + 1 sollte funktionieren oder sogar MaxInt IIRC.

1

Wenn Sie bereit sind, etwas Geld auszugeben, würde ich DevExpress 'ExpreeLayoutControl (oder etwas Ähnliches) empfehlen. Es ist ein ausgezeichnetes Werkzeug sowohl für einfache als auch für komplexe Formulare und bietet neben der Behebung von Problemen wie dem Problem, das Sie erleben, eine Vielzahl weiterer Vorteile.

+0

-1. Dies ist keine Antwort auf die Frage. Es ist bestenfalls ein Kommentar, der eine kommerzielle Komponente als Alternative vorschlägt. (Es wäre als zusätzliche Information * nach * Ihrer Antwort in Ordnung, aber als eigenständiger Inhalt ist es keine Antwort.) –

+0

@KenWhite: Ich stimme zu, und ich war im Zweifel, ob ich es als Antwort posten sollte. Es würde, wie Sie sagen, besser als Kommentar passen. Aber ich habe beschlossen, es trotzdem zu posten, da es eine gute Lösung für Mark Elders 'Problem ist, auch wenn es keine Antwort auf seine Frage ist. –

+0

@KenWhite Ich denke, dass Sie Moderatoren manchmal ein bisschen zu hart mit Menschen sind. Ich denke, solange die Dinge nicht außer Kontrolle geraten, sollten Sie ein paar "weniger als perfekte" Kommentare oder Antworten akzeptieren, ohne dass Sie sofort korrigierende Kommentare schreiben müssen. Moderation ist eine gute Sache, und insgesamt denke ich, du machst einen guten Job, aber die Macht, ein Moderator/Administrator zu sein, sollte nicht missbraucht werden. – Elling

Verwandte Themen