Problem mit Resize in Zusammenhang mit Align-Eigenschaft...



  • Das Problem ist etwas schwer zu erklären.

    Ausgangspunkt: Ich habe ein Fenster das im oberen Bereich eine Tabelle, im unteren Bereich Buttons hat. Die Buttons die tabellenbezogene Aktionen (z.B. Neu/Bearbeiten/Löschen) zulassen sind dabei links- die allgemeinen Aktionen (z.B. Schließen) sind rechts zentriert. Das Fenster ist resizible und die Buttons sollen ggf. in eine weitere Zeile umgebrochen werden, wenn der Platz nicht ausreicht (Dabei werden die Rechtszentrierten immer als ganzes umgebrochen).

    Ausgangspunkt: Fenster ohne nötigen Umbruch:
    
    /-Fenster-----------------------\
    |                               |
    | /-Tabelle(alClient)---------\ |
    | | Tabelle                   | |
    | |                           | |
    | |                           | |
    | |                           | |
    | |                           | |
    | |                           | |
    | \---------------------------/ |
    |                               |
    | /-Buttonleiste1(alBottom)---\ |
    | | [LB1] [LB2] [LB3]   [RB1] | |
    | \---------------------------/ |
    |                               |
    \-------------------------------/
    
    Ziel: Fenster nach horizontalen Resize:
    
    /-Fenster-----------------\
    |                         |
    | /-Tabelle(alClient)---\ |
    | | Tabelle             | |
    | |                     | |
    | |                     | |
    | \---------------------/ |
    |                         |
    | /-Buttonl.1(alBottom)-\ |
    | | [LB1] [LB2] [LB3]   | |
    | \---------------------/ |
    | /-Buttonl.2(alBottom)-\ |
    | |               [RB1] | |
    | \---------------------/ |
    |                         |
    \-------------------------/
    

    Der Knackpunkt ist, das Umbrechen funktioniert zwar, aber im Moment des Umbruchs (sprich wenn die 2te Leiste aus- oder eingeblendet wird) entsteht nachfolgend beschriebenes Darstellungsproblem, das erst nach einem weiteren Resize behoben wird:

    Beim Verkleinern wird zwar die 2te Leiste eingeblendet, aber über den unteren Bildschirmrand hinaus gezeichnet, beim Vergrößern wird die zweite Leiste zwar entfernt, aber es die Tabelle nicht vergrößert und der untere Bereich nicht verkleinert. Durch einfärben habe ich validiert das die Anpassung von dem Align nicht funktioniert.

    Fehlerfall: Ausblenden der zweiten Leiste (Vergrößern)
    (Weiteres Aufziehen korrigiert dies):
    
    /-Fenster-----------------------\
    |                               |
    | /-Tabelle(alClient)---------\ |
    | | Tabelle                   | |
    | |                           | |
    | |                           | |
    | \---------------------------/ |
    |                               |
    | /-Buttonleiste1(alBottom)---\ |
    | | [LB1] [LB2] [LB3]   [RB1] | |
    | \---------------------------/ |
    |                               |
    |                               |
    |                               |
    |                               |
    \-------------------------------/
    
    Fehlerfall: Einblenden der zweiten Leiste (Verkleinern)
    (Weiteres Verkleinern korrigiert dies):
    
    /-Fenster-----------------\
    |                         |
    | /-Tabelle(alClient)---\ |
    | | Tabelle             | |
    | |                     | |
    | |                     | |
    | |                     | |
    | |                     | |
    | |                     | |
    | \---------------------/ |
    |                         |
    | /-Buttonl.1(alBottom)-\ |
    | | [LB1] [LB2] [LB3]   | |
    | \---------------------/ |
    | /-Buttonl.2(alBottom)-\ |
    \-------------------------/
    

    Ich gehe davon aus, das dieses Problem damit zusammenhängt das ich das ein-/ausblenden erst im OnResize vornehme (Da ich die neue Breite benötige), und die Aligns der anderen Controls etc. nicht mehr zum tragen kommen. Ich habe aber noch nicht herausgefunden wie ich eine Neuberechnung in diesem Fall erzwinge (Repaint/Invalidate nützen scheinbar hier nicht).

    Hat jemand eine Idee wie man dies beheben könnte?



  • Nimm einfach ein TFlowPanel.



  • audacia schrieb:

    Nimm einfach ein TFlowPanel.

    Das erfüllt nicht das Kriterium das bestimmte Buttons rechts, und der Rest linkszentriert ist. Ansonsten hätte ich dies verwendet. Effektiv bräuchte ich eine Kombination aus dem Flowpanel mit einer Möglichkeit das letzte Control an der anderen Seite anzudocken.

    Wobei... Ich könnte ja ein Flowpanel für die Linkszentrierten Buttons nehmen, ein Dummypanel mit der Größe des Rechten Bereiches für die richtige Höhenberechnung hinzufügen, und den rechten Bereich auf das Resize von dem Flowpanel an der richtigen Stelle drüberblenden... Nicht unbedingt schön, könnte dafür aber klappen.



  • audacia schrieb:

    Nimm einfach ein TFlowPanel.

    Nein, TFlowPanel verhält sich sogar noch bescheidener. Unabhängig von den Einstellungen AutoSize/AutoWrap bekomme ich kein dynamischen Umbruch mit automatischer Höhenanpassung geliefert. Ich hätte erwartet, das bei gesetzten AutoWrap und AutoSize die Höhe sich abhängig von dem Umbruch anpasst. Bei gesetzten AutoSize wird aber nicht richtig umgebrochen, bei fehlenden AutoSize wird die Höhe aber niemals automatisch angepasst.

    Die Leiste soll aber nur genau so hoch sein, das alle Buttons darauf sichtbar sind, ungeachtet ob umgebrochen werden soll oder nicht. Ich habe zumindest keine Möglichkeit gefunden, dies mit dem FlowPanel zu lösen.


Anmelden zum Antworten