我在表单上有弹出菜单控件(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)..