Поделись с другими!
При решении предыдущей задачи я руководствовался, прежде всего, соображениями универсальности. Как я уже говорил, это фрагмент реального приложения. Т.е. я заранее не знал, где и когда у меня может быть выведено модальное сообщение или форма. А искать все вызовы – довольно хлопотная работа.
Поэтому я задействовал TApplicationEvents и два события этого компонента – onModalBegin и onModalEnd. Абсолютно ничего сложного,
procedure TForm1.ApplicationEvents1ModalBegin(Sender: TObject); begin flg:= True; end; procedure TForm1.ApplicationEvents1ModalEnd(Sender: TObject); begin flg:= False; end; procedure TForm1.TrayIcon1Click(Sender: TObject); begin if not flg then ShowMessage(''); end;
Но этот код будет работать при любом вызове модальной формы или окна, и, соответственно, больше ничего в коде написанной ранее программы менять не придется.
Поделись с другими!
В Delphi 2007 и XE такой код ловит только ShowModal – на ShowMessage не реагирует, поэтому в мне пришлось сделать обертку.
Значение переменной flg будет эквивалентно выражению (Application.ModalLevel > 0). Правда свойство ModalLevel не доступно в старых версиях Delphi..
Я не знал. Действительно, удобное свойство.
Предыдущий комментарий так и не появился, так что вкратце повторю: не работает в Delphi 2007 и XE.
Поэтому я и обертку.
скриншот
Поэтому я и предложил обертку.
P.S. Простите за “спам”, превью было бы не лишним.
Я не тестировал в старых версиях Delphi. Проверял в XE3 и 2010 – работает.
а если из модального окна открыть второе модальное, то уже после закрытия второго модального окна переменная flg будет равна flase, что неверно с точки зрения приведенного алгоритма.
Да вроде бы корректно работает.