Delphi 10.4.2嵌套创建子窗体时TControlList滚动条不显示如何解决
TControlList 嵌入父容器后无滚动条问题解决方案
1. 校验控件自适应配置
TControlList 滚动条的触发条件为内部所有条目总高度 > 控件自身 ClientHeight,嵌入场景下大概率为控件尺寸计算异常导致,按以下步骤排查:
- 确保承载业务模块的子窗体
BorderStyle属性设为bsNone,Align属性设为alClient;子窗体内的 TControlList 同样将Align设为alClient,保证控件尺寸随父容器实时自适应 - 在子窗体的
OnShow事件中添加代码,手动触发控件尺寸重新计算:
ControlList1.Realign; ControlList1.Invalidate; // 滚动条状态强制刷新 ControlList1.VertScrollBar.Range := ControlList1.CalculateTotalHeight; ControlList1.VertScrollBar.Visible := ControlList1.CalculateTotalHeight > ControlList1.ClientHeight;
2. 排查父容器属性冲突
主窗体承载子模块的 Panel 如果开启了滚动相关属性,会拦截 TControlList 的滚动逻辑:
- 确认 Panel 的
AutoScroll属性设为False,避免父容器接管滚动事件 - 确认 Panel 未嵌套其他带滚动属性的容器(如 TScrollBox),如有嵌套需求可将 TControlList 的
ParentBackground设为False规避绘制冲突
3. Delphi 10.4.2 版本专属BUG修复
Delphi 10.4.2 版本的 TControlList 存在已知缺陷:嵌入非主窗体场景下添加条目不会自动刷新滚动条状态,可通过类重写临时修复:
- 在业务模块单元的 interface 部分添加以下代码,无需修改原有控件声明,运行时会自动覆盖默认实现:
type TControlList = class(Vcl.ControlList.TControlList) protected procedure DoAddItem(Item: TControlListItem); override; end; procedure TControlList.DoAddItem(Item: TControlListItem); begin inherited; if HandleAllocated then begin VertScrollBar.Range := CalculateTotalHeight; VertScrollBar.Visible := CalculateTotalHeight > ClientHeight; end; end;
4. 数据集绑定场景额外校验
如果 TControlList 绑定了数据集类数据源,确保数据集激活后手动触发滚动条刷新:
DataSet1.Open; ControlList1.DataBind; ControlList1.VertScrollBar.Range := ControlList1.CalculateTotalHeight;
内容的提问来源于stack exchange,提问作者Rafael Xavier
相关产品推荐
相关产品推荐

