Создание и уничтожение приложения
При запуске исполняемого файла приложения (.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;