如何在Delphi中识别发送者的Tobject类型?

8
我正在创建一个包含单选按钮组的对话框,作为首选项表单的一部分。我们的代码的一部分是,当打开首选项表单时,单选按钮组被点击,这会配置一些东西(例如,如果单选按钮是“关闭”,则隐藏了一堆配置信息)。
我想知道用户实际上何时点击单选按钮组,而不是在首选项对话框打开时自动触发。
因此,代码看起来像这样:
(open preferences)...
rgMyGroupClick(nil)

procedure  TdlgPreferences.rgMyGroupClick(Sender:TObject)

if sender <> nil then
begin
 //do something useful
end;

但是这段代码也会在打开首选项对话框时执行。我应该在哪里放置代码,才能确保只有用户实际点击按钮时才执行?

谢谢。

3个回答

19

测试发件人

您可以通过两种方式测试发件人:

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject)
begin
  if sender = RadioButton1 then //do action
  else if sender = RadioButton2 then ....

或者您可以测试发送方的类型。

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject)
begin
  if sender is TRadioButton then //do action
  else if sender is TForm then ....

is关键字用于测试对象是否属于某种类型。
请注意,测试if AObject is TObject总是为真,因为每个对象都是从TObject派生的。

更有趣的类型转换

is测试对象类型及其所有祖先的事实也可以用于其他目的:

procedure TdlgPreferences.rgMyGroupClick(Sender:TObject)
begin
  //TObject does not have a 'tag' property, but all TControls do...
  if (sender is TControl) and (TControl(Sender).Tag = 10) then ....

由于短路布尔运算,Delphi将首先检查(sender is TControl),只有在这个条件成立时才会继续执行。这使得后续的测试(TControl(Sender).Tag = 10)可以安全地使用。
如果您不理解TControl(Sender)构造,请阅读类型转换相关内容。
这里:http://delphi.about.com/od/delphitips2007/qt/is_as_cast.htm
和这里:http://delphi.about.com/od/oopindelphi/a/delphi_oop11.htm

10
如果我理解正确的话,您是在编程方式下点击单选按钮以设置表单的初始状态,但您有额外的代码在单击处理程序中,而您不想运行它?
如果是这样,您可以考虑将设置表单状态的代码移动到自己的方法中,然后从单选按钮单击事件以及从表单的initialize/show/create中调用它。
这样,您可以使用相同的代码从用户点击和编程方式设置表单到所需状态,而不需要在用户与对话框交互时执行任何额外的逻辑。或者也许我完全误解了您的问题...
类似于这样的代码:
// (open preferences)...
SetStateOfFormForSelectedGroup();

procedure TdlgPreferences.SetStateOfFormForSelectedGroup()
begin
  //do all setting of form for selected group here.
end;

procedure  TdlgPreferences.rgMyGroupClick(Sender:TObject)
begin
  SetStateOfFormForSelectedGroup();
  //do something useful
end;

是的,这是一个经典的重构案例。 - Andriy M

4

尝试一些函数或属性,如:

 Sender.classtype
 InheritedFrom()

注意:当使用ButtonClick(sender:TObject)的obj SENDER(例如)时, 点击按钮时的类为TButton。因此,可以使用TButton(Sender)来访问其属性或方法等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接