Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Hello, World!
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  06:09[Войти] | [Зарегистрироваться]

Обобщающие примеры работы с WinAPI. Пример №1

Юрий Зотов
дата публикации 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 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования