11

应该很简单,但我看不到。

您可以找到右键单击的组件以显示弹出菜单:

PopupMenu1.PopupComponent

但是你如何找到包含 TMenuItem 的弹出菜单,然后点击该菜单?

将问题简化为示例:

我有一系列标签,每个标签都有不同的标题,并且我有一个分配给每个标签的 PopupMenu 属性的弹出菜单。

当有人右键单击其中一个标签并调出弹出菜单,然后单击 MenuItem1 时,我想编写代码:

procedure TForm1.MenuItem1Click(Sender: TObject);

begin
MsgBox (Format ('The label right-clicked has the caption %', [xxxx.Caption ])) ;
end ;

xxxx应该是什么?

已实施的答案

感谢两位受访者。我最终得到的是:

procedure TForm1.MenuItem1Click(Sender: TObject);

var
    AParentMenu : TMenu ;
    AComponent  : TComponent ;
    ALabel      : TLabel ;

begin
AParentMenu := TMenuItem (Sender).GetParentMenu ;
AComponent  := TPopupMenu (AParentMenu).PopupComponent ;
ALabel      := TLabel (AComponent) ;
MsgBox (Format ('The label right-clicked has the caption %', [ALabel.Caption ])) ;
end ;

它还询问涉及哪个 T​​MenuItem,因此给了我一段代码,我可以在修改较少的情况下放入其他 OnClick 处理程序。

4

2 回答 2

10

我对你的问题有点困惑,但既然你已经排除了其他一切,我只能想象你正在寻找TMenuItem.GetParentMenu

于 2011-05-28T10:10:18.910 回答
8
procedure TForm1.MenuItem1Click(Sender: TObject);
var pop:TPopupMenu;
    lbl:TLabel;
begin
  // Firstly get parent TPopupMenu (needs casting from TMenu) 
  pop:= TPopupMenu(MenuItem1.GetParentMenu()); 
  // pop.PopupComponent is the "source" control, just cast it to Tlabel
  lbl:= TLabel(pop.PopupComponent);            

  ShowMessage(Format('The label right-clicked has the caption %s',[lbl.Caption]));
end;
于 2011-05-28T10:57:20.543 回答