【发布时间】:2019-09-06 13:22:01
【问题描述】:
我使用自定义列表视图组件,我需要它有一个弹出菜单项“将数据复制到剪贴板”。如果没有分配的弹出窗口,我创建一个并添加菜单项,如果已经分配了菜单,则将该项目添加到当前弹出窗口中。试图将代码放在构造函数中,但后来我意识到,弹出菜单仍未创建或关联到我的列表视图。那么知道何时创建我的默认项目吗?
constructor TMyListView.Create(AOwner: TComponent);
var
FpopupMenu: TPopupMenu;
begin
inherited;
.....
FPopUpMenuItem := TMenuItem.Create(self);
FPopUpMenuItem.Caption := 'Copy data to clipboard';
FPopUpMenuItem.OnClick := PopupMenuItemClick;
if assigned(PopupMenu) then begin
popupMenu.Items.Add(FPopUpMenuItem);
end
else begin
FpopupMenu := TPopupMenu.Create(self);
FpopupMenu.Items.Add(FPopUpMenuItem);
PopupMenu := FpopupMenu;
end;
...
end;
【问题讨论】:
-
你在做什么,当PopupMenu已经包含“复制数据到剪贴板”-
TMenuItem? -
无法复制。考虑minimal reproducible example。什么版本的德尔福?
-
如果开发者在运行时分配一个弹窗怎么办?您需要做的是公开一个可访问的方法,并将其余的留给组件用户。
-
在运行时工作,处理 wm_contextmenu,查看是否附加了弹出窗口,如果已附加,则查看“复制数据...”是否已附加,否则附加。如果没有附加,则创建一个弹出窗口。
-
不是直接处理
WM_CONTEXTMENU,而是覆盖虚拟的TControl.DoContextPopup()方法,甚至是TControl.GetPopupMenu()方法。
标签: delphi components popupmenu