【问题标题】:Setting TRadioButton to checked causes OnClick event将 TRAdioButton 设置为选中会导致 OnClick 事件
【发布时间】:2010-05-18 12:33:25
【问题描述】:
mybox.Checked := true;

将 TRAdioButton 设置为选中(通过代码)会导致调用 OnClick 事件处理程序。

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

【问题讨论】:

    标签: delphi


    【解决方案1】:

    您可以在以编程方式更改单选按钮状态时将 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 := nilOnClick := Save; 之间有任何更复杂的逻辑,您应该将其包装在try..finally 中
    【解决方案2】:
     mybox.Tag := 666; 
     mybox.Checked :=true; 
     mybox.Tag := 0;
    
    procedure myboxOnclick(Sender : TObject);
    begin
    if Tag = 0 then
    //Do your thing
    end;
    

    【讨论】:

    • 我喜欢这种方法,但通常在表单类的私有部分使用一个标志,类似于“ChangingStuffRomCode:Boolean”。这个想法是通常有多个单选按钮(和其他类似的控件),并且在初始化表单时设置一个标志更简单。
    【解决方案3】:

    如果您有一个连接到单选按钮的操作,则可以改为设置该操作的选中属性。这也将阻止 OnClick 事件被触发。

    【讨论】:

    • 但是如果你使用动作,你可能使用的是动作的 OnExecute 事件,而不是控件的 OnClick 事件。更改操作的 Checked 属性时是否会触发 OnExecute?
    • @Rob Kennedy:不,它没有 - Action.OnExecute 和 Button.OnClick 在这里是同一个事件。一个动作临时将单选按钮的受保护的“ClicksDisabled”属性设置为 True,以防止在更改“已检查”属性时触发单选按钮的“OnClick”事件。
    【解决方案4】:

    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;
    

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多