Воскресенье, 22.12.2024, 19:13 | Приветствую Вас Гость

Information inovation!

Главная » Статьи » Компы! » Програмирование!

Заметки программиста.
О файле проекта
Известно, что Delphi создает множество файлов с расширениями pas, dfm, dpr и т.д. Обычно программиста интересуют файлы кода (pas) и описания форм (dfm), а остальные остаются вне его поля зрения, а зря — они несут важную информацию, которую можно (а в ряде случаев — нужно) изменять.

Начнем с файла проекта (dpr). Фактически он содержит собственно программу, в то время как связанные с проектом многочисленные файлы форм и DLL представляют собой подпрограммы.

Структура файла проекта, содержащего единственную форму, такова, как показано в листинге 1

Листинг 1
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Проект (программа) начинается обращением к методу Initialize глобального объекта Application и заканчивается после завершения его метода Run. Этот метод — центральный: он визуализирует главную форму приложения и осуществляет диспетчеризацию сообщений Windows. От того, какая работа выполняется строками кода, расположенными перед обращением к нему, зависят время загрузки приложения, и вид экрана до появления главного окна.

Метод Initialize предусмотрен, как говорится, на всякий случай и по умолчанию ничего не осуществляет. Чтобы заставить его работать, следует поместить указатель на соответствующую процедуру без параметров в глобальную переменную InitProc. Это можно сделать в секции инициализации любого модуля (код этих секций активизируется до начала работы основной программы) или непосредственно в теле главного проекта (листинг 2):

Листинг 2
procedure Init;
begin
// Выполняет какую-то работу;
end;

begin
InitProc := @Init;
Application.Initialize; // Обращение к Init
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Разумеется, в этом последнем случае будет проще в первом операторе основной программы явно обратиться к процедуре Init. Вообще говоря, в подавляющем большинстве случаев оператор Application.Initialize можно удалить без каких-либо последствий для программы.

Сокращение времени загрузки
В реальном проекте со множеством форм между обращениями к Initialize и Run обычно расположены многочисленные вызовы метода CreateForm, с помощью которого создаются используемые в проекте формы. Каждый вызов этого метода увеличивает время загрузки приложения. В начальный момент на экране будет видно только одно окно главной формы приложения (оно создается первым обращением к CreateForm), а остальные объекты-окна можно создавать в ходе работы программы перед визуализацией соответствующего окна.

По умолчанию в переключателе Auto create forms (вызывается с помощью опции Project|Options среды Delphi) на закладке Preference окна Tools|Environment установлен флажок, что заставляет Delphi помещать любую новую форму в список Auto-create forms и формировать соответствующий оператор обращения к CreateForm в файле проекта. Если очистить этот переключатель перед началом работы над проектом или перенести ненужные формы в список Available forms окна Project|Options, можно существенно (иногда — в десятки раз) сократить время загрузки приложения.

Вид экрана до появления главного окна
В приводимом ниже листинге 3 (пример заимствован из справочной системы Delphi) в программе создается 5 окон. В форме Form5 имеется индикатор ProgressBar1, с помощью которого визуализируется процесс загрузки программы, точнее — создания остальных окон.

Листинг 3
begin
with TForm5.Create(nil) do
try
ProgressBar1.Max := 100;
Show; // Показываем форму Form5 с индикатором ProgressBar1
Update; // Прорисовываем форму Form5
Application.CreateForm(TForm1, Form1);
ProgressBar1.StepBy(25);
Application.CreateForm(TForm2, Form2);
ProgressBar1.StepBy(25);
Application.CreateForm(TForm3, Form3);
ProgressBar1.StepBy(25);
Application.CreateForm(TForm4, Form4);
ProgressBar1.StepBy(25);
finally
Free; // Разрушаем ненужную форму Form5
end;
Application.Run;
end.

Защита программы паролем
Как видно из примера, программист может поместить любой код до обращения к методу Application.Run. В частности, он может показать диалоговое окно с запросом пароля и блокировать вызов Application.Run, если введенный пользователем пароль неверен. В следующем примере (<листинг 4) в проекте используются две формы: стандартная форма InputQuery и главная форма MainForm. Форма InputQuery создается при обращении к одноименной функции, определенной в модуле Dialogs. Она представляет собой небольшое диалоговое окно с однострочным редактором TEdit и двумя кнопками — ОК и Cancel. В окне пользователь должен ввести пароль (Delphi) и нажать Enter.

Листинг 4
program Password;

uses
Forms,
Dialogs, // В этом модуле определена функция InputQuery
Unit1 in 'Unit1.pas' {MainForm};

{$R *.RES}
var
Passwrd: String;
begin
// Запрашиваем пароль:
if InputQuery('Окно ввода пароля','Введите пароль:',Passwrd) then
// Проверяем его:
if Passwrd = 'Delphi' then
begin // Все в порядке, пароль верен
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end else
ShowMessage('Пароль не верен!');
end.

Пробные версии программ
Вышеописанным способом можно создавать пробные версии программ, которые будут функционировать только до определенной даты или до исчерпания заданного количества запусков. В листинге 5 представлен файл проекта (Trial.dpr), в котором пробная версия программы может запускаться не более 5 раз. Для запоминания номера очередного прогона используется системный реестр.

Листинг 5
program Trial;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Registry, Dialogs; // Для TRegistry и ShowMessage

{$R *.RES}
var
Reg: TRegistry;
N: Integer;
begin
Reg := TRegistry.Create;
with Reg do
begin
OpenKey('software', True);
OpenKey('TrialProg', True);
if ValueExists('MaxRun') then // Первый запуск?
begin // - Нет
N := ReadInteger('MaxRun')-1;
if N>=0 then
WriteInteger('MaxRun', N)
end else begin // -Да, первый запуск
N := 5;
WriteInteger('MaxRun', N)
end;
Free
end;
if N>0 then
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end else
ShowMessage('Исчерпано максимальное количество запусков'+
' пробной версии программы')
end.

Категория: Програмирование! | Добавил: Prise (04.06.2007)
Просмотров: 814 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Наш опрос
Оцените мой сайт
Всего ответов: 55
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz