Frage

Eingeschlossen ist ein kleines Projekt, das mein Problem demonstriert. Ich habe ein TPageControl auf die Hauptform ausgerichtet. Bei jedem der zwei Tabsheets habe ich den Panels -Client ausgerichtet. Auf jedem dieser Panels habe ich 2 Subpanels und einen Splitter. Das LH-Panel und der Splitter sind links ausgerichtet, das RH-Panel-Client-ausgerichtete.

Grundsätzlich ist das Problem die Interaktion zwischen den 2 Registerkarten. Demonstrieren:

  • Führen Sie das Programm aus
  • Dehnen Sie die Hauptform horizontal. Panel 3 wird wachsen
  • Bewegen Sie den Splitter so weit nach rechts, wie er gehen wird. Panel 2 wird wachsen, Tafel 3 schrumpft auf seine 10-Pixel-Minwidth-Einschränkung.
  • Wählen Sie Registerkarte 2. Panel 5 ist wie entworfen. Tafel 6 wuchs, als das Hauptformular gestreckt wurde
  • Reduzieren Sie die Hauptformbreite auf ihre ursprüngliche Breite. Tafel 6 schrumpft zu stark (unerwünscht)
  • Klicken Sie auf die Registerkarte 1. Das Hauptformular erhöht sich wieder (unerwünscht).

OK, das Verhalten ist wahrscheinlich in Bezug auf die Regeln für ausgerichtete Panels erklärbar, aber kann jemand Verbesserungen des Betriebs vorschlagen?

unit Unit17;

interface

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

type
  TForm17 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Panel1: TPanel;
    Panel2: TPanel;
    Splitter1: TSplitter;
    Panel3: TPanel;
    Panel4: TPanel;
    Splitter2: TSplitter;
    Panel5: TPanel;
    Panel6: TPanel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form17: TForm17;

implementation

{$R *.dfm}

end.


object Form17: TForm17
  Left = 0
  Top = 0
  Caption = 'Form17'
  ClientHeight = 254
  ClientWidth = 314
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object PageControl1: TPageControl
    Left = 0
    Top = 0
    Width = 314
    Height = 254
    ActivePage = TabSheet1
    Align = alClient
    Constraints.MinWidth = 30
    TabOrder = 0
    ExplicitWidth = 480
    object TabSheet1: TTabSheet
      Caption = 'TabSheet1'
      ExplicitWidth = 281
      ExplicitHeight = 165
      object Panel1: TPanel
        Left = 0
        Top = 0
        Width = 306
        Height = 226
        Align = alClient
        Caption = 'Panel1'
        TabOrder = 0
        ExplicitWidth = 109
        ExplicitHeight = 165
        object Splitter1: TSplitter
          Left = 151
          Top = 1
          Width = 12
          Height = 224
          ExplicitLeft = 145
        end
        object Panel2: TPanel
          Left = 1
          Top = 1
          Width = 150
          Height = 224
          Align = alLeft
          Caption = 'Panel2'
          Constraints.MinWidth = 10
          TabOrder = 0
        end
        object Panel3: TPanel
          Left = 163
          Top = 1
          Width = 142
          Height = 224
          Align = alClient
          Caption = 'Panel3'
          Constraints.MinWidth = 10
          TabOrder = 1
          ExplicitLeft = 141
          ExplicitWidth = 330
        end
      end
    end
    object TabSheet2: TTabSheet
      Caption = 'TabSheet2'
      ImageIndex = 1
      ExplicitWidth = 281
      ExplicitHeight = 165
      object Panel4: TPanel
        Left = 0
        Top = 0
        Width = 306
        Height = 226
        Align = alClient
        Caption = 'Panel4'
        TabOrder = 0
        ExplicitWidth = 109
        ExplicitHeight = 165
        object Splitter2: TSplitter
          Left = 149
          Top = 1
          Width = 11
          Height = 224
          ExplicitLeft = 141
        end
        object Panel5: TPanel
          Left = 1
          Top = 1
          Width = 148
          Height = 224
          Align = alLeft
          Caption = 'Panel5'
          Constraints.MinWidth = 10
          TabOrder = 0
        end
        object Panel6: TPanel
          Left = 160
          Top = 1
          Width = 145
          Height = 224
          Align = alClient
          Caption = 'Panel6'
          Constraints.MinWidth = 10
          TabOrder = 1
          ExplicitLeft = 141
          ExplicitWidth = 139
          ExplicitHeight = 163
        end
      end
    end
  end
end 
War es hilfreich?

Lösung

Um das erwartete Verhalten zu erhalten, entfernen Sie die Einschränkungen (MinWidth) von deinen Panels. Diese Einstellungen sind derzeit unwirksam Wie auch immer, da Ihre Splitter eine haben MinSize von '30' (der Standard, nicht gespeichert).

bearbeiten (Antwort auf den Kommentar): Sie können nicht erwarten, dass die "Minwidth" -Erbeschränkung eines Steuerelements auf der rechten Seite eines Splitters die Größe der linken Steuerung eingestellt wird. Das ist nur logisch, die Einschränkung ist eine Eigenschaft für die von Ihnen festgelegte Kontrolle. Alles, was Sie erreichen, ist, dass das Formular das Schrumpfen leugnet, wenn Ihre Kontrolle bereits an der "Minwidth" liegt, daher die unerwünscht Verhalten, das Sie beobachten, dass das Formular beim Wechseln der Registerkarten größer wird. Was Sie wünschen, Sie müssen mit Code zu tun - wie Marjan in seiner Antwort sagte. Es sollte mehr als eine Möglichkeit geben, dies zu erreichen.

procedure TForm1.Panel3CanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  if NewWidth < Splitter1.MinSize then
    Panel2.Width := Panel2.Width - Splitter1.MinSize + NewWidth;
end;

Andere Tipps

Nicht unbedingt eine echte Antwort, sondern ein paar Bemerkungen:

  • Minsize voor ein alleft ausgerichteter Splitter bezieht sich auf die Kontrolle auf der linken und rechten Splitter. Ihr Panel 6 wird in der Tat geändert, dass sie (etwas mehr als) seine eigene Minwidth (10) anstelle der Minsize des Splitters (30) (30). Sie können dies leichter demonstrieren, indem Sie zwei links ausgerichtete Panels auf jeden Ihrer Paneele 2, 3, 5 und 6 hinzufügen und ihnen eine Breite von 10 und 20 und eine andere Farbe geben.

  • Wählen Sie nach der Reduzierung der Mainform -Breite erneut das Mainform (Yikes) und zeigt, dass nun Panel3 jetzt auch auf die min -Breite anstelle des Min -Splitters reduziert wurde.

Die Lösung für die Hauptform des Größens von der Größe? Keine Ahnung, aber sicherzustellen, dass die Minwidth Ihrer Panels mit der Minsize der Splitter synchronisiert ist, sollte das Schrumpfen entfernen. Und wie Sertac sagt, vermute ich, dass Sie sich einfach für das eine oder andere entscheiden müssen, aber nicht beides ...

Aktualisieren:

  • Setzen Sie die MINSIZE der Splitter auf 30 und setzen Sie die Minwidth der Panels auf 0, nimmt die Größenänderung der Mainform weg, reduziert jedoch die rechten Handplatten auf 0 Breite.

  • Das Einstellen der MINSIZE der Splitter auf 30 und das Einstellen der Minwidth der Panels auf 30, nimmt die Mindestbreitprobleme weg, aber dennoch die Größe der Größe der Größe.

  • Das Einstellen der Minwidth der Panels auf 30 und das Einstellen der MINSIZE der Splitter auf 1 (das Minimum) ermöglicht es, den Splitter nach rechts zu bewegen, und ändert die Hauptform von den Panels Minwidth, wenn Sie den Splitter freigeben. Es wird verhindern, dass Panel6 auf weniger als 30 reduziert wird, aber die Mainform ändert sich erneut, wenn Sie die Registerkarte 1 erneut auswählen.

Es scheint, dass Ihre beste Wahl darin besteht, sich auf die Minsize der Splitter zu verlassen und "manuell" zu verhindern, dass die rechten Handplatten auf weit reduziert werden, indem die Bewegung der Splitter einschränken, wenn sie nach rechts geht. Sie können dies im OnCanResize -Ereignis der Splitter tun.

Übrigens mit D2009

void __fastcall TFMain::SplitterCanResize(TObject *Sender, int &NewSize, bool &Accept)
{
  TSplitter *S = (TSplitter *)Sender;
  for (int i = 0; Accept && i < S->Parent->ControlCount; i++) if (S->Parent->Controls[i]->Constraints->MaxHeight && S->Parent->Controls[i]->Align == S->Align && NewSize >= S->Parent->Controls[i]->Constraints->MaxHeight * 2) Accept = false;
}

Wenn Sie den Splitter weit nach rechts bewegt haben, reduzierte Sie die Breite der Form, so dass sie schmaler wurde als die linke Tafel (und damit der Splitter als „außerhalb“ der Form), was sollte das Verhalten Ihrer Form Ihre Form haben in diesem Fall sein? Sie wurden nach Ihren Kriterien für wünschenswertes Verhalten gefragt, und alles, was ich in Ihrer bisherigen Antwort sehen kann, ist Ihr Verständnis von Ihrem Verständnis unwünschenswertes Verhalten.

Jetzt war ich ein paar Mal besorgt mit möglichen Nebenwirkungen der Größenänderung eines Formulars mit Panels und Splitern. Ich habe mich nicht sehr darauf untersucht und insbesondere noch nie zuvor über den automatischen Effekt wie in Ihren Situationen gewusst. Wie auch immer, um die meisten (wenn nicht solche) der möglichen Verhaltensart -Fakte zu verhindern, die ich in Betracht gezogen habe TScrollBox als Elternsteuerung für Panels und Splitter statt von TPanel.

Ich glaube, dies würde sich ändern, wenn die Größe des Formulars in der Größenänderung des Kundenbereichs der Scroll Box die Größenänderung geändert hat. Dies würde für mich gut funktionieren, wenn auch nur wenige kleine Projekte von mir, bei denen ich Splitter verwendet habe, wenn ich wie Sie Tabsheets verwendet habe. Ich kann jedoch nicht über Ihren Fall wissen. Und ich verstehe, dass dies eher eine Problemumgehung als eine Lösung für Ihr Problem ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top