Delphi 10.4中如何为含多元素的弹出菜单添加滚动条?
当前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
相关产品推荐
相关产品推荐

