Android 避免t开关';在Firemonkey中的OnSwitch事件

Android 避免t开关';在Firemonkey中的OnSwitch事件,android,delphi,firemonkey,Android,Delphi,Firemonkey,以编程方式设置TSwitch的IsChecked属性时,将调用开关上的事件。如何避免这种情况?我希望只有在用户交互的情况下,当用户通过单击切换控件时,才会调用OnSwitch事件。使用OnSwitch=Switch1Switch()和以下按钮OnClick仅模拟编程更改,您可以执行以下操作: procedure TForm29.Button1Click(Sender: TObject); begin Switch1.OnSwitch := nil; Switch1.IsChecked :

以编程方式设置TSwitch的IsChecked属性时,将调用开关上的事件。如何避免这种情况?我希望只有在用户交互的情况下,当用户通过单击切换控件时,才会调用OnSwitch事件。

使用
OnSwitch=Switch1Switch()
和以下按钮
OnClick
仅模拟编程更改,您可以执行以下操作:

procedure TForm29.Button1Click(Sender: TObject);
begin
  Switch1.OnSwitch := nil;
  Switch1.IsChecked := not Switch1.IsChecked;
  Switch1.OnSwitch := Switch1Switch;
end;

这会更改开关的状态,并在用户翻转开关时触发开关
OnSwitch
,但在以编程方式更改状态时不会触发开关。

使用
OnSwitch=Switch1Switch()

procedure TForm29.Button1Click(Sender: TObject);
begin
  Switch1.OnSwitch := nil;
  Switch1.IsChecked := not Switch1.IsChecked;
  Switch1.OnSwitch := Switch1Switch;
end;

这会更改开关的状态,并在用户翻转开关时触发开关
OnSwitch
,但在以编程方式更改状态时不会触发。

也许(我现在无法测试)您可以使用
OnClick
来检测用户操作,而不是
OnSwitch
<如果以编程方式更改状态,则不会出现代码>OnClick
。问题是在OnClick事件中,我没有获得开关的正确/新状态。例如,如果开关被设置为off,而我将其更改为on,那么我会得到以前的off状态(OnChecked=false)。好的,很抱歉听到这个消息。另一种可能性,我知道是可行的,就是在编程更改状态之前将开关设置为nil
OnSwitch
,然后立即重置开关。这不仅仅是Firemonkey,也不仅仅是VCL中的这种控制。德尔福在这方面似乎并不十分一致。在某些情况下,在复杂的相互关联的控制下,有时会导致致命的拥抱。汤姆·布伦伯格的解决方案似乎不错。我过去使用过类变量,但它相对比较麻烦。也许(我现在无法测试)您可以使用
OnClick
来检测用户操作,而不是
OnSwitch
<如果以编程方式更改状态,则不会出现代码>OnClick。问题是在OnClick事件中,我没有获得开关的正确/新状态。例如,如果开关被设置为off,而我将其更改为on,那么我会得到以前的off状态(OnChecked=false)。好的,很抱歉听到这个消息。另一种可能性,我知道是可行的,就是在编程更改状态之前将开关设置为nil
OnSwitch
,然后立即重置开关。这不仅仅是Firemonkey,也不仅仅是VCL中的这种控制。德尔福在这方面似乎并不十分一致。在某些情况下,在复杂的相互关联的控制下,有时会导致致命的拥抱。汤姆·布伦伯格的解决方案似乎不错。我过去使用过类变量,但它相对比较麻烦。一个更常见和通用的解决方案是将以前的
OnSwitch
处理程序保存到一个局部变量,然后将该变量分配回事件:
var OldHandler:TNotifyEvent;开始OldHandler:=Switch1.OnSwitch;开关1.ON开关:=零;try switch 1.IsChecked:=未对switch 1.IsChecked进行检查;最后切换1.OnSwitch:=OldHandler;结束;结束如果要禁用多个控件,可以将此代码轻松包装到可重用函数中,您可以将所需对象作为输入参数传递给该函数。更常见和通用的解决方案是将以前的
OnSwitch
处理程序保存到局部变量,然后将变量分配回事件:
var OldHandler:TNotifyEvent;开始OldHandler:=Switch1.OnSwitch;开关1.ON开关:=零;try switch 1.IsChecked:=未对switch 1.IsChecked进行检查;最后切换1.OnSwitch:=OldHandler;结束;结束如果要禁用多个控件,可以将此代码轻松包装到可重用函数中,您可以将所需对象作为输入参数传递给该函数。