При настройке свойства IsChecked TSwitch программно вызывается событие OnSwitch. Как этого избежать? Я хотел бы, чтобы событие OnSwitch вызывалось только в случае взаимодействия с пользователем, когда пользователь переключает элемент управления, нажимая.Избегайте события OnSwitch TSwitch в Firemonkey
ответ
С 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; попробуйте Switch1.IsChecked: = not Switch1.IsChecked; наконец Switch1.OnSwitch: = OldHandler; конец; end; 'Если у вас есть несколько элементов управления для отключения, этот код можно легко обернуть в функцию многократного использования, чтобы вы могли передать желаемый объект в качестве входного параметра. –
Возможно (я не могу проверить сейчас) вы можете использовать 'OnClick' для обнаружения действий пользователя вместо' OnSwitch'. 'OnClick'should nt происходит, если вы изменяете состояние программно. –
Проблема в том, что в событии OnClick я не получаю правильное/новое состояние коммутатора. Например, если переключатель был отключен и я меняю его на включен, я получаю предыдущее состояние (OnChecked = false). – grinner
Хорошо, жаль слышать. Другая возможность, которую я знаю, работает, - это nil 'OnSwitch' перед программным изменением состояния и сбросом' OnSwitch' сразу после. –