4

我试图简单地创建一个弹出菜单(或上下文菜单),向其中添加一些项目,并将其显示在鼠标位置。我发现的所有示例都是使用设计器执行此操作的。我是从 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;
4

1 回答 1

12

在使用它们之前,您必须在 Delphi 中实际创建一个类的实例。以下代码创建一个弹出菜单,向其中添加一些项目(包括单击的事件处理程序),并将其分配给表单。请注意,您必须HandlePopupItemClick像我所做的那样自己声明(并编写)事件)。

在接口部分(添加Menususes子句):

type
  TForm1 = class(TForm)
    // Double-click the OnCreate in the Object Inspector Events tab. 
    // It will add this item.
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    // Add the next two lines yourself, then use Ctrl+C to
    // generate the empty HandlePopupItem handler
    FPopup: TPopupMenu;      
    procedure HandlePopupItem(Sender: TObject);
  public
    { Public declarations }
  end;

implementation

// The Object Inspector will generate the basic code for this; add the
// parts it doesn't add for you.
procedure TForm1.FormCreate(Sender: TObject);
var
  Item: TMenuItem;
  i: Integer;
begin
  FPopup := TPopupMenu.Create(Self);
  FPopup.AutoHotkeys := maManual;
  for i := 0 to 5 do
  begin
    Item := TMenuItem.Create(FPopup);
    Item.Caption := 'Item ' + IntToStr(i);
    Item.OnClick := HandlePopupItem;
    FPopup.Items.Add(Item);
  end;
  Self.PopupMenu := FPopup;
end;

// The Ctrl+C I described will generate the basic code for this;
// add the line between begin and end that it doesn't.
procedure TForm1.HandlePopupItem(Sender: TObject);
begin
  ShowMessage(TMenuItem(Sender).Caption);
end;

现在,我将留给您弄清楚如何完成其​​余的工作(创建并在特定位置显示它)。

于 2013-08-31T04:23:15.717 回答