Delphi:hook ToggleSwitch手动状态更改以避免单击调用

Delphi:hook ToggleSwitch手动状态更改以避免单击调用,delphi,vcl,Delphi,Vcl,Delphi Rio 10.3.2 使用TToggleSwitch组件,手动更改状态属性时,即 ToggleSwitch1.State := tssOff 调用OnClick事件。如何防止这种情况发生?您有几种选择: 在设置状态之前,将OnClick属性设置为nil,然后恢复事件处理程序 ToggleSwitch1.OnClick:=nil; 尝试 ToggleSwitch1.状态:=。。。; 最后 ToggleSwitch1.OnClick:=ToggleSwitch1Click; 终止

Delphi Rio 10.3.2

使用TToggleSwitch组件,手动更改状态属性时,即

ToggleSwitch1.State := tssOff 

调用OnClick事件。如何防止这种情况发生?

您有几种选择:

在设置状态之前,将OnClick属性设置为nil,然后恢复事件处理程序

ToggleSwitch1.OnClick:=nil; 尝试 ToggleSwitch1.状态:=。。。; 最后 ToggleSwitch1.OnClick:=ToggleSwitch1Click; 终止 在设置状态之前设置标志,然后清除标志,并让OnClick事件处理程序在执行任何操作之前检查标志

ToggleSwitch1.Tag:=1; 尝试 ToggleSwitch1.状态:=。。。; 最后 ToggleSwitch1.Tag:=0; 终止 程序TMyForm.ToggleSwitch1ClickSender:TObject; 开始 如果切换开关1.标记0,则退出; ... 终止 使用访问器类访问受保护的成员,以便在更改状态时可以临时将其设置为True:

类型 TToggleSwitchAccess=类别tToggleSwitch 终止 TToggleSwitchAccessToggleSwitch1.FClicksDisabled:=真; 尝试 ToggleSwitch1.状态:=。。。; 最后 TToggleSwitchAccessToggleSwitch1.FClicksDisabled:=False; 终止
您有几个选择:

在设置状态之前,将OnClick属性设置为nil,然后恢复事件处理程序

ToggleSwitch1.OnClick:=nil; 尝试 ToggleSwitch1.状态:=。。。; 最后 ToggleSwitch1.OnClick:=ToggleSwitch1Click; 终止 在设置状态之前设置标志,然后清除标志,并让OnClick事件处理程序在执行任何操作之前检查标志

ToggleSwitch1.Tag:=1; 尝试 ToggleSwitch1.状态:=。。。; 最后 ToggleSwitch1.Tag:=0; 终止 程序TMyForm.ToggleSwitch1ClickSender:TObject; 开始 如果切换开关1.标记0,则退出; ... 终止 使用访问器类访问受保护的成员,以便在更改状态时可以临时将其设置为True:

类型 TToggleSwitchAccess=类别tToggleSwitch 终止 TToggleSwitchAccessToggleSwitch1.FClicksDisabled:=真; 尝试 ToggleSwitch1.状态:=。。。; 最后 TToggleSwitchAccessToggleSwitch1.FClicksDisabled:=False; 终止
FWIW,像TCheckBox或TRadioButton这样的控件的行为是相同的-它们在更改Checked属性的值时一次单击就触发。它们都继承自TButtonControl,该控件的受保护属性为mute OnClick,但其描述有点误导。同样,TToggleSwitch已禁用未记录的受保护属性FClicksDisabled。@彼得沃尔夫说得对。事实上,只是不太好。但它确实说这个字段至少在切换开关状态改变时在内部使用。噢!当然有记录。我在搜索属性而不是字段。。。但活动更有趣。TEdit从代码中设置文本时。另一方面,当更改其文本或ItemIndex时,TComboBox也不会选择,这甚至是有文档记录的行为。FWIW,TCheckBox或TRadioButton等控件的行为相同-它们在更改Checked属性的值时会触发一次单击。它们都继承自TButtonControl,该控件的受保护属性为mute OnClick,但其描述有点误导。同样,TToggleSwitch已禁用未记录的受保护属性FClicksDisabled。@彼得沃尔夫说得对。事实上,只是不太好。但它确实说这个字段至少在切换开关状态改变时在内部使用。噢!当然有记录。我在搜索属性而不是字段。。。但活动更有趣。TEdit从代码中设置文本时。另一方面,t更改文本或项目索引时,mbobox也不能选择,这甚至是记录的行为。我将使用连接到TToggleSwitch的TAction并设置其Checked属性。我将使用连接到TToggleSwitch的TAction并设置其Checked属性。