Строго говоря, пользовательский диалог представляет собой обычную форму Delphi, показываемую модально. Модальной становиться любая форма, если она показывается с помощью метода ShowModal.
Показ модальной приостанавливает выполнения вызвавшей ее процедуры до тех пор, пока форма не будет закрыта. При этом пользователь не может курсором мыши переключить фокус на другие формы данного приложения. То есть для продолжения работы с программой нужно закрыть показанное модальное окно.
Создание нового диалога производится как и создание любого нового элемента проекта с вызова мастера с помощью команды меню File/New/Other.
Вызов этой команды приводит к появлению диалога, в котором для создания диалога нужно выбрать вкладку Dialogs.
В мастере есть возможность выбрать способ создания диалога – простым копированием (опция Copy), наследованием (опция Inherit) или непосредственным использованием. В большинстве случаев достаточно согласиться с копированием (опция по умолчанию) для того, чтобы можно было свободно манипулировать диалогом.
Согласимся с созданием простого стандартного диалога и посмотрим, что из этого получилось:
Пример 9.4. Объявление диалога
type TOKBottomDlg = class(TForm) OKBtn: TButton; CancelBtn: TButton; Bevel1: TBevel; private { Private declarations } public { Public declarations } end;
Из объявления видно, что диалог является формой, на которой добавлены две кнопки типа TButton и рамка типа TBevel (для оформления).
Почему же тогда диалог ведет себя не как обычная форма, а именно – появляется посередине экрана, закрывается при нажатии клавиш "Ввод" и "Esc"?
Выберем команду всплывающего меню View as Text и найдем отличия диалога от обычной формы.
Пример 9.5. Файл формы простого диалога
object OKBottomDlg: TOKBottomDlg Left = 245 Top = 108 BorderStyle = bsDialog Caption = 'Dialog' ClientHeight = 214 ClientWidth = 313 Color = clBtnFace ParentFont = True OldCreateOrder = True Position = poScreenCenter PixelsPerInch = 96 TextHeight = 13 object Bevel1: TBevel Left = 8 Top = 8 Width = 297 Height = 161 Shape = bsFrame end object OKBtn: TButton Left = 79 Top = 180 Width = 75 Height = 25 Caption = 'OK' Default = True ModalResult = 1 TabOrder = 0 end object CancelBtn: TButton Left = 159 Top = 180 Width = 75 Height = 25 Cancel = True Caption = 'Cancel' ModalResult = 2 TabOrder = 1 end end
Во-первых свойства BorderStyle = bsDialog и Position = poScreenCenter. Первое заставляет диалог показываться без кнопок изменения размеров окна, а второе – по центру экрана.
Для того, чтобы нажатие кнопки диалога закрывало его и диалог возвращал определенное значение необходимо установить свойство ModalResult у каждой кнопки, обозначающей вариант ответа.
В данном случае есть две кнопки, одна из которых закрывает диалог с результатом 1 (mrOk), а вторая – с результатом 2 (mrCancel).
Изменим диалог так, чтобы он приобрел следующий вид:
При этом свойства кнопок ModalResult установим в mrYes и mrNo соответственно.
Анализа ответа пользователя будем производить по значению, возвращаемому методом ShowModal (или свойства ModalResult).
Пример 9.6. Пример использования пользовательского диалога
if mrFriendShip=mrNone then begin OKBottomDlg.ShowModal; if OKBottomDlg.CheckBox1.Checked then mrFriendShip:=OKBottomDlg.ModalResult; end else if mrFriendShip=mrYes then ShowMessage('Да будем, будем...') else ShowMessage('Я же сказал - нет!');
Поскольку пользовательские диалоги в процессе работы с программой вызываются относительно редко, чаще всего их экземпляры создаются динамически во время выполнения.
Пример 9.7. Пример использования пользовательского диалога с динамическим созданием формы
TAboutBox.Create(Self).ShowModal;
Сам код диалога может быть достаточно сложным и выполнять какие-либо вычислительные задачи, например получение сведений о версии программы и правах.
Пример 9.8. Пример диалога о программе
unit About; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, Buttons, ExtCtrls, rxVerInf; type TAboutBox = class(TForm) Panel1: TPanel; ProgramIcon: TImage; lblProductName: TLabel; Version: TLabel; Copyright: TLabel; lblComments: TLabel; OKButton: TButton; Label1: TLabel; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var AboutBox: TAboutBox; implementation {$R *.dfm} procedure TAboutBox.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=caFree; end; procedure TAboutBox.FormCreate(Sender: TObject); begin ProgramIcon.Picture.Assign(Application.Icon); with TVersionInfo.Create(Application.ExeName) do begin try lblProductName.caption:=Application.Title; Copyright.Caption:=LegalCopyright; Version.Caption:=Format('Версия %d.%d.%d '#13'(сборка %d)',[ FileLongVersion.All[2], FileLongVersion.All[1], FileLongVersion.All[4], FileLongVersion.All[3] ]); lblComments.Caption:=Comments; finally Free; end; end; end; end.