2017-01-19 8 views
0

При настройке свойства IsChecked TSwitch программно вызывается событие OnSwitch. Как этого избежать? Я хотел бы, чтобы событие OnSwitch вызывалось только в случае взаимодействия с пользователем, когда пользователь переключает элемент управления, нажимая.Избегайте события OnSwitch TSwitch в Firemonkey

+0

Возможно (я не могу проверить сейчас) вы можете использовать 'OnClick' для обнаружения действий пользователя вместо' OnSwitch'. 'OnClick'should nt происходит, если вы изменяете состояние программно. –

+0

Проблема в том, что в событии OnClick я не получаю правильное/новое состояние коммутатора. Например, если переключатель был отключен и я меняю его на включен, я получаю предыдущее состояние (OnChecked = false). – grinner

+0

Хорошо, жаль слышать. Другая возможность, которую я знаю, работает, - это nil 'OnSwitch' перед программным изменением состояния и сбросом' OnSwitch' сразу после. –

ответ

2

С OnSwitch = Switch1Switch() и следующие кнопки OnClick только имитируя программные изменения, вы можете сделать следующее:

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

Это изменяет состояние переключателя и пожаров OnSwitch когда пользователь щелкает переключатель, но не тогда, когда состояние изменяется программно.

+0

Более распространенным и универсальным решением является сохранение предыдущего обработчика OnSwitch в локальной переменной, а затем назначение переменной для события: «var OldHandler: TNotifyEvent; begin OldHandler: = Switch1.OnSwitch; Switch1.OnSwitch: = nil; попробуйте Switch1.IsChecked: = not Switch1.IsChecked; наконец Switch1.OnSwitch: = OldHandler; конец; end; 'Если у вас есть несколько элементов управления для отключения, этот код можно легко обернуть в функцию многократного использования, чтобы вы могли передать желаемый объект в качестве входного параметра. –