Announcement

Collapse
No announcement yet.

Splitter via Code verschieben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Splitter via Code verschieben

    In einem Formular habe ich zwei Panels plaziert. Das linke Panel hat Align := alLeft, das rechte Align := alClient. Zwischen den beiden Panels ist ein Splitter mit Align := alLeft plaziert. Dadurch kann der Benutzer das vertikale Verhältnis zwischen den beiden Formularhälften selbst bestimmen. So weit so gut.

    Wenn der Benutzer die Breite des Formulars ändert, soll das Seitenverhältnis der beiden Hälften erhalten bleiben. Im OnResize-Ereignis des Formulars errechne ich also die Breite des linken Panels und weise dem Panel die neue Breite zu. Aufgrund der Align-Eigenschaften habe ich erwartet, daß sich daraufhin auch der Splitter und das rechte Panel neu positionieren. Tun sie aber nicht.
    Es hilft auch nicht die Left-Eigenschaft des Splitters und des rechten Panels zu ändern. Der Splitter bewegt sich einfach nicht. Auch ein Refresh, Repaint und Invalidate von allen beteiligten Komponenten hilft nicht.

    Wie bewege ich den Splitter dazu sich wieder an das linke Panel anzuschmiegen?

    Gruß

    Wolfgang

  • #2
    Splitter.Left := LeftPanel.Left + LeftPanel.Width.<br>
    Um den Splitter in die richtige Position zu bekommen muß LeftPanel.Width := X und Splitter.Left := LeftPanel.Left + LeftPanel.Width gesetzt werden.<br>

    Allerdings: wenn das Seitenverhältnis vom Linken zum Rechten Panel immer identisch sein soll dann gibt es immer nur eine Position für den Splitter zu jeder Größe des Linken Panels. D.h. den Splitter zu verschieben ist dann sinnlos da dadurch immer ein falsches Seitenverhältnis entstehen würde.

    Gruß Hage

    Comment


    • #3
      Das hier:
      <pre class="sourcecode"><code>
      <b>procedure</b> TForm1.FormResize(Sender: TObject);
      <b>begin</b>
      Panel1.Width := (Panel1.Width + Panel2.Width) <b>div</b> 2; <font color="#003399"><i>// Panel1 ist das linke</i></font>
      <b>end</b>;
      </code></pre>
      funktioniert bei mir -- die beiden Panels sind immer gleich groß. Zuweisung an Splitter1.Left wirkt auch bei mir nicht.
      <br>Ciao, Uli

      Comment


      • #4
        Kann nicht wirken, da LeftPanel.Width dessen Position bestimmt. Einzigst Splitter.Left := -1
        oder Splitter.Left := > LeftPanel.Width + LeftPanel.Left würde was bringen. Im ersten Falle würde der Spliter links neben das Leftpanel springen, und im zweiten Falle würde er immer rechts neben das LeftPanel und zwischen LeftPanel und RightPanel springen.


        Gruß Hage

        Comment


        • #5
          @ Hagen und Ulrich

          Vielen Dank für eure Antworten und gleichzeitig möchte um Entschuldigung bitten. Ich habe schlampig recherchiert. Es tut schon so, wie ich es vermutet hatte. Die Panels liegen in Wirklichkeit in einem TabSheet eines komplexen Formulars und beinhalten jeweils einen Frame. Ich wollte das ganze so einfach wie möglich schildern und habe deshalb diese Information weggelassen.
          Inzwischen habe ich das gemacht, was ich eigentlich auch schon machen hätte sollen, bevor ich den Thread geschrieben habe, nämlich das ganze mal in einem separaten Progrämmchen nachgestellt. Und siehe da, es tut genauso wie ich mir es vorstellte, daß es tun soll. Hier ist mein kleines Beispiel:

          <PRE>unit Unit1;

          interface

          uses
          Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
          ExtCtrls, ComCtrls, Unit2;

          type
          TForm1 = class(TForm)
          PageControl1: TPageControl;
          TabSheet1: TTabSheet;
          PanelLeft: TPanel;
          Splitter1: TSplitter;
          PanelRight: TPanel;
          procedure TabSheet1Resize(Sender: TObject);
          procedure FormCreate(Sender: TObject);
          procedure Splitter1Moved(Sender: TObject);
          private
          { Private-Deklarationen }
          Verhaeltnis: Double;
          public
          { Public-Deklarationen }
          end;

          var
          Form1: TForm1;

          implementation

          {$R *.DFM}

          procedure TForm1.TabSheet1Resize(Sender: TObject);
          begin
          PanelLeft.Width := Round(TabSheet1.Width * Verhaeltnis);
          end;

          procedure TForm1.FormCreate(Sender: TObject);
          begin
          Verhaeltnis := PanelLeft.Width / TabSheet1.Width;
          end;

          procedure TForm1.Splitter1Moved(Sender: TObject);
          begin
          Verhaeltnis := PanelLeft.Width / TabSheet1.Width;
          end;

          end.</PRE>

          Warum es in dem komplexen Formular nicht funktioniert kann ich hier zu Hause nicht nachvollziehen. Das Programm ist ein Client, der ohne seinen Server auf einer HP-UX Maschine nicht startet. Das Programm ist auch nicht von mir, ich arbeite erst seit 2 Wochen daran. Jetzt wo ich weiß, daß es prinzipiell funktioniert, werde ich die Ursache schon noch finden. Aber es ärgert mich doch, daß ich euch belästigt habe, obwohl ich es eigentlich selber ausprobieren hätte können.

          Gruß

          Wolfgan

          Comment


          • #6
            Halt,

            falls es irgend jemanden interessiert, wie das Ding arbeitet, dann fehlt noch die DFM-Datei:

            <PRE>object Form1: TForm1
            Left = 214
            Top = 165
            Width = 696
            Height = 480
            Caption = 'Form1'
            Color = clBtnFace
            Font.Charset = DEFAULT_CHARSET
            Font.Color = clWindowText
            Font.Height = -11
            Font.Name = 'MS Sans Serif'
            Font.Style = []
            OldCreateOrder = False
            OnCreate = FormCreate
            PixelsPerInch = 96
            TextHeight = 13
            object PageControl1: TPageControl
            Left = 0
            Top = 0
            Width = 688
            Height = 453
            ActivePage = TabSheet1
            Align = alClient
            TabOrder = 0
            object TabSheet1: TTabSheet
            Caption = 'TabSheet1'
            OnResize = TabSheet1Resize
            object Splitter1: TSplitter
            Left = 345
            Top = 0
            Width = 3
            Height = 425
            Cursor = crHSplit
            OnMoved = Splitter1Moved
            end
            object PanelLeft: TPanel
            Left = 0
            Top = 0
            Width = 345
            Height = 425
            Align = alLeft
            Caption = 'PanelLeft'
            TabOrder = 0
            end
            object PanelRight: TPanel
            Left = 348
            Top = 0
            Width = 332
            Height = 425
            Align = alClient
            Caption = 'PanelRight'
            TabOrder = 1
            end
            end
            end
            end</PRE>

            Noch'n Gruß

            Wolfgan

            Comment

            Working...
            X