如何在Delphi中识别发件人的Tobject类型?

Rob*_*Rob 7 delphi

我正在创建一个带有广播组对话框的代码,作为首选项表单的一部分.我们的代码的一部分是,当打开首选项窗体时,单击无线电组,它配置一堆东西(即如果单选按钮'关闭'则隐藏一堆配置内容).

我想要的是知道用户何时实际点击无线电组,而不是在首选项对话框打开时被触发.

所以代码看起来像这样:

(open preferences)...
rgMyGroupClick(nil)

procedure  TdlgPreferences.rgMyGroupClick(Sender:TObject)

if sender <> nil then
begin
 //do something useful
end;
Run Code Online (Sandbox Code Playgroud)

但是,在打开首选项对话框时也会执行此代码.我应该放在那里只在用户实际点击按钮上的鼠标时执行?

谢谢

Joh*_*ica 17

测试发件人

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

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

或者您可以测试发件人的类型.

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

is关键字测试是否一个对象是一个特定类型.
请注意,测试if AObject is TObject始终为true,因为每个对象都是从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 ....
Run Code Online (Sandbox Code Playgroud)

由于短路布尔评估, 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


Rus*_*est 9

如果我正确理解你,你是以编程方式点击你的无线电组来设置表格的初始状态,但你在单击处理程序中有额外的代码,你不想运行?

如果是这种情况,您可能需要考虑删除将表单状态设置为其自己的方法的代码,然后从无线电单击事件和表单的initialze/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;
Run Code Online (Sandbox Code Playgroud)