Год начался бодренько. Что называется, с корабля на бал. С одной стороны работы навалилось так, что было не до блога, с другой – работа же и подкидывает материалы для этого самого блога. Забегая немного вперед скажу, что планирую серию статей, посвященных DataSnap и Android клиентам для DataSnap. Кроме того, вполне вероятно, что получит развитие тема ER/Studio. Ну, а пока весь этот материал “в работе”, я проанонсирую новую рубрику.
Разминка для ума. Суть в следующем. В процессе разработки реальных приложений, я сталкиваюсь с различными, интересными, на мой взгляд, задачами. Эти задачи отнюдь не будут относиться к разряду “нерешаемых”, просто в большинстве случаев, они будут содержать какие-то интересные моменты, либо, это будут просто “типовые” задачи, которые надо уметь решать точно так же, как надо уметь ловить третью даму на руке противника.
Я предполагаю следующий формат рубрики. Вместе с условием задачи, я выкладываю готовое собственное решение задачи в виде исполняемого файла. Те, кому интересно размяться, либо пробуют самостоятельно реализовать подобное решение и присылают исходный код, либо излагают свои соображения в комментариях.
Первая задача довольно простая. Необходимо создать приложение с иконкой в систем трее. При нажатии на иконку должно выдаваться некоторое модальное сообщение. Особенность в том, что если программа уже сгенерировала сообщение и оно в данный момент активно, то повторно оно вызываться не должно.
Я реализовал это примерно так.
Задача имеет некоторые “подводные камни”, на которые я в свое время успешно напоролся. Собственно, предлагаю вам размяться и найти оптимально решение.
Между прочим, в Вашем решении есть недочёт. При повторном клике на иконку, я (как юзер) ожидал, что модальное сообщение получит фокус ввода. Но ничего не произошло. Это плохо, потому что может получиться так: сообщение висит модально, но закрыто другим окном, юзер кликает на иконку и никакой реакции.
Решений может быть несколько… не знаю, стоит ли писать прям в комментарий
Эта задача – фрагмент другой, более обширной задачи.
Как раз, разворачивать-то форму мне и не надо было. Суть в том, что бы не выполнять какое-то действие в случае наличия модального сообщения или формы, и выполнять его в противном случае.
Конечно, решений может быть несколько… В том-то весь интерес.
Хотя развернуть ее, как раз, не проблема…
Всем привет!
Вот набыдлокодил =)
http://rghost.ru/43224795
интересно действительно узнать более изящное решение
Это вариант, конечно…. Но в реальном приложении у меня около восьми десятков модальных форм, а сообщения вызываются… Я даже сосчитать не могу.
> “и присылают исходный код”
куда присылать?
а, наконец-то увидел…. долго искал контактный email
Ещё вариант http://rghost.ru/43226773
… правда по хорошему нужно проверочку IsWindow … что б не упало
Вообще, у меня в примере вызывается ShowMessage. Но мой код будет работать даже если будет открыта любая модальная форма приложения.
Мб дело в плохом ТЗ?
Да, ТЗ подрихтую.
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.ModalPopupMode := pmAuto;
end;
procedure TForm1.MyShowMessage(const AText: String);
begin
Application.ModalStarted;
ShowMessage(AText);
Application.ModalFinished;
end;
procedure TForm1.TrayIcon1Click(Sender: TObject);
begin
if Application.ModalLevel = 0 then
MyShowMessage('test') // Form2.ShowModal
else //для проверки
Caption := IntToStr(Application.ModalLevel);
end;
Интересное решение.