Версия для печати


Обобщающие примеры работы с WinAPI. Пример №1
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=903

Юрий Зотов
дата публикации 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) оправданием ужасного стиля не являются.





К материалу прилагаются файлы: