Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 将TRadioButton设置为选中会导致OnClick事件_Delphi - Fatal编程技术网

Delphi 将TRadioButton设置为选中会导致OnClick事件

Delphi 将TRadioButton设置为选中会导致OnClick事件,delphi,Delphi,将TRadioButton设置为checked(按代码)会导致调用OnClick事件处理程序 如何识别用户是否正在通过GUI交互更改状态在以编程方式更改radiobutton状态时,可以禁用OnClick事件处理程序: mybox.Checked := true; mybox.Tag := 666; mybox.Checked :=true; mybox.Tag := 0; procedure myboxOnclick(Sender : TObject); begin if Tag

将TRadioButton设置为checked(按代码)会导致调用OnClick事件处理程序


如何识别用户是否正在通过GUI交互更改状态

在以编程方式更改radiobutton状态时,可以禁用OnClick事件处理程序:

mybox.Checked := true;
 mybox.Tag := 666; 
 mybox.Checked :=true; 
 mybox.Tag := 0;

procedure myboxOnclick(Sender : TObject);
begin
if Tag = 0 then
//Do your thing
end;

如果某个操作已连接到radiobutton,则可以改为设置该操作的checked属性。这也将防止触发OnClick事件。

TRadioButton
(like)提供了一个受保护的属性
单击禁用
,可以帮助您

我使用类帮助器添加所需的功能:

procedure TForm1.Button6Click(Sender: TObject);
var
  Save: TNotifyEvent;

begin
  Save:= RadioButton2.OnClick;
  RadioButton2.OnClick:= nil;
  RadioButton2.Checked:= not RadioButton2.Checked;
  RadioButton2.OnClick:= Save;
end;
对于VCL
TRadioButton
,使用以下类帮助程序:

RadioButton1.SetCheckedWithoutClick(False);

但是如果您使用的是动作,那么您可能使用的是动作的OnExecute事件,而不是控件的OnClick事件。当你更改动作的Checked属性时,OnExecute是否会被解雇?@Rob Kennedy:不,它不会-action.OnExecute和Button.OnClick在这里是同一事件。操作会暂时将radiobutton的受保护的“ClicksDisabled”属性设置为True,以防止在更改“Checked”属性时触发radiobutton的“OnClick”事件。理想情况下,您应该尝试一下。最后,如果
OnClick:=nil
OnClick:=Save之间存在任何更复杂的逻辑我赞成这种方法,但通常在表单类的私有部分使用标志,类似于“ChangingStuffRomCode:Boolean”。其思想是通常有多个单选按钮(以及其他类似的控件),在初始化表单时设置单个标志更简单。
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;