delphi - 带有默认弹出菜单项的delphi自定义组件
问题描述
我使用自定义列表视图组件,我需要它有一个弹出菜单项“将数据复制到剪贴板”。如果没有分配的弹出窗口,我创建一个并添加菜单项,如果已经分配了菜单,则将该项目添加到当前弹出窗口中。试图将代码放在构造函数中,但后来我意识到,popupmenu 仍然没有创建或关联到我的列表视图。那么知道何时创建我的默认项目吗?
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;
解决方案
覆盖虚拟TControl.DoContextPopup()
方法,例如:
type
TMyListView = class(TListView)
protected
...
procedure DoContextPopup(MousePos: TPoint; var Handled: Boolean); override;
...
end;
procedure TMyListView.DoContextPopup(MousePos: TPoint; var Handled: Boolean);
var
LPopupMenu: TPopupMenu;
LItem: TMenuItem;
function IsSameEvent(const E1, E2: TNotifyEvent): Boolean;
begin
Result := (TMethod(E1).Code = TMethod(E2).Code) and
(TMethod(E1).Data = TMethod(E2).Data);
end;
begin
inherited DoContextPopup(MousePos, Handled);
if Handled then Exit;
LPopupMenu := PopupMenu;
if not Assigned(LPopupMenu) then
begin
LPopupMenu := TPopupMenu.Create(Self);
PopupMenu := LPopupMenu;
end;
for I := 0 to LPopupMenu.Items.Count-1 do
begin
LItem := LPopupMenu.Items[I];
if IsSameEvent(LItem.OnClick, PopupMenuItemClick) then
Exit;
end;
LItem := TMenuItem.Create(Self);
LItem.Caption := 'Copy data to clipboard';
LItem.OnClick := PopupMenuItemClick;
LPopupMenu.Items.Add(LItem);
end;
推荐阅读
- mysql - 多选用户名SQL
- git - 想要在 Azure 构建管道中将 Git 提交详细信息设置为构建标题/定义
- callback - 有没有办法将多个变量、结构、小部件数据等传递给 Octave 中的回调函数?
- python - 如何告诉 Pipenv 基于操作系统忽略 Pipfile 中的包
- java - 从 Dataflow 中的 PubSub 读取:设置订阅名称
- node.js - 在 NPM 中,如何获取范围内的包列表?
- nfc - 如何将命令连接到从读卡器中移除 nfc 卡的操作?
- feature-selection - 检测时间序列中的交替模式
- php - 矩阵包含意外的空值
- python - 如何在 python 中重新排列一些时间序列?