Юрий Зотов дата публикации 20-09-1999 00:00 Обобщающие примеры работы с WinAPI. Пример №1
Примеры простых, но эффективных решений нестандартных проблем
|
(Проверка на повторный запуск, показ Splash-окна
в форме овального "бублика" при загрузке, помещение "иконки" в область SysTray).
Описание:
Проект
специально построен так, чтобы объединить в себе ряд примеров из "Сокровищницы"
и ряд вопросов из "Круглого Стола" о нестандартных примочках (ответы там тоже
были, но тоже слишком громоздкие). Хотелось показать преимущества прямого API
перед API через VCL, в случаях, когда речь идет о том, чего в самой Delphi нет.
Во-первых, программа не допускает одновременного запуска 2-х своих экземпляров
внутри одной системы - откуда бы их не запускали. Это легко делалось в Win16
через описатель предыдущего экземпляра, но в Win32 определить дублирование
непросто. Тем не менее, удалось придумать очень компактное и вполне надежное
решение, которое я и рекомендую всем (см. Сunnings.dpr). К тому же, оно
позволяет блокировать не только повторный запуск приложения, но и запуск других
Ваших программ, если любая из них, заданная Вами, уже запущена (или, наборот,
еще не запущена). При переносе в другие проекты нужно лишь изменить одну
строковую константу, остальной текст просто копируется. Идея механизма
распознавания дубля моя собственная, но за ее уникальность не ручаюсь.
Во-вторых, при запуске показывается Splash-форма, причем ровно столько
времени, сколько идет загрузка и инициализация основной программы. В примере
длительная загрузка имитируется 5-х секундной паузой, в реальном проекте эту
паузу можно и убрать, и оставить, и изменить.
В-третьих, Splash-окно имеет вид овального "бублика", причем оно не
нарисованное (GDI), а настоящее (User), со всеми атрибутами нормального окна,
включая Handle и доступность для Object Inspector. "Дырка от бублика" тоже
настоящая. Чтобы проверить это, можно запустить что-нибудь, например, Notepad
(где-то в центре экрана), а затем этот пример. Во время показа Splash-окна
щелкните внутри "дырки" - и Вы окажетесь в Notepad'е! Использованный в
программе прием позволяет создавать окна любой формы и с любым количеством
"дырок" тоже любой формы. Идея взята у Фаронова, но, в общем-то, использованы
функции API, для того и предназначенные. Прошу обратить внимание, как это
просто и компактно - см. TSplashForm.Create в Splash.pas.
В-четвертых, главное окно на экране и на панели задач отсутствует, а вместо
этого в SysTray помещается иконка. За основу взят механизм из Borland FAQ,
только я его довольно прилично упростил. Опять же, прошу обратить внимание, как
это компактно - см. TTrayForm.Create в Tray.pas. При щелчке по иконке левой
кнопкой она (иконка) меняет картинку (TTrayForm.WndProc), а при щелчке правой -
всплывает pop-up меню с единственным пунктом "Выход". Меню обычное, из VCL, так
что легко модифицируется на Design-Time.
Вот, собственно, и все. Поясню только, что я намеренно использовал замещение
методов (скажем, Create и Destroy) вместо добавления соответствующих
published-методов т.к. специально готовил эту демонстрашку для включения
желающими в свой репозиторий и поэтому по возможности старался оставить чистыми
те места, где наиболее вероятен прикладной код. С той же целью прикладные
действия, которые должна совершить программа при загрузке и инициализации (в
примере - задержка времени) вынесены из конструктора в отдельный public-метод
DoSomethingElse.
Примечание:
Мне бы
хотелось, чтобы все программисты четко понимали, что делать, скажем, визуальный
проект формы или базу данных следует c использованием Object Inspector и
соответствующих компонент Delphi, а в нестандартных для Delphi ситуациях надо
искать более подходящие способы. Причем незнание API и нежелание читать хотя бы
Win32 SDK Help (входящий, кстати, в поставку Delphi) оправданием ужасного стиля не являются.
К материалу прилагаются файлы:
[Изменение размеров компонент, нестандартная форма] [Systray] [Splash-формы]
Обсуждение материала [ 26-07-2012 23:52 ] 7 сообщений |