0

我在表单上有弹出菜单控件(grr,我很可能会将其设为动态 - 讨厌静态工具)。它有带有子菜单的项目。SubMenu 具有三个菜单项( TMenuItem 类)。

每当带有 SubMenu 的 Item 或 SubMenu Items 调用过程时,我需要通过在 if..then 语句中获取 Sender 参数来检查。

我用类型转换和超类操作尝试了不同的变化,但没有运气。我认为有可能是这样的:

if FindControl(MenuItemWithSubMenu.Handle) = TControl(Sender as TComponent).Parent then ...

但是,当然,正确的类型转换和命令..

任何想法表示赞赏。

社区请求的附加信息:

代码 itsef (如果我只是通过组件名称 prop 检查)看起来像这样:

procedure TForm1.xClick(Sender: TObject); // procedure that has attached onClick from    PopupActionBar1 Items
begin    
if ((TComponent(Sender).Name = 'Unloadresources1') or  // PopupActionBar1.Items[3]
     (TComponent(Sender).Name = 'VKPCache11')       or // PopupActionBar1.Items[3].Items[0]
     (TComponent(Sender).Name = 'VKPCache21')       or // PopupActionBar1.Items[3].Items[1]
     (TComponent(Sender).Name = 'AllCache31')       or // PopupActionBar1.Items[3].Items[2]
     (ActLoadVal = 2)) and (PopupActionBar1.Items[3].Caption = 'Delete VKP Cache') then begin .. end;
end;

问题在于,如果程序用户想要在 runetime 中添加/拖放/插入组件或控件或对象,这是一种弱方法并且需要额外的编码。通过这种方式,程序本身会自动在我的位置完成工作 - 知道该调用什么以及何时调用:)

在(静态)Form1 上是(静态)PopupActionBar1。它有四个项目。第四个项目有子菜单 - 三个项目。

带有子菜单项的第四项( PopupActionBar1.Items[3] )和三个子菜单项( PopupActionBar1.Items[3].Items[0 .. 2] OnClick 事件处理程序都设置为包含上述 If..Then 语句的过程。

任务 - 通过评估 Sender 参数并使用其 OOP 功能 - 检查是否已从 PopupActionBar1.Items[3] 菜单项或其子菜单项( PopupActionBar1.Items[3].Items[0] 或 PopupActionBar1.Items[3] .Items[1] 或 PopupActionBar1.Items[3].Items[2] )。

我尝试了各种语法...还尝试使用 TControl、TWinControl、TComponent 进行类型转换操作 ..(不使用 TObject 是它没有父级(不包括 OLE)..

4

1 回答 1

2

您不需要找到该项目,它已经是发件人。即你可以做

procedure TForm1.MyItem1Click(Sender: TObject);
begin
  if Sender = MyItem1 then
    [...]
  else if Sender = MyItem2 then

我通常使用 tag 属性来区分触发处理程序的 MenuItem。不优雅,但有效。

procedure TForm1.Item1Click(Sender: TObject);
begin
  case TMenuItem(Sender).Tag of
    0: [..];
    1: [..];
    [..]

必须记住将所有菜单项的 OnClick 事件设置为指向同一个处理程序。这是我不记得的事情,直到我看到点击一个没有效果..

于 2010-01-24T11:57:14.783 回答