【问题标题】:Avoid TSwitch's OnSwitch Event in Firemonkey在 Firemonkey 中避免 TSwitch 的 OnSwitch 事件
【发布时间】:2017-01-19 10:06:23
【问题描述】:

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

【问题讨论】:

  • 也许(我现在无法测试)您可以使用 OnClick 而不是 OnSwitch 来检测用户操作。如果您以编程方式更改状态,OnClick应该不会发生。
  • 问题是在 OnClick 事件中我没有得到正确/新的开关状态。例如,如果开关设置为关闭并且我将其更改为打开,我会得到以前的关闭状态(OnChecked = false)。
  • 好的,很抱歉。我知道另一种可行的可能性是在以编程方式更改状态之前将OnSwitch 设为nil,然后立即重置OnSwitch
  • 不只是Firemonkey,或者这个控件也可以发生在VCL中。在这方面,Delphi 似乎并不十分一致。在某些情况下以及复杂的相互关联的控制下,有时可能会导致致命的拥抱。 Tom Brunberg 的解决方案似乎是一个不错的解决方案。我过去使用过类变量,但它比较麻烦。

标签: android delphi firemonkey


【解决方案1】:

使用OnSwitch = Switch1Switch() 和下面的按钮OnClick 只是模拟程序更改,您可以执行以下操作:

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

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

【讨论】:

  • 一个更常见和通用的解决方案是将之前的OnSwitch处理程序保存到一个局部变量,然后将变量分配回事件:var OldHandler: TNotifyEvent; begin OldHandler := Switch1.OnSwitch; Switch1.OnSwitch := nil; try Switch1.IsChecked := not Switch1.IsChecked; finally Switch1.OnSwitch := OldHandler; end; end;如果你有多个控件要禁用,这个代码可以很容易地包装在一个可重用的函数中,您可以将所需的对象作为输入参数传递给该函数。
猜你喜欢
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2015-09-10
  • 1970-01-01
相关资源
最近更新 更多