在表单上,我有两个大控件,它们之间有一个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
答案 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
。