2013-01-20 205 views
1

我在表格上有一个按钮。
的按钮名称为bmod2,而表格名称是fLayOut1获取当前表格的名称

当用户点击该按钮,我想保存当前表单和按钮名称的名称

procedure TFLayout1.bMod2Click(Sender: TObject); 
var 
azone : string; 
adept : string; 
begin 
azone := //forum name here 
adept := //button name here 
end; 

回答

5

要获取的名称事件方法所属的当前表单,您可以直接访问Name属性,也可以通过隐藏的Self对象访问属性,如下面代码的注释行中所示。

要获取已触发某个事件的组件的名称(在本例中为OnClick事件),可以使用常用的Sender参数(通常为引用该对象的引用)导致该事件触发。由于通过的Sender参数的基类为TObject类类型,它尚未具有Name属性,因此您需要将此对象转换为类型,即Name属性。它可能直接是绑定事件的对象的一种类型,或者如果您不确定该事件,或者绑定到事件的组件类型可能更多,则可以使用例如共同TComponent祖先类,其中Name属性定义(因为它显示在注释行下面的代码):

procedure TFLayout1.bMod2Click(Sender: TObject); 
var 
    azone: string; 
    adept: string; 
begin 
    azone := Name; 
    // azone := Self.Name; 
    adept := TButton(Sender).Name; 
    // adept := TComponent(Sender).Name; 
    ShowMessage('Form name: ' + azone + sLineBreak + 
    'Sender name: ' + adept); 
end; 
+1

完美而快速! –

+1

'Sender as TButton'在这里会比较好,因为如果'Sender'不是'TButton',它会引发运行时错误。 –

+0

@David:发件人作为TButton也会引发一个运行时异常,但是可以预见,并且每次发件人都不会是TButton。即使类型不对应于没有RTE的TButton,类型转换也可能通过。为避免RTE,应使用is运算符 – pf1957

1

如果你想按钮的父母的名字,上面的代码为你做,但如果你真想包含按钮形式的名称(也许该按钮上的GroupBox或面板或等),你可以做这样的:

var 
    ParentClass: TWinControl; 
begin 
    ParentClass:= Button1.Parent; 
    while not (ParentClass is TForm) do 
    ParentClass := ParentClass.Parent; 
    ShowMessage(Button1.Name); 
    ShowMessage(ParentClass.Name); 
end; 
+3

为什么上面的代码会给出按钮的父级名称?它会给出你正在运行其类的代码的任何对象的名称。无论如何,当你需要获取父表单时,你可以调用'GetParentForm'。 –

0

既然你不建设的复合材料部件,你可以使用t的所有者他TButton。

procedure TFLayout1.bMod2Click(Sender: TObject); 
var 
    azone: string; 
    adept: string; 
    btn: TButton; 
begin 
    btn := (Sender as TButton); 
    adept := btn.Name; 
    // adept := TComponent(Sender).Name; 
    // adept := (Sender as TButton).Name; 
    azone := btn.Owner.Name; 


    ShowMessage('Form name: ' + azone + sLineBreak + 
    'Sender name: ' + adept); 
end; 

IDE始终将窗体设置为所有控件的所有者,而不是它们的直接容器(它是它们的父级)。

+0

@SertacAkyuz:确实...代码已更正。 –