Главная » Delphi » Сворачивание в Tray Bar при запуске

0

Для этого после демонстрации заставки нам нужно сделать два действия: во- первых, сразу поместить иконку в ‘Ггау, во-вторых, создать главное окно, но так, чтобы оно оставалось невидимым. Проще всего осуществить второе действие: для этого нужно сразу после создания формы (процедура createForm) вставить строку Application.ShowMainForm:=False. Но вСЛИ МЫ ЭТИМ ОГраНИ- чимся, то создадим в прямом смысле слова программу-фантом: после демонстрации заставки она исчезнет с глаз долой и ее не останется даже в списке задач, доступных через <Alt>+<Tab>. Прервать ее можно будет только через Run | Program Reset (<Ctrl>+<F2>), если вы запускали ее из среды Delphi. А вот вопрос для знатоков из клуба "Что? Где? Когда?": что произойдет, если вы попытаетесь прервать эту фантомную программу, разыскав ее в списке всех выполняющихся задач, доступном через <Ctrl>+<Alt>+<Del>? Внимание, правильный ответ: разумеется, она появится в виде иконки в Tray — действие, которое ОС пытается совершить над прерываемой программой, равносильно вызову метода close, а в прошлой главе мы подробно расписали, что именно наша программа делает в таком случае. Конечно, тогда уже закрыть ее или распахнуть можно будет штатным методом, через всплывающее меню.

Чтобы избежать создания фантомной программы, осталось только включить процедуру создания иконки с самого начала программы (изменения внесем в той же версии 1.20). Для этого мы поступим так: чтобы не повторять текст, относящийся к созданию иконки, мы выделим его в отдельную процедур)’ (разместив ее в модуле slide,pas, например, перед процедурой Loadfile):

procedure CreateMyicon; begin

FHandle := AiiocateHWnd(Forml.WndProc); {получаем дескриптор окнаi Hlconl:=CopyIcon(Application.Icon.Handle);

{получаем дескриптор иконки) with noIconOata do begin

cbSize:=Sizeof(TNotifylConData); {размер структуры) Wnd:=FHandle; {дескриптор окна) uID:=0; {единственная иконка)

UFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP; {взводим все флаги) SzTip:=’SlideShow'; {всплывающая подсказка) HIcon:=HIconl; {дескриптор иконки) uCallBackMessage:=Ico_Massage;

{определяемое пользователем сообщение)

end;

Shell_NotifyIcon(NIM_ADD,SnoIconData); {создали иконку)

Forml.Hide; {скрыли окно)

end;

А процедура FomDeactivate, откуда мы скопировали текст, теперь будет выглядеть так:

procedure TForml.FormDeactivaсе(Sender: TObject); begin

CreateMyicon; (создаем иконку в Tray I end;

Для того чтобы основная программа "знала" о существовании такой процедуры, мы должны объявить ее в интерфейсной части модуля slide.pas обычным способом (без всяких этих игр в "private-public"), т. е. прямо перед служебным словом var:

procedure CreateMyicon; var

Formi: TForml;

Ссылка на модуль из основной программы у нас есть (uses __________  slide in

•slide.pas’), так что теперь, казалось бы, осталось только включить вызов процедуры CreateMyicon в основной текст:

Application.CreateForm(TForml, Formi); (создаем главную форму/ CreateMyicon; {создаем иконку в Tray}

Арр 1 iсаtion. ShowMainForm: = Fa 1 se; (не показываем r.naвную форму? i Form2.Free; (уничтожаем заставку} Application.Run; (запускаем приложение} end.

И все вроде бы работает, но с одним изъяном: если попытаться сразу после запуска, ни разу не вызывая окно программы на экран, просто закрыть приложение через всплывающее меню иконки, то вместо закрытия у нас образуется вторая иконка. Как это исправить? Очень просто: если помните, у нас флаг разрешения закрытия программы mayciose инициализирован значением False — это было сделано для того, чтобы изначально предотвратить закрытие распахнутого окна при вызове метода close. Флаг принимал значение True, когда иконка расположена в Tray, и окно при этом отсутствует. Но ведь теперь это происходит с самого начала — окна программы нет, и мы спокойно исправляем строку в секции объявлений переменных модуля slide.pas на mayciose: boolean=True. Проверьте работу программы и убедитесь, что теперь все в порядке.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии