You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:36:03