【发布时间】:2013-08-31 03:15:50
【问题描述】:
我试图简单地创建一个弹出菜单(或上下文菜单),向其中添加一些项目,然后在鼠标位置显示它。我发现的所有示例都是使用设计器执行此操作的。我是从 DLL 插件执行此操作的,因此没有表单/设计器。用户将单击主应用程序中的一个按钮,该按钮调用下面的execute 过程。我只是想出现类似于右键菜单的东西。
我的代码显然不起作用,但我希望有一个在运行时而不是设计时创建弹出菜单的示例。
procedure TPlugIn.Execute(AParameters : WideString);
var
pnt: TPoint;
PopupMenu1: TPopupMenu;
PopupMenuItem : TMenuItem;
begin
GetCursorPos(pnt);
PopupMenuItem.Caption := 'MenuItem1';
PopupMenu1.Items.Add(PopupMenuItem);
PopupMenuItem.Caption := 'MenuItem2';
PopupMenu1.Items.Add(PopupMenuItem);
PopupMenu1.Popup(pnt.X, pnt.Y);
end;
【问题讨论】:
-
@Warren 有一些静态类型的语言,声明一个变量就足以初始化它。 C++ 就是一个明显的例子。
-
@ike 预计插件 DLL 中的 GUI 代码会出现问题。
-
-1 表示“我的代码显然不起作用”。总是用逐字复制的错误消息来描述失败
-
“我的代码显然不起作用”。为什么,哦,为什么?好像你知道答案!那为什么要问呢?
-
@Rigel 这就是包存在的原因。使用 DLL 而不是插件的包意味着 DLL 对宿主可执行文件具有单独的 VCL 实例。典型的症状是类型标识不能按预期工作。例如,在上面的代码中,
TPopupMenu在 DLL 中是与主机中完全相同的命名类型不同的类型,因为存在不同的 VCL 实例。但是还有很多问题。如果包不是一个可行的选择,那么你需要做更多的工作来启用插件。
标签: delphi popup contextmenu