我正在创建一个带有广播组对话框的代码,作为首选项表单的一部分。我们的部分代码是,当打开首选项表单时,单击无线电组,它会配置一堆东西(即如果单选按钮“关闭”则会隐藏一堆配置内容。)
我想要的是知道用户何时实际点击了广播组,而不是在首选项对话框打开时被触发。
所以代码看起来像这样:
(open preferences)...
rgMyGroupClick(nil)
procedure TdlgPreferences.rgMyGroupClick(Sender:TObject)
if sender <> nil then
begin
//do something useful
end;
但是,在打开首选项对话框时也会执行此代码。我应该放在那里只在用户实际点击按钮上的鼠标时执行?
由于
答案 0 :(得分:16)
测试发件人
您可以通过两种方式测试发件人:
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
始终为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 ....
由于short-circuit boolean evaluation,如果确实如此,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
答案 1 :(得分:9)
如果我正确理解你,那么你是以编程方式点击你的无线电组来设置表格的初始状态,但是在你不想运行的点击处理程序中有额外的代码?
如果是这种情况,您可能需要考虑删除将表单状态设置为自己的方法的代码,然后从无线电单击事件和表单的初始化/显示/创建中调用它。
通过这种方式,您可以使用相同的代码将表单设置为用户单击所需的状态,并以编程方式设置它,而无需在用户与对话框交互时执行任何额外的逻辑操作。或许我完全误解了你的问题......
类似的东西:
// (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;
答案 2 :(得分:3)
尝试一些功能或属性,如:
Sender.classtype
InheritedFrom()
注意:使用ButtonClick( sender:TObject )
的obj SENDER时(例如)
发件人=点击上的按钮类=&gt; TButton的
所以,TButton(Sender).properties
或方法等......