TreeView作为垂直菜单-如何获取关联菜单项的名称

TreeView作为垂直菜单-如何获取关联菜单项的名称,treeview,menuitem,delphi-10.2-tokyo,Treeview,Menuitem,Delphi 10.2 Tokyo,我正在将TMainMenu更改为TTreeView即垂直菜单。 我可以创建t视图,通过调用AddChildObject()我就有了节点。数据 我能够使用TMenuItem(TreeView1.Selected.Data)调用关联的MenuItem的OnClick事件。单击 如何获取关联菜单项的名称 我试过了 TMenuItem(TreeView.Selected.Data).Name,但Name显示为空字符串 过程TForm1.TreeViewClick(发送方:TObject); 开始 如果已

我正在将
TMainMenu
更改为
TTreeView
即垂直菜单。 我可以创建
t视图
,通过调用
AddChildObject()
我就有了
节点。数据

我能够使用
TMenuItem(TreeView1.Selected.Data)调用关联的
MenuItem的
OnClick
事件。单击

如何获取关联菜单项的名称

我试过了
TMenuItem(TreeView.Selected.Data).Name
,但
Name
显示为空字符串

过程TForm1.TreeViewClick(发送方:TObject);
开始
如果已分配((发送者为TTreeView)。选中),则
开始
TMenuItem((发件人为TTreeView).Selected.Data)。单击;
//这可以正常工作,即在节点上单击特定菜单项单击被称为
TMenuItem((发件人为TTreeView).Selected.Data).Name;
//名称为空,但菜单项名称不为空
结束;
结束;
填充树视图的代码:

过程CopyMenutTreeView(菜单:TMenu;视图:TTreeView);
过程附加项(anItem:TMenuItem;aParentNode:TTreeNode);
变量
节点:TTreeNode;
i:整数;
开始
对于i:=0到anItem.Count-1,请开始
节点:=aTreeView.Items.AddChildObject(
aParentNode,
anItem.Items[i].标题);
附加项(项目[i],节点);
结束;
结束;
开始
断言(赋值(aTreeView),‘无树视图’;
aTreeView.Items.BeginUpdate;
尝试
aTreeView.Items.Clear;
如果分配(阿门努),则
附加项(修正项,无);
aTreeView.FullExpand;
最后
aTreeView.Items.EndUpdate;
结束;{最后}
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
CopyMenutTreeView(主菜单1、树视图1);
结束;
此外,这里还有现有的
TMenuItem.OnClick

程序TForm1.MI_单击(发送方:TObject);
开始
//许多菜单项的通用代码
//基于菜单项名称创建表单的代码
CreateMIForm('Frm'+((发送方作为TMenuItem.Name));
结束;

我已修复了您的代码-
AddChildObject()
需要第三个参数。在
treeview1中单击
I使用了一个中间变量

使用Delphi 10.4.1进行测试

unittreewmenudomain;
接口
使用
Winapi.Windows、Winapi.Messages、System.SysUtils、System.Variants、System.Classes、Vcl.Graphics、,
Vcl.控件、Vcl.窗体、Vcl.对话框、Vcl.stdctrl、Vcl.菜单、Vcl.com控件;
类型
TForm1=类(TForm)
TreeView 1:TTreeView;
MainMenu1:TMainMenu;
文件1:TMenuItem;
结案1:TMenuItem;
出口1:TMenuItem;
按钮1:t按钮;
程序按钮1点击(发送方:ToObject);
程序关闭1点击(发送方:ToObject);
程序退出单击(发送方:ToObject);
过程树视图1单击(发送方:ToObject);
结束;
变量
表1:TForm1;
实施
{$R*.dfm}
过程CopyMenutTreeView(菜单:TMenu;视图:TTreeView);
过程附加项(anItem:TMenuItem;aParentNode:TTreeNode);
变量
节点:TTreeNode;
i:整数;
开始
对于i:=0到anItem.Count-1,请开始
节点:=aTreeView.Items.AddChildObject(
aParentNode,
anItem.Items[i]。标题,
项目[i]);
附加项(项目[i],节点);
结束;
结束;
开始
断言(赋值(aTreeView),‘无树视图’;
aTreeView.Items.BeginUpdate;
尝试
aTreeView.Items.Clear;
如果分配(阿门努),则
附加项(修正项,无);
aTreeView.FullExpand;
最后
aTreeView.Items.EndUpdate;
结束;{最后}
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
CopyMenutTreeView(主菜单1、树视图1);
结束;
程序TForm1.Close1Click(发送方:TObject);
开始
ShowMessage(“文件/关闭”);
结束;
程序TForm1.exit1单击(发送方:TObject);
开始
ShowMessage(“文件/退出”);
结束;
程序TForm1.TreeView1Click(发送方:TObject);
变量
菜单项:TMenuItem;
开始
如果已分配((发件人为TTreeView)。选中),则开始
MenuItem:=TMenuItem((发送者作为TTreeView)。已选择。数据);
菜单项。单击;
//这可以正常工作,即在节点上单击特定菜单项单击被称为
ShowMessage(MenuItem.Name);
结束;
结束;
结束。
DFM文件:

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 299
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  Menu = MainMenu1
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object TreeView1: TTreeView
    Left = 16
    Top = 24
    Width = 205
    Height = 257
    Indent = 19
    TabOrder = 0
    OnClick = TreeView1Click
  end
  object Button1: TButton
    Left = 280
    Top = 36
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
  object MainMenu1: TMainMenu
    Left = 364
    Top = 124
    object File1: TMenuItem
      Caption = '&File'
      object Close1: TMenuItem
        Caption = 'Close'
        OnClick = Close1Click
      end
      object Exit1: TMenuItem
        Caption = 'Exit'
        OnClick = Exit1Click
      end
    end
  end
end

请您编辑您的问题并添加您已经编写的相关代码,最好是在一个简单的basic程序中,再现您的困难。您在每个节点上添加了一个TMenuItem,对吗?您是在运行时创建的,对吗?你忘了给它起个名字了,不是吗?是的,我在运行时创建了ttreeview,每个menuitem都是treeview中的节点。我已经为它指定了onClick事件,并调用了关联的菜单项click。而你忘记给每个菜单项指定一个名称。。。无名称表示TMenuItem(Treeview.selected.data)。名称为空。请检查一下。请编辑您的问题以添加到目前为止的代码。链接:实际上已经有TMainMenu,它是Design time component,并且有名称为的menuitems。我将添加代码。非常感谢。