Почему не запускается OnUpdate для невидимых компонентов
Когда я делаю компонент невидимым, устанавливая подключенное TAction как невидимое, событие onupdate больше не будет запускаться. Для воссоздания сделайте следующее.
- Создать новое приложение форм VCL
- Перетащите кнопку, флажок и список действий на форму.
- Создайте новое действие и подключите к нему кнопку.
Напишите следующий код для действий OnExecute и OnUpdate:
procedure TForm1.Action1Execute(Sender: TObject); begin ShowMessage('Test'); end; procedure TForm1.Action1Update(Sender: TObject); begin TAction(Sender).Enabled := not CheckBox1.Checked; TAction(Sender).Visible := TAction(Sender).Enabled; end;
Запустите приложение. Кнопка видна и работает правильно. Установите флажок, и кнопка исчезнет. Снимите флажок. Кнопка не появляется. Фактически, если вы установите точку останова в Action1Update, вы никогда не доберетесь до нее. Почему это и как мне это исправить?
4 ответа
Не нужно это исправлять, все работает как задумано. Только видимые элементы управления должны обновлять свое состояние, поэтому обновляются только те действия, чьи связанные элементы управления являются видимыми. Когда вы скрываете кнопку, больше нет причин обновлять действие.
Пусть OnUpdate вызывает только отдельную подпрограмму, которая выполняет то, что требуется. Тогда вы можете вызвать эту процедуру из других мест. Списки действий были разработаны для этого.
Вы можете переопределить метод InitiateAction в форме. Это будет происходить всякий раз, когда приложение бездействует, как это происходит в случае события OnUpdate для каждого действия.
Я понимаю, что вы пытаетесь сделать, и имеет смысл, что вы хотите, чтобы это работало именно так. Тем не менее, вот обходной путь для его работы.
Вы можете обновить другие элементы управления в OnUpdate
также. Вы не ограничены обновлением элемента управления, который получает уведомление. Таким образом, в действии для элемента управления, который определяет видимость, вы можете установить видимость других элементов управления там. В вашем случае это флажок:
Создайте новое действие (Action2) и назначьте его для Checkbox1.
Затем в флажке действия OnUpdate:
procedure TForm1.Action2Update(Sender: TObject);
begin
Button1.Visible := TAction(Sender).Checked;
end;
Обязательно назначьте OnExecute для этого флажка. Что-то так просто, как это хорошо:
procedure TForm1.Action2Execute(Sender: TObject);
begin
TAction(Sender).Checked := not TAction(Sender).Checked;
end;
Для меня это все еще имеет логический смысл. Вы сможете посмотреть в одном месте, чтобы увидеть все элементы управления, видимость которых зависит от установленного флажка.