Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений в среде Delphi.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
186.37 Кб
Скачать

6.2. Организация взаимодействия форм

Если одна форма выполняет какие-либо действия с другой формой, то в списке uses раздела implementation (ИЛИ interface) Модуля первой формы должна быть ссылка на модуль второй формы.

Пример. Организация взаимодействия форм.

Приложение включает в свой состав две формы — Form1 и Form2, для кото­рых имеются модули Unit1 и Unit2 соответственно. Ниже приводится код модуля Unit1 первой формы Form1.

unit Unitl;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

TForml = class(TForm)

Buttonl: TButton;

procedure ButtonlClick(Sender: TObject);

end;

var Forml: TForml;

implementation

// Ссылка на модуль второй формы

uses Unit2;

{$R *.DFM}

procedure TForml.ButtonlClick(Sender: TObject);

begin

// Операция со второй формой

Form2.Show;

end;

end.

При нажатии на кнопку Button1 на первой форме на экране отображается вторая форма, до этого невидимая. Так как из модуля первой формы осуще­ствляется операция со второй формой, то в разделе implementation первого модуля помещен код uses Unit2.

Ссылку на модуль другой формы можно устанавливать программно, но Del­phi позволяет выполнить автоматизированную вставку ссылки следующим образом. При задании команды File | Use Unit (Файл | Использовать модуль) появляется диалоговое окно Use Unit (Выбора модуля) (рис. 6.4). После выбора нужного модуля и нажатия кнопки ОК ссылка на него добавляется автоматически.

Рис. 6.4. Окно выбора модуля

Если ссылка на требуемый модуль отсутствует, то при компиляции про­граммы появляется диалоговое окно Information (Информация) (рис. 6.5). В нем сообщается о том, что одна форма использует другую, но модуль второй формы отсутствует в списке uses модуля первой формы. Для автома­тического добавления ссылки на модуль достаточно нажать кнопку Yes.

Рис. 6.5. Диалог добавления ссылки на модуль

Форма может выполнять различные операции не только с другой формой, но и с отдельными ее компонентами. В этом случае также нужна ссылка на модуль другой формы.

Пример. Обращение к компоненту другой формы.

uses Unit2;

procedure TForml.Button2Click(Sender: TObject);

begin

Label1.Caption := Form2.Editl.Text;

end;

При нажатии кнопки Button2 формы Form1 в надписи Label1 отображается текст редактора Edit1, расположенного на форме Form2.

Замечание: Можно выполнять операции с компонентами формы, минимизированной или невидимой на экране. Однако в любом случае форма уже должна быть создана перед выполнением любых операций с ней.

6.3. Особенности модальных форм

Модальной называется форма, которая должна быть закрыта перед обраще­нием к любой другой форме данного приложения. Если пользователь пыта­ется перейти в другую форму, не закрыв текущую модальную форму, то Windows блокирует эту попытку и выдает предупреждающий сигнал. За­прет перехода в другую форму при незакрытой модальной форме относится только к текущему приложению, и пользователь может активизировать лю­бое другое приложение Windows.

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

Модальные формы часто называют диалогами, или диалоговыми панелями, существуют и немодальные диалоги. Для выполнения различных операций в Windows часто используются стандартные диалоговые формы, с которыми пользователь имеет дело при работе с приложениями. Такие формы назы­ваются общими, или стандартными диалогами, для работы с ними Delphi предлагает специальные компоненты. Они рассматриваются в этой главе отдельным пунктом. Типичным примером модальной диалоговой формы является диалоговое окно About (О программе).

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

Для отображения формы в модальном режиме служит метод ShowModal.

Пример. Отображение модальной формы.

procedure TForml.mnuAboutClick(Sender: TObject);

begin

fmAbout.ShowModal;

end;

Выбор пункта меню mnuAbout приводит к отображению формы fmAbout в мо­дальном режиме. Пункт меню может иметь заголовок (например, О программе), устанавливаемый с помощью свойства Caption. Пользователь может про­должить работу с приложением, только закрыв эту модальную форму.

Многие формы можно отображать и в немодальном режиме, например, следующим образом:

fmAbout.Show;

При закрытии модальной формы функция ShowModal возвращает значение свойства ModalResult типа TModalResult, присваиваемое свойству при этом. Возможные значения этого свойства рассматриваются при описании кнопок. Напомним, что метод Show является процедурой и результат не воз­вращает.

При закрытии любая форма возвращает код результата. Этот код обычно пред­ставляет интерес при организации диалогов. После закрытия диалога воз­вращаемый код результата можно проанализировать и выполнить соответст­вующие действия. В общем случае в зависимости от кода результата закрытия модальной формы программируется разветвление на несколько направлений.

Пример. Управление диалоговой формой.

// Процедура находится в модуле формы Forml

procedure TForml.btnDialogClick(Sender: TObject);

var rez :TModalResult;

begin

// Вызов модальной формы (диалога)

rez : = fmDialog.ShowModal;

// Анализ способа закрытия модальной формы (диалога)

if rez = mrOK then

MessageDlg('Диалог принят.', mtlnformation, [mbYes], 0); if rez = mrCancel then

MessageDlg('Диалог отменен.', mtlnformation, [mbYes], 0) ; end;

// Процедуры находятся в модуле формы fmDialog

// Закрытие формы и установка значения mrOK коду результата

procedure TfmDialog.btnCloseClick(Sender: TObject);

begin

ModalResult := mrOK;

end;

// Закрытие формы и установка значения mrCancel коду результата

procedure TfmDialog. btnCancelClick(Sender: TObject);

begin

ModalResult := mrCancel;

end;

Кнопка btnDialog формы Form1 открывает Диалоговую форму fmDialog.

После закрытия диалога кнопкой btnClose или btnCancel выполняется анализ кода результата закрытия и вывод на экран.

Как правило, управление кодом результата диалога выполняется не про­граммно (через свойство ModalResult формы), а с помощью кнопок. Чаще всего диалоговая форма содержит кнопки подтверждения и отмены выпол­ненных операций. Кнопка подтверждения диалога в зависимости от назна­чения может иметь разные названия, такие как ОК, Ввод, Открыть, Yes. Кнопка отмены диалога часто имеет названия Отмена и Cancel.Как отмечалось ранее, закрыть форму можно, используя свойство ModalResult кнопки. Если свойство имеет значение, отличное от mrNone, то при нажатии на кнопку форма автоматически закрывается. При закрытии форма в качестве результата возвращает значение, определяемое свойством ModalResult кнопки, закрывшей эту форму.

Пример. Задание кнопок закрытия формы.

procedure TfmDialog.FormCreate(Sender: TObject);

begin

fmDialog.BorderStyle := bsDialog;

btnOK.Caption := 'OK1;

btnOK.Default := true;

btnOK.ModalResuit := mrOK;

btnCancel.Caption := 'Ioiaia';

btnCancel.Cancel := true;

btnCancel.ModalResuit := mrCancel;

end;

В приведенной процедуре устанавливаются значения свойств кнопки btnOK подтверждения и кнопки btnCancel отмены диалога fmDiaiog. При нажатии любой из них форма автоматически закрывается (без выполнения обработ­чиков события нажатия кнопок) и возвращает соответствующий результат.

Напомним, что обычно свойства кнопок и самой модальной формы задают­ся через Инспектор объектов при проектировании приложения. В приве­денном примере для наглядности некоторые свойства устанавливаются в обработчике события OnCreate формы.

Замечание: При закрытии формы методом close всегда возвращается значение mrCancel ее свойства ModalResuit. Скрытие формы методом Hide не изме­няет значение свойства ModalResuit.

В принципе разработчик может самостоятельно создать любую модальную форму, однако полезно учитывать, что для выполнения типовых действий Delphi предлагает ряд предопределенных диалогов. Наиболее простые диа­логи реализуются с помощью специальных процедур и функций, в более общих случаях удобно использовать специальные компоненты — стандарт­ные диалоги. Кроме того, ряд диалоговых форм расположены на странице Dialogs (Диалоги) в Хранилище объектов.