Delphi xe10, 如何用右键菜单,得到控件的名字?

右键菜单程序:

var s:string;

showmessage(self.PopupMenu1.PopupComponent.name);//可以执行
s:=(self.PopupMenu1.PopupComponent.name);//错误,为什么?怎么办?
s:=((self.PopupMenu1.PopupComponent) as Tedit).name;//错误
//为什么?
//我希望得到类似s:='edit1'之类的效果,该怎么办?

s:=self.PopupMenu1.PopupComponent.GetNamePath;

howmessage(self.PopupMenu1.PopupComponent.name);
s:=(self.PopupMenu1.PopupComponent.name);

这2句没区别, 你要提供这些代码是在什么地方被执行的

var s:string;
s:=(self.PopupMenu1.PopupComponent.name);//这一句运行出现错误。
要用GetNamePath才能运行:
s:=self.PopupMenu1.PopupComponent.GetNamePath;
不明白,为什么不用GetName,简明扼要。加个Path很容易引起误解。

但下一句运行正确:
ShowMessage(self.PopupMenu1.PopupComponent.name);
ShowMessage(后面不是要求字符串吗?不知道为什么?
谁知道?

首先:=(self.PopupMenu1.PopupComponent.name);这句肯定没问题, 如果你报错, 那么先贴报错信息, 然后提供代码所处的位置(是在什么事件或者函数里调用的)

s:=((self.PopupMenu1.PopupComponent) as Tedit).name;
这个应该可以,但是前提是,选择的控件是TEdit类型的,你点的地方不是别的控件。
这是第一,第二,你控件如果是动态创建的,创建的时候有没有给name属性。

var s:string;

这句运行报错:s:=self.PopupMenu1.PopupComponent.name;
这句运行报错:s:=((self.PopupMenu1.PopupComponent) as Tedit).name;
这句运行正确:s:=self.PopupMenu1.PopupComponent.getnamepath;
这句运行正确:showmessage(self.PopupMenu1.PopupComponent.name);
运行环境:delphi xe 10
我的问题是:ShowMessage(后面不是要求字符串吗?既然是字符串,为什么showmessage(self.PopupMenu1.PopupComponent.name);正确但s:=self.PopupMenu1.PopupComponent.name;错误呢?