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

Jer*_*dge 5 delphi resize splitter

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

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

  • 调整分割器大小时,不应允许用户将其向下拖动到底部控件的最小高度
  • 当窗体调整大小小于底部控件允许的大小时,它应自动调整顶部控件的高度以允许底部控件适合
  • 当我将底部控件的MinHeight约束设置为例如100时,在调整拆分器大小时,它会使窗体实际增长以适应底部控件,而不是阻止用户进一步调整大小.
  • 当我将分割器的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
Run Code Online (Sandbox Code Playgroud)

Ser*_*yuz 9

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

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

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

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


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

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

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

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

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


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

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


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

不要使用分离器MinSize.