В процессе загрузки начинается инициализация форм, которые используются в программе. Чем больше в проекте форм и при этом инициализируемых при старте программы, тем дольше будет происходить загрузка. Именно поэтому данному вопросу нужно посвятить особое внимание, и если правильно создавать формы, то можно ускорить работу в несколько раз.

Давайте запустим Delphi Если у вас уже есть собственные программы, то откройте что-нибудь содержащее несколько форм Теперь выберите пункт меню Project ► Source, чтобы открыть исходный проект, содержащий код инициализации. Рассмотрим пример небольшого проекта (листинг 2.2).

Листинг 2.2. Инициализация форм

program oms: uses - Forms, MainUnit in 'MainUnit.pas' {MainForm}, DatabaseDirectoryUnit in 'DatabaseDirectoryUnit.pas', DataModuleMainUnit in 'DataModuleMainUnit.pas' {dmMain: TDataModule}. DBDirectoryTernplateUnit in 'DBDirectoryTemplateUnit.pas' {DBDi rectoryTernplateForm}, EditDBDirectoryUnit in 'EditDBDirectoryUnit.pas' {EditDBDirectoryForm} OrganizationsUnit in 'OrgamzationsUnit.pas' {OrganizationForm}, EditOrganizUnit in 'EditOrganizUnit.pas' {EditOrganizForm}. LoginUnit in 'LoginUnit.pas' {PasswordForm} OptionsUnit in 'OptionsUnit.pas' {OptionsForm}. FindlnGridUnit in 'FindlnGridUnit.pas' {FindlnGridForm}, InsurantUnit in 'InsurantUnit pas' {InsurantForm} UtilsUnit in 'UtilsUnit.pas', продолжение

Листинг 2.2 (продолжение) EditPersonUnit in 'EditPersonUnit.pas' {EditlnsurantForm}, FindlnsurantUnit in 'FindlnsurantUnit.pas' {FindlnsurantForm}.

Sel ectOrgani zationllnit in 'SelectOrganizationUnit.pas'
{SelectOrganizationForm}, AboutUnit in "AboutUnit.pas' {AboutForm}, SecurityUnit in 'SecurityUnit.pas' {SecurityForm}, DoubleFoundUnit in 'DoubleFoundUnit.pas' {DoubleFoundForm}.
ProgramsHistoryUnit in 'ProgramsHistoryUnit.pas' {PersonHistoryForm}:
{$R *.res}
begin
Application.Initialize:

Application.Title := 'ОСАГО Страхование'.

Application.CreateForm(TMai nForm, Mai nForm):
Appl ication.CreateFormCTEdi tOrganizForm. EditOrganizForm);
Appl i cati on.CreateForm(TOpti onsForm. Opti onsForm);
Appli cati on.CreateFormCTFi ndlnGri dForm. Fi ndlnGri dForm);
Application.CreateForm(TEditInsurantForm, EditlnsurantForm):
Application.CreateFormCTFindlnsurantForm. FindlnsurantForm);
Appli cati on.CreateFormCTSelectOrgani zati onForm. SelectOrgani zati onForm):
Application.CreateFormCTAboutForm. AboutForm):
Application.CreateFormCTSecurityForm. SecurityForm):
Application.CreateFormCTDoubleFoundForm. DoubleFoundForm):
Application.CreateForm(TPersonHistoryForm. PersonHistoryForm);
Application.Run;
end.

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

В самом начале расположена большая секция подключения модулей. Первым в списке подключается Forms, так как в нем находятся функции инициализации форм. Без этих функций проект компилироваться не будет.

После этого подключаются все модули вашего проекта, в которых формы требуют инициализации во время загрузки программы, например:

MainUnit in 'MainUnit.pas'

Эта конструкция говорит о том, что подключается модуль MainUnit, который расположен в файле MainUnit.pas.

После модулей подключаем файл ресурсов:

{$R *.res} Эта конструкция подключает к проекту файл с таким же именем, как и у проекта, но с расширением res. Если вы программировали на языке С++, то знаете, что там все диалоговые окна, изображения, пиктограммы и другие визуальные элементы хранятся в виде ресурсов, которые компилируются и прикрепляются к исполняемому файлу.

В Delphi визуальная среда более сложная, поэтому здесь визуальные компоненты хранятся и помещаются в проект в собственном формате. Программисты в Delphi с классическими ресурсами не работают, но они все же необходимы. ОС Windows берет из ресурсов пиктограммы, которые вы можете видеть в Проводнике, и другого способа их получить нет. Именно поэтому в Delphi автоматически создается файл ресурсов с указанной в свойствах проекта пиктограммой (рис. 2.1).

2.4. Инициализация

Рис. 2.1. Файл ресурсов с пиктограммой, открытый в программе Borland Image Editor В большинстве случаев этот файл редактировать нет смысла, но может возникнуть ситуация, когда в исполняемом файле надо сохранить какое-то изображение или видеоролик, чтобы программа состояла только из одного файла. В этом случае для хранения собственных данных используют файл ресурсов, который на этапе компиляции прикрепляется к запускному файлу, и во время запуска вы можете получить из него сохраненные данные

Теперь переходим к рассмотрению кода, который выполняется между begin и end. Здесь вся работа происходит с объектом Application (тип TApplication), который всегда создается автоматически для любой программы, использующей визуальную библиотеку VCL (Visual Component Library - визуальная библиотека компонентов).

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

Win API. Если нужно вызвать что-то из набора VCL, то это желательно делать после вызова метода I ni ci alizé.

Убирать вызов метода Ini ci al ize я не советую. Опять же, если в вашей программе используется VCL и вы уберете эту строку, то программа с ошибками, но запустится. А вот дальнейшее нормальное выполнение будет невозможно, и практически при каждой команде программа будет выдавать ошибку.

В следующей строке заполняется свойство Title объекта Appl ication. Это свойство содержит текстовую строку, которую потом можно будет увидеть в Панели задач на пиктограмме вашей программы. Этот текст можно изменять вручную или воспользоваться свойствами проекта. Для этого выберите пункт меню Project ► Options и в появившемся диалоговом окне перейдите на вкладку Application (рис. 2.2).

2.4. Инициализация

Рис. 2.2. Свойства проекта, вкладка Application

Далее идет создание форм с помощью метода CreateForm, у которого имеются следующие параметры:

• объект (форма);

• переменная, которая будет ссылаться на созданный объект.

Самой первой создается форма, которая является главной, поэтому, если будете изменять порядок инициализации вручную, помните об этой особенности.

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

Если вы создаете многодокументное приложение (MDI), то по умолчанию главное окно будет иметь в свойстве Visible значение true. Это значит, что сразу после события OnCreate будет обработано событие OnShow Порядок загрузки будет следующим:

1. Создание главного окна

2. Обработка события OnCreate главного окна. Свойство Visible в данном случае равно true, и окно во время создания видимо.

3. Обработка события OnShow главного окна

4. Создание следующего в списке окна.

5. Обработка события OnCreate нового окна.

6. Если еще не все окна созданы, переход на шаг 4.

7. Запуск приложения на выполнение.

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

При создании однодокументного приложения (SDI) главное окно будет отображаться последним (если свойство Vi si bl е равно f al se) после создания всех окон. Порядок загрузки будет следующим:

1. Создание главного окна.

2. Обработка события OnCreate главного окна. Свойство Vi si Ы е в данном случае равно true, и окно во время создания видимо.

3. Создание следующего в списке окна.

4. Обработка события OnCreate нового окна

5. Если еще не все окна созданы, переход на шаг 3.

6. Обработка события OnShow главного окна.

7. Запуск приложения на выполнение.

В этом случае в обработчике события OnShow можно смело обращаться к другим окнам, потому что они уже созданы.

Удаление из автоинициализации можно производить двумя способами:

в Удалить соответствующую строку в исходном коде проекта и перенести ее в нужное место, например в обработчик события OnShow в Выбрать пункт меню Project ► Options и на вкладке Forms открывшегося диалогового окна (рис. 2.3) перенести имя формы из списка Auto-create forms в список Available forms. Здесь же можно выбрать главную форму программы в выпадающем списке Main form.

Удалять формы из автоинициализации нужно не только для MDI-приложений с целью доступа к ним из события OnShow, но и для любых других. Если окно содержит множество компонентов, то его создание может отнять лишнее время. А если это окно используется нечасто (для редко используемой опции), то инициализация будет бессмысленной. Уж лучше пусть запускной файл будет больше, чем создавать при запуске все, что только в нем есть.

2.4. Инициализация

Рис. 2.3. Изменение автосоздаваемых форм

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

Постарайтесь убрать из автозагрузки как можно больше окон, чтобы ускорить запуск программы. Но не забывайте теперь перед отображением окна и после закрытия создавать и уничтожать соответствующую переменную. Например, если у вас есть форма с именем 6ет.РагатРогт, которая не создается автоматически и ее необходимо отобразить модально, то это можно сделать следующим образом:

6е1РагашРопи := Т6е1РагатРогт.Сгеа1е(Арр11сатИоп):

6е1Рагап1Рогт.БпсмМс<1а1:

// Получение параметров от формы

(^РагатРогт.Ргее:

Перед отображением формы мы создаем для нее соответствующую переменную. После этого происходит отображение окна. Когда пользователь ввел необходимые данные, мы получаем их и после этого уничтожаем выделенную для формы память. Некоторые забывают про уничтожение, а представьте, если программа 100 раз отобразит это окно, и 100 раз вы будете выделять ей необходимую память без уничтожения! В оперативной памяти будет такой бардак, что для слабого компьютера может потребоваться перезагрузка.

Если программа все равно запускается слишком медленно, то на время загрузки на экран лучше всего выводить окно приветствия, которое будет показывать, что компьютер не завис и работа идет. Начинающие пользователи очень часто пытаются запустить ярлык повторно, если после первого раза ничего не произошло в течение 3-5 секунд.

Для отображения окна хода загрузки создайте новую форму, на которую можно поместить какое-нибудь приятное изображение и надпись типа "Идет загрузка". Затем откройте исходный код проекта и добавьте в самое начало (можно до вызова Application.Initialize) следующий код:

LoadingForm := TLoadmgForm.Create(Application):
LoadingForm.Show:
LoadingForm.Update:

Здесь Loadi ngForm означает имя формы отображения хода загрузки. По событию OnShow для главной формы, когда загрузка уже завершена, это окно можно закрывать. Для этого напишите следующий код:

LoadingForm.Close: LoadingForm.Free:

Здесь мы сначала закрываем окно, а потом освобождаем выделенную память, потому что форма нам больше не понадобится.

i

2.3. Загрузка программы || Оглавление || 2.5. Слабые места


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31