使用分割器时如何在窗体中保持控件可见?

时间:2014-07-01 23:44:37

标签: delphi resize splitter

在表单上,​​我有两个大控件,它们之间有一个TSplitter。顶部的控件与顶部对齐,底部的控件与客户端对齐。因此,当我调整窗体大小时,顶部的控件保持相同的高度,而底部的控件则保持不变。然后它们之间的分离器基本上控制顶部控件的高度。

但是,当窗体调整到比顶部控件更小的高度时,底部控件将变为隐藏状态。我已经尝试使用约束来调整它的反应,但没有运气......

  • 调整分割器大小时,不应让用户将其向下拖动到底部控件的最小高度
  • 当窗体调整大小小于底部控件允许的大小时,它应自动调整顶部控件的高度以允许底部控件适合
  • 当我将底部控件的MinHeight约束设置为(例如100)时,在调整拆分器大小时,它会使窗体实际增长以适应底部控件,而不是阻止用户进一步调整大小。 / LI>
  • 当我将分割器的MinSize属性设置为例如100时,在调整分割器大小时,我得到非常异常的结果(顶部控件消失)并且仍然隐藏底部控件。

当分割器或表单调整而不更改表单大小时,如何确保底部控件始终可见?

DFM代码:

object Form1: TForm1
  Left = 310
  Top = 121
  Caption = 'Form1'
  ClientHeight = 374
  ClientWidth = 434
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Splitter1: TSplitter
    Left = 0
    Top = 129
    Width = 434
    Height = 7
    Cursor = crVSplit
    Align = alTop
    Beveled = True
  end
  object Panel1: TPanel
    Left = 0
    Top = 0
    Width = 434
    Height = 129
    Align = alTop
    Caption = 'Panel1'
    TabOrder = 0
    ExplicitLeft = 48
    ExplicitTop = 16
    ExplicitWidth = 313
  end
  object Panel2: TPanel
    Left = 0
    Top = 136
    Width = 434
    Height = 238
    Align = alClient
    Caption = 'Panel2'
    TabOrder = 1
    ExplicitLeft = 16
    ExplicitTop = 168
    ExplicitWidth = 369
    ExplicitHeight = 145
  end
end

1 个答案:

答案 0 :(得分:9)

  

调整分割器大小时,不应让用户将其向下拖动到底部控件的最小高度

为分割器的OnCanResize添加处理程序,以防止将其拖动到预定义的高度以下:

procedure TForm1.Splitter1CanResize(Sender: TObject; var NewSize: Integer;
  var Accept: Boolean);
begin
  Accept := NewSize <=
      ClientHeight - (100 + Splitter1.Height);
end;

(100是预定义的高度,用常量/属性替换它们......)


  

当窗体调整大小小于底部控件允许时,它   应自动调整顶部控件的高度以允许   底部控件适合

首先,您最好在表单上设置约束,以使所有控件始终具有正高度。否则你很可能会遇到对齐竞赛:panel1和splitter1在顶部对齐:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Constraints.MinHeight := Height - ClientHeight + 100 + Splitter1.Height + 1;
end;

其次,您可以检查表单是否调整大小导致底部面板的大小调整得比应该小,并采取纠正措施:

procedure TForm1.FormResize(Sender: TObject);
begin
  if Panel2.Height < 100 then
    Panel1.Height := ClientHeight - (100 + Splitter1.Height);
end;


  

当我将底部控件的MinHeight约束设置为例如100时,在调整拆分器大小时,它会使窗体实际增长以适应底部控件,而不是阻止用户进一步调整大小。

不要使用底部面板的约束。


  

当我将分割器的MinSize属性设置为例如100时,在调整分割器大小时,我得到非常不正常的结果(顶部控件)   消失了)仍然隐藏了底层控制。

请勿使用拆分器MinSize