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

Delphi 10.4中如何为含多元素的弹出菜单添加滚动条?

Delphi 10.4 为大量元素的Popup Menu添加滚动条解决方案

当前Popup Menu因选项过多溢出屏幕,部分选项无法显示,现有动态添加菜单项的代码如下:

if Copy(trama, 1, 3) = 'ICO' then
begin
  Inc(histo_hq);
  j := 1;
  for k := 1 to Length(trama) do
  begin
    if (Copy(trama, k, 1) = '|') then
    begin
      deli[j] := k;
      Inc(j);
    end;
  end;

  try
    menuItem_auxstate := TMenuItem.Create(PM_new_status);

    menuItem_auxstate.OnClick := PopupItemClick;
    menuItem_auxstate.ImageIndex := -1;
    menuItem_auxstate.Caption := trim(Copy(trama, deli[2] + 1, deli[3] - deli[2] - 1));
    menuItem_auxstate.Tag := strtoint(trim(Copy(trama, deli[3] + 1, deli[4] - deli[3] - 1)));
    PM_new_status.Items.Add(menuItem_auxstate);

    new_agent_status[histo_hq, 1] := trim(Copy(trama, deli[1] + 1, deli[2] - deli[1] - 1));
    new_agent_status[histo_hq, 2] := trim(Copy(trama, deli[2] + 1, deli[3] - deli[2] - 1));
    new_agent_status[histo_hq, 3] := trim(Copy(trama, deli[3] + 1, deli[4] - deli[3] - 1));
  except
  end;

  Panel_top.Enabled := True;
end;

解决方案

方法1:利用VCL自带的自动滚动特性

Delphi 10.4及后续版本的TPopupMenu原生支持自动滚动,只需调整两个关键属性:

  • 将AutoScroll设为True(默认已开启,建议确认)
  • 设置MaxHeight限制菜单最大高度,超过该值自动显示滚动条。比如设置为屏幕工作区高度减去偏移量,避免菜单超出屏幕:
// 在所有菜单项添加完成后执行
PM_new_status.MaxHeight := Screen.WorkAreaHeight - 50;
PM_new_status.AutoScroll := True;

方法2:自定义滚动菜单(按需使用)

如果原生特性无法满足定制需求,可通过以下方式实现:

  • 用带滚动条的TPanel模拟菜单,将动态创建的TMenuItem替换为TButton或TLabel添加到面板,绑定点击事件
  • 使用适配Delphi 10.4的第三方滚动菜单组件

注意事项

  • 动态添加菜单项时,建议在所有项添加完成后再设置MaxHeight,避免频繁触发滚动逻辑
  • 保持菜单项高度一致,可提升滚动体验

内容的提问来源于stack exchange,提问作者jdoc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:17:35