一、TStackPanel
TStackPanel(在 Delphi 中通常称为 TStackPanel 或类似的名称,具体可能因版本或第三方库而异)是一个用于在用户界面(UI)中按照特定方向堆叠子元素的布局容器。
虽然 Delphi 标准库中没有直接名为 TStackPanel 的控件,但类似的功能可以通过其他控件(如 TPanel 结合布局管理)或第三方库来实现。




用法
添加子元素:
将需要堆叠的子元素(如按钮、文本框等)添加到 TStackPanel 中。这些子元素将按照设定的方向(水平或垂直)进行堆叠。
设置堆叠方向:
通过属性(如 Orientation)设置堆叠的方向。通常有两个选项:水平(Horizontal)和垂直(Vertical)。
调整子元素大小:
子元素的大小可以根据需要自动调整,或者可以手动设置每个子元素的大小。
如果设置为自动调整,TStackPanel 将根据可用空间和堆叠方向来分配每个子元素的大小。
间距和填充:
可以设置子元素之间的间距以及子元素与 TStackPanel 边界之间的填充。这有助于创建更美观和易用的布局。
嵌套使用:
TStackPanel 可以嵌套使用,即在一个 TStackPanel 中放置另一个 TStackPanel,以实现更复杂的布局效果。
使用场景
简单布局:
当需要创建一个简单的布局结构时,TStackPanel 是一个很好的选择。例如,可以用它来创建按钮栏、导航菜单或工具栏等。
列表控件:
TStackPanel 可以用于列表控件中,如 ListBox 或 ComboBox 的弹出列表中。通过垂直堆叠子元素,可以创建清晰易读的列表项。
表单布局:
在创建表单时,TStackPanel 可以用于组织表单字段。通过水平或垂直堆叠字段和标签,可以创建一个结构化的表单布局。
动态内容:
当需要动态添加或删除子元素时,TStackPanel 可以自动调整布局以适应变化。
这使得它在处理动态内容(如用户输入、数据库查询结果等)时非常有用。
响应式设计:
通过设置子元素的大小调整策略和堆叠方向,TStackPanel 可以帮助实现响应式设计。
这意味着在不同大小的屏幕上,布局能够自动调整以保持最佳的用户体验。
需要注意的是,具体的 TStackPanel 实现(如果它是第三方库的一部分)可能会有所不同,因此在使用时应参考相应的文档和
示例代码。此外,Delphi 社区和在线资源也提供了丰富的信息和支持,可以帮助开发者更好地理解和使用 TStackPanel 或类似
的布局容器。
TStackPanel使用代码方式添加子控件:
使用正常添加子控件的代码方式你会发现所有子控件都重叠了在一起。原因是原生控件本身不包含堆叠布局所需的布局参数,
需要使用 TStackPanel 的子控件包装器 TStackPanelControlItem 作为中间层来添加,它承接了布局配置、层级管理、状态
控制等核心能力。

正常代码添加:
procedure TForm2.btn1Click(Sender: TObject);
var
TmpLabel: TLabel;
begin
TmpLabel := TLabel.Create(stckpnl2);
with TmpLabel do begin
Parent := stckpnl2;
AutoSize := False;
AlignWithMargins := True;
Height := 13;
Width := 300;
Margins.SetBounds(3, 3, 3, 3);
Caption := '测试1';
end;
TmpLabel := TLabel.Create(stckpnl2);
with TmpLabel do begin
Parent := stckpnl2;
AutoSize := False;
AlignWithMargins := True;
Height := 13;
Width := 300;
Margins.SetBounds(3, 3, 3, 3);
Caption := '测试2';
end;
end;
使用TStackPanelControlItem包装器代码添加:
procedure TForm2.btn2Click(Sender: TObject);
var
TmpLabel: TLabel;
begin
TmpLabel := TLabel.Create(stckpnl3);
TStackPanelControlItem(stckpnl3.ControlCollection.Add).Control := TmpLabel;
with TmpLabel do begin
Parent := stckpnl3;
AutoSize := False;
AlignWithMargins := True;
Height := 13;
Width := 300;
Margins.SetBounds(3, 3, 3, 3);
Caption := '测试1';
end;
TmpLabel := TLabel.Create(stckpnl3);
TStackPanelControlItem(stckpnl3.ControlCollection.Add).Control := TmpLabel;
with TmpLabel do begin
Parent := stckpnl3;
AutoSize := False;
AlignWithMargins := True;
Height := 13;
Width := 300;
Margins.SetBounds(3, 3, 3, 3);
Caption := '测试2';
end;
end;
二、TFlowPanel
三、TStackPanel 与 TFlowPanel有什么区别
TStackPanel和TFlowPanel都是用于布局和组织界面元素的控件,但它们在设计理念、布局方式和使用场景上存在显著的区别。
1、TStackPanel
设计理念:
TStackPanel是一种简单的布局容器,其核心设计理念是按照一定的顺序(水平或垂直)依次排列其子元素。
布局方式:
TStackPanel可以水平(Horizontal)或垂直(Vertical)排列子元素。
子元素按照添加的顺序进行堆叠,可以通过设置Orientation属性来指定子元素的排列方向。
使用场景:
适用于需要按照一定顺序排列子元素的场景,如按钮、文本框等控件的布局。
适用于创建简单的界面布局,如垂直或水平的按钮栏、导航菜单等。
2、TFlowPanel
设计理念:
TFlowPanel的设计理念是以流的方式自动调整大小和重新排列其子控件。
它允许控件在面板中自动按顺序排列,同时支持动态添加或删除元素。
布局方式:
TFlowPanel中的控件会自动按顺序进行排列,如果中间删除了某个控件,后面的控件会补上这个空缺。
支持控件的边距设置,通过调整边距可以控制控件之间的间距。
使用场景:
适用于需要动态添加或删除元素的场景,如审批流程展示、列表显示等。
适用于需要控件自动排列且布局较为灵活的界面设计。
3、区别总结
布局灵活性:
TStackPanel布局相对固定,子元素按照指定的方向依次排列。
TFlowPanel布局更加灵活,控件会自动调整位置和大小以适应面板的变化。
使用场景:
TStackPanel更适用于简单的、顺序性强的布局需求。
TFlowPanel更适用于动态的、布局灵活的界面设计。
控件排列:
TStackPanel中子元素按照添加的顺序进行堆叠,不支持自动换行。
TFlowPanel中的控件会自动按顺序排列,且支持在必要时进行换行。
综上所述,TStackPanel和TFlowPanel在布局方式、使用场景和控件排列等方面存在显著差异。开发者在选择使用哪种布局容器时,应根据具体的布局需求和设计目标来做出决策。




