Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_Delphi_1курс лекции / Тема 18 Модальные формы.doc
Скачиваний:
47
Добавлен:
23.03.2015
Размер:
83.46 Кб
Скачать

5. В обработчике события формы OnClose напишите

procedure TFLog.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action := caFree;

end;

Этот оператор приводит к уничтожению объекта формы и освобождению занимаемой формой памяти.

Форма-заставка готова к использованию. Проверьте только, имеет ли ее свойство Visible значение false. Это важно, поскольку только невидимую форму можно открыть методом ShowModal. В главной форме свойство Visible тоже должно иметь значение false. Сохраните проект, дав файлу модуля главной формы имя Umain, а файлу модуля формы-заставки имя ULog.

Теперь можно записать в главной форме оператор ShowModal. Но чтобы это можно было сделать, необходимо сослаться в модуле Umain на модуль ULog.

6. Добавьте в оператор uses модуля Umain имя модуля ULog, или напишите оператор uses ULog в разделе Implementation модуля Umain, или сделайте то же самое путем выполнения команды File Use Unit. Впрочем, если вы забудете это сделать, Delphi сама поправит вас и добавит этот оператор при попытке компиляции приложения, задав вопрос: “Form 'Fmain' references form 'FLog' declared in unit 'ULog' which is not in your USES list. Do you wish to add it?”, что означает “Форма 'Fmain' ссылается на форму 'FLog', объявленную в модуле 'ULog', который отсутствует в вашем списке USES. Хотите ли вы добавить его в список?”. При положительном ответе на этот вопрос соответствующий оператор будет добавлен в ваш модуль Umain.

После этого осталось написать в модуле Umain обработчик события формы OnShow.

7. Напишите в модуле Umain обработчик события формы OnShow, состоящий из

одного оператора:

procedure TFMain.FormShow(Sender: TObject);

begin

FLog.ShowModal;

end;

Событие OnShow наступает перед тем, как форма становится видимой. Поэтому в момент выполнения указанного оператора она еще не видна. Оператор открывает форму FLog как модальную, передает ей управление и дальнейшее выполнение программы в модуле Umain останавливается до тех пор, пока модальная форма не будет закрыта. После закрытия модальной формы выполнение программы продолжится, и главная форма станет видимой. Можете сохранить проект, запустить приложение и убедиться, что все работает правильно.

Теперь добавим в приложение форму запроса пароля. Реальная форма такого типа должна предлагать пользователю ввести свое имя и пароль, сравнивать введенные значения с образцами, хранящимися где-то в системе, при неправильном пароле давать возможность пользователю поправиться. Если пользователь так и не может ввести правильный пароль, форма должна закрыть приложение, не допустив к нему пользователя. При правильном пароле после закрытия формы запроса должна открыться главная форма приложения. Все это не трудно сделать, но мы упростим задачу, чтобы не отвлекаться от главного — взаимодействия форм в приложении. Будем использовать всего один пароль, который непосредственно укажем в соответствующем операторе программы. И не будем давать пользователю возможности исправить введенный пароль

8. Добавьте к приложению новую форму. Назовите ее FPSW и сохраните ее модуль в файле с именем UPSW, Уменьшите размер формы до разумных пределов, поскольку она будет содержать всего одно окно редактирования. Установите свойство формы BorderStyle равным bsDialog, свойство Position равным роScreenСenter. В свойстве Caption напишите “Введите пароль и нажмите Enter “. Эта надпись будет служить приглашением пользователю.

9. Поместите в центре формы окно редактирования Edit, в котором пользователь будет вводить пароль. Очистите его свойство Text. Задайте в свойстве PasswordChar символ ‘*’. В обработчике события OnKeyDown этого компонента запишите:

procedure TFPSW.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

if (key = VK_RETURN) then

begin

if Edit1.Text = 'abc'

then ModalResult := 6

else Close;

end;

end;

Этот оператор выполняет следующее. Прежде всего, он анализирует нажатую клавишу. Если нажата клавиша Enter, то введенный текст сличается с паролем. В данном операторе для упрощения непосредственно указан правильный пароль — символ 'аbc'. Если введен правильный пароль, то свойству ModalResult присваивается некоторое условное число — 6 (можно было бы выбрать и любое другое допустимое число, кроме 0 и 2). Если пароль неправильный, то выполняется метод Close. В обоих случаях форма закрывается, так как задание отличного от нуля положительного значения ModalResult равносильно закрытию формы. Но при правильном пароле значение ModalResult будет равно 6, а при неправильном — 2. Это значение получается при выполнении метода Close или если пользователь нажмет кнопку системного меню (кнопку с крестиком) в полосе заголовка окна.

На этом проектирование формы запроса пароля закончено. Теперь запишем в модуле главной формы Umain оператор, показывающий пользователю эту форму и анализирующий ответ пользователя. Для этого надо выполнить следующие операции.

10. В модуле Umain, надо, как и ранее, добавить в оператор uses ссылку на модуль UPSW и дополнить обравотчик события OnShow . Теперь он будет иметь вид:

procedure TFMain.FormShow(Sender: TObject);

begin

FLog.ShowModal;

if (FPSW.ShowModal <> 6)

then Close

else

begin

ShowMessage('Ваш пароль ''' + FPSW.Edit1.Text + '''') ;

FPSW.Free;

end;

end;

Этот оператор анализирует значение свойства ModalResult формы запроса пароля. Значение этого свойства возвращает функция FPSW.ShowModal. Если результат не равен 6, то был введен неправильный пароль. Тогда главная форма, а с ней вместе и приложение, закрываются методом Close. При правильном пароле можно продолжать работу приложения. Оператор ShowMessage введен просто для того, чтобы показать, как можно использовать свойство другой формы — в данном случае текст, введенный пользователем в качестве пароля. В реальном приложении по этому паролю можно было бы определить уровень доступа пользователя к конфиденциальной информации. Затем следует уничтожение формы запроса пароля методом Free. Это необходимо сделать, чтобы освободить память. Сама по себе эта форма в момент ее закрытия не уничтожается, поскольку по умолчанию закрыть форму — значит сделать ее невидимой. Уничтожать форму до этого момента было нельзя, так как при этом уничтожилась бы содержащаяся в ней информация — введенный пароль.

На этом разработка нашего приложения закончена. Можете сохранить проект, запустить приложение и посмотреть, как оно работает.

Описанный выше способ управления формой запроса пароля не является оптимальным. Он просто призван был показать, как можно обрабатывать величину ModalResult, возвращаемую методом ShowModal. Но то же самое можно было бы сделать и проще. В обработчике события OnKeyDown окна редактирования на форме FPSW можно было бы написать более простой оператор:

if (key = VK_RETURN) and (Edit1.Text <>'аbc')

then Application.Terminate;

При неверном пароле этот оператор завершает работу всего приложения методом Application .Terminate. Тогда в главной форме не надо анализировать результат работы пользователя с формой FPSW, так как если приложение не закрылось при выполнении оператора ShowModal, то значит пароль введен правильный. Поэтому операторы в главной форме тоже упрощаются:

FPSW.ShowModal;

ShowMessage('Ваш пароль ''' + FPSW.Edit1.Text + '''') ;

FPSW.Free;

Проведите в вашем приложении соответствующие замены операторов и убедитесь, что приложение и в этом случае работает правильно.