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

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

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


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

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

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

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

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

 
   
С Л С

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

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

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

Квинтана

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

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

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

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

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
 
 01:11 Xenia
 01:09 JAE
 01:06 Green
 01:03 Cep
 01:02 Василий
 01:00 ynow
 00:57 Void
 00:55 Nemo
 00:55 Александр Малыгин
 
 
Во Флориде и в Королевстве сейчас  01:11[Войти] | [Зарегистрироваться]

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

Новик Павел
дата публикации 20-09-1999 00:00

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

Дополнение к примеру №1 по двум вопросам:

1)Касательно блокировки повторного запуска программы: Основной ошибкой, приводящей к повторному запуску приложения, является минимизация программы и невнимательность пользователя при этом. Выводить просто сообщение о повторном запуске довольно некорректно, нужно направить пользователя в правильное русло, т.е. дать ему ту программу, которую он собственно хотел. При этом нежная душа пользователя(как правило она нежная, внутри) не будет лишний раз травмироваться ненужными сообщениями (а как трудно их читать, эти сообщения, а еще надо ведь врубиться, что от тебя хочет программа).

2) Splash-форма (т.е. About) должна создаваться до того как, т.е. должна создаваться САМОЙ первой, мали ли чего там делает главное окно в CreateForm, а если еще учесть DataModul-и, которые лучше создавать перед главным окном, а открытие таблиц. У меня например в проекте создание главного окна занимает почти все всемя загрузки программы, а это как минимум пару секунд. А убираться окно должно либо непосредственно перед выводом главного окна, либо после него, как кому нравиться. так вот пример как я делал это в своем проекте.

Файл .DPR

program MyProgramm;

uses
.........................

var
 Wnd : hWnd;
 clss,buff,mainS: array [0..255] of Char;
 hMutex : integer;
begin
  //********************  Предотвращение повторного запуска ********************
  // вместо "NameProgramm" вставте свою строку
  StrCopy(mainS,'NameProgramm'); SetWindowText(Application.Handle,mainS);
  hMutex:=CreateMutex(nil,TRUE,'BelAZNavigator');       // Создаем семафор
   // Ошибка создания - значит уже создан
  if GetLastError <> 0 then                            
  begin
   GetClassName(Application.Handle, clss,sizeof(clss)); // Получаем имя класса
   Wnd := GetWindow(Application.Handle, gw_HWndFirst);  // Получаем ссылу на окно
   while Wnd <> 0 do
   begin
    if (Wnd<>Application.Handle)and(GetWindow(Wnd, gw_Owner)=0) then // Поиск по всем окнам
    begin
     GetClassName(Wnd,buff, sizeof(buff));    // Получаем класс окна
     if StrComp(buff,clss)=0 then             // Сравниваем с нашим классом
     begin
      GetWindowText(Wnd, buff, sizeof(buff)); // Полечаем текст найденного окна
      if StrComp(buff,mainS)=0 then           // Сравниваем с нашим окно
      begin
       SendMessage(Wnd,WM_SETFOCUS,Wnd,0);
       ShowWindow(Wnd,SW_SHOWNORMAL);
      end;
     end;
    end;
    Wnd := GetWindow(Wnd, gw_hWndNext); // Берем следующее
   end;
   exit; // выход из программы не создавая формы и не запуская приложение
  end;

  //---------------- Вывод окна About на время запуска программы ---------------
  Screen.Cursor:=crHourGlass; // курсор часиками
  WinAbout:=TWinAbout.Create(Application);
  WinAbout.Show;
  WinAbout.Update;
  //-----------------------------------------------------------------------------
  try
   Application.CreateForm(TDM, DM); // форма DataModul-я
   Application.CreateForm(TForm1, Form1);
   WinAbout.Hide; WinAbout.Free;    // закрытие окна About
   Screen.Cursor:=crDefault;        // курсор на место
   Application.Run;
  except
   WinAbout.Free;
  end;
  ReleaseMutex(hMutex)
end.






Смотрите также материалы по темам:
[TForm] [Splash-формы]

 Обсуждение материала [ 05-02-2006 10:59 ] 14 сообщений
  
Время на сайте: GMT минус 5 часов

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

Хостинг предоставлен компанией DOTNETPARK (ASP.NET, MS SQL hosting)  

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

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