2

我在表单上有一个按钮。
按钮名称是bmod2,而表单名称是fLayOut1

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

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

3 回答 3

7

要获取事件方法所属的当前表单的名称,您可以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;
于 2013-01-20T11:31:59.570 回答
1

如果您想要按钮父级的名称,上面的代码会为您完成,但如果您真的想要包含按钮的表单名称(可能按钮位于 GroupBox 或 Panel 等),您可以这样做:

var
  ParentClass: TWinControl;
begin
  ParentClass:= Button1.Parent;
  while not (ParentClass is TForm) do
    ParentClass := ParentClass.Parent;
  ShowMessage(Button1.Name);
  ShowMessage(ParentClass.Name);
end;
于 2013-01-20T12:20:08.847 回答
0

由于您不是在构建复合组件,因此您也可以使用 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 始终使表单成为所有控件的所有者,而不是它们的直接容器(它是它们的父级)。

于 2013-01-21T17:51:12.297 回答