【发布时间】:2010-05-18 12:33:25
【问题描述】:
mybox.Checked := true;
将 TRAdioButton 设置为选中(通过代码)会导致调用 OnClick 事件处理程序。
如何识别用户是否通过 GUI 交互进行状态更改
【问题讨论】:
标签: delphi
mybox.Checked := true;
将 TRAdioButton 设置为选中(通过代码)会导致调用 OnClick 事件处理程序。
如何识别用户是否通过 GUI 交互进行状态更改
【问题讨论】:
标签: delphi
您可以在以编程方式更改单选按钮状态时将 OnClick 事件处理程序设为 nil:
procedure TForm1.Button6Click(Sender: TObject);
var
Save: TNotifyEvent;
begin
Save:= RadioButton2.OnClick;
RadioButton2.OnClick:= nil;
RadioButton2.Checked:= not RadioButton2.Checked;
RadioButton2.OnClick:= Save;
end;
【讨论】:
OnClick := nil 和OnClick := Save; 之间有任何更复杂的逻辑,您应该将其包装在try..finally 中
mybox.Tag := 666;
mybox.Checked :=true;
mybox.Tag := 0;
procedure myboxOnclick(Sender : TObject);
begin
if Tag = 0 then
//Do your thing
end;
【讨论】:
如果您有一个连接到单选按钮的操作,则可以改为设置该操作的选中属性。这也将阻止 OnClick 事件被触发。
【讨论】:
TRadioButton(如TCheckBox)提供了一个可以帮助您的受保护属性ClicksDisabled。
我使用类助手来添加所需的功能:
RadioButton1.SetCheckedWithoutClick(False);
为 VCL TRadioButton 使用以下类助手:
TRadioButtonHelper = class helper for TRadioButton
procedure SetCheckedWithoutClick(AChecked: Boolean);
end;
procedure TRadioButtonHelper.SetCheckedWithoutClick(AChecked: Boolean);
begin
ClicksDisabled := True;
try
Checked := AChecked;
finally
ClicksDisabled := False;
end;
end;
【讨论】: