Создание и уничтожение приложения

 

При запуске исполняемого файла приложения (.exe) объект Application занят созданием и инициализацией форм приложения.

При старте приложения создаются только формы, включенные в состав автоматически создаваемых форм, перечисленных в списке Auto-create forms на вкладке Forms диалогового окна Project Options. Последовательность создания этих форм соответствует их очередности в этом списке.

Для инициализации приложения вызывается метод:

procedureInitalize;

 

Будьте внимательны: пока не созданы формы проекта, не может быть и речи

об изменении свойств объектов, расположенных на формах, или вызовах их

методов.

procedureCreateForm(FormClass: TFormClass; varReference);

 

Метод CreateForm() присутствует в любом листинге стандартного проекта

(файл .dpr), конечно, при условии, что программа работает с формами. Первой всегда создается главная форма приложения. Данная процедура конструирует форму с типом, указанным в параметре FormClass. Формальный параметр Reference указывает на экземпляр формы, например Form1.

Ради справедливости надо отметить, что процесс создания приложения берет начало с вызова конструктора приложения:

constructorCreate(AOwner: TComponent);

Но конструктор вызывается Delphi автоматически, и в большинстве случаев обычному программисту здесь делать нечего.

Вызов метода CreateForm() для создания новой формы допускается в любом

месте вашей программы. Метод очень похож на обычный Create(), за исключением того, что CreateForm() всегда проверяет, не равно ли свойство Application. MainForm значению nil.

programProject1;

usesForms, Unit1 in'Unit1.pas' {Form1};

{$R *.RES}

Begin

Application.Initialize; // инициализация приложения

Application.CreateForm(TForm1, Form1); // создание формы

Application.Run; // запуск приложения

end.

 

По завершении процесса создания форм объект Application вызывает метод

Run, запускающий приложение:

procedureRun;

 

Для любителей копаться в недрах приложения рекомендую изучить исходный код класса TApplication (модуль forms.pas). Кстати, огромный интерес представляет процедура Run(), листинг которой приведен ниже:

procedureTApplication.Run;

Begin

FRunning := True;

Try

AddExitProc(DoneApplication);

IfFMainForm <> nil then

Begin

CaseCmdShow of

SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized;

SW_SHOWMAXIMIZED : FMainForm.WindowState := wsMaximized;

end;

IfFShowMainForm then

ifFMainForm.FWindowState = wsMinimized then

Minimize else

FMainForm.Visible := True;

Repeat

HandleMessage

untilTerminated;

end;

Finally

FRunning := False;

end;

end;

 

Поле FRunning представляет собой глобальный флаг приложения, свидетельствующий о том, запущено (true) или нет (false) приложение. В случае возникновения исключительной ситуации (секция обработки ошибок try … finally… end) флаг очищается. Процедура AddExitProc() предназначена только для обеспечения совместимости с более ранними версиями Delphi. Самое интересное происходит дальше. После проверки на существование главной формы проекта FMainForm <> nil метод Run определяет, в каком виде показывать приложение (в минимизированном или развернутым на весь экран). Для этого в операторе-селекторе case … of проверяется состояние переменной CmdShow и в поле FWindowState главной формы передается соответствующее значение. На протяжении всей «жизни» приложения в цикле repeat … until объект Application вызывает метод HandleMessage, отвечающий за организацию цикла обработки сообщений:

procedureHandleMessage;

 

Это классика для опытных программистов, работающих на Win32 API. Процедура HandleMessage прерывает выполнение приложения с тем, чтобы операционная система могла обработать одиночное сообщение из очереди сообщений Windows, перед тем как вернуть управление приложению. Если очередь сообщений пуста, HandleMessage генерирует событие OnIdle() и отдает бразды правления приложению.

К вопросам взаимодействия с Windows мы еще не раз вернемся. А процесс организации цикла обработки сообщений будет подробно рассмотрен в главе 27 «Программирование на Win32 API».

Приложение продолжает свою работу до тех пор, пока в его адрес не поступит сообщение WM_QUIT. В таком случае вызывается другой метод Application:

 

procedureTerminate;

 

Процедура вызывает функцию Windows API PostQuitMessage(). Приложение

уничтожает все созданные в процессе работы объекты и прекращает работу.

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

При запуске приложения можно отказаться от показа главной формы. Для

этого установите в false свойство:

propertyShowMainForm: Boolean;

 

Жизненный путь Application завершается вызовом деструктора. Как и в случае с Create(), он вызывается автоматически.

destructorDestroy;








Дата добавления: 2016-03-15; просмотров: 561;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.