Новик Павел дата публикации 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
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;
Screen.Cursor:=crHourGlass;
WinAbout:=TWinAbout.Create(Application);
WinAbout.Show;
WinAbout.Update;
try
Application.CreateForm(TDM, DM);
Application.CreateForm(TForm1, Form1);
WinAbout.Hide; WinAbout.Free;
Screen.Cursor:=crDefault;
Application.Run;
except
WinAbout.Free;
end;
ReleaseMutex(hMutex)
end.
| |
[TForm] [Splash-формы]
Обсуждение материала [ 05-02-2006 10:59 ] 14 сообщений |