Constraints, TScrollBox, TSplitter



  • Folgendes (vereinfachtes) Szenario:
    Ich habe eine TForm, dort sind zwei TPanel. Panel1 ist alClient, Panel2 alRight. Zwischen den beiden Panels ist ein TSplitter.
    Die Steuerelemente auf Panel 1 passen sich der Größe des Panels an, sollten aber eine minimale Größe nicht unterschreiten, da es sonst nicht mehr gut aussieht. Kann ich natürlich über die Constraints-Eigenschaft festlegen. Hab ich auch. Dann kann ich das Formular nicht kleiner machen. Mit Hilfe des Splitters geht das aber trotzdem. Nur ist es dann so, dass wenn die MinWidth von Panel1 erreicht ist, der Splitter verschwindet, Panel1 verdeckt wird und man die Größe nicht mehr ändern kann.

    Nun meine Fragen:

    1. Welche Möglichkeiten gibt es dafür zu sorgen, dass Panel1 ab einer bestimmten minimalen Größe seine Größe behält (die ja per alClient angepasst wird) und stattdessen Scrollbalken kriegt?
      (Es gibt die TScrollBox oder wie die heißt, ja, aber die hat bei alClient ja keine Auswirkung)

    2. Der TSplitter bietet nur eine Eigenschaft MinSize, die jedoch für beide Seiten gilt; also sowohl auf der linken und rechten Seite. Ich würde aber gerne dafür sorgen, dass Panel2 über den Splitter nur eine bestimmte minimale und auch maximale Größe haben darf.

    Hat jemand eine Idee?



  • Hast du schon mal AutoSnap= false (in Verbindung mit MinSize) probiert?

    Generell scheinen sich die Constraints mit den Align-Eigenschaften auszuschließen:

    Warning: Do not set up constraints that conflict with the value of the Align or Anchors property. When these properties conflict, the response of the control to resize attempts is not well-defined.



  • Ja AutoSnap hab ich sowieso auf false, weil mich das stört, wenn die Width ab der MinSize komplett auf 0 gesetzt wird, somit einschnappt und vermutlich auch den Benutzer verwirrt, wie das wiederherzustellen ist.
    Die Warnung habe ich auch gelesen, wobei da ja nicht genau steht, wann es Konflikte gibt, sondern nur, dass die keine Konflikte erzeugen dürfen, wann auch immer das der Fall sein sollte. Ist sehr unklar formuliert finde ich. Grundsätzlich funktionieren die Constraints mit alClient, soweit ich das feststellen konnte.

    Wenn man die Constraints jetzt mal gedanklich weglassen würde: Gibt es denn generell überhaupt eine Möglichkeit, dass man ein Fenster in der Größe ändert, sich das Panel bis zu einem bestimmten Punkt auch mit skaliert und ab diesem Punkt X dann die Größe des Panels bleibt und Scrollbalken gezeigt werden, wenn das Fenster weiter verkleinert wird? Gesehen hab ich das schon. Kann mir grad aber nicht vorstellen, wie das gehen könnte.

    Zur Vollständigkeit halber (falls es jmd anders mal braucht):
    Die Frage mit dem Splitter, also quasi MaxSize (Nr.2 vom obigen Post) habe ich jetzt übers OnCanResize-Ereignis ungefähr so gelöst:

    void __fastcall TSplitter::OnCanResize (System::TObject* Sender, int &NewSize, bool &Accept)
    {
      //NewSize bezieht sich auf das Steuerelement, welches die gleiche Ausrichtung (Align) hat, wie der Splitter  
      int newsize_panel1 = Form1->ClientWidth - NewSize - Splitter1->Width - x  // x = evtl. restliche sichtbare Steuerelemente
      if (newsize_panel1 < Panel1->Contraints->MinWidth)
      {
        Accept = false;
      }  
    }
    


  • Für Einblendung einer Scrollbar benutze (statt direkt dem Panel) eine TScrollBox und setze initial AutoScroll = true.



  • Ich habe jetzt das Panel in eine TScrollBox gesetzt, diese auf alClient und Align vom Panel auf alNone gesetzt. Im OnResize Event der ScrollBox passe ich die Height und Width vom Panel auf die Größe der ScrollBox nun manuell an, sofern die Größe über den Constraints des Panels liegt. Das funktioniert soweit und das Panel wird ab der minimalen Größe nun nicht mehr weiter skaliert, sondern kriegt ScrollBalken. Kann man das so machen oder ist das unklug?



  • Wenn es deine Anforderungen so erfüllt, ist das doch eine akzeptable Lösung.


Log in to reply