2. Пользовательские диалоги

2.1. Разработка формы пользовательского диалога

Строго говоря, пользовательский диалог представляет собой обычную форму Delphi, показываемую модально. Модальной становиться любая форма, если она показывается с помощью метода ShowModal.

Примечание

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

Создание нового диалога производится как и создание любого нового элемента проекта с вызова мастера с помощью команды меню File/New/Other.

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

Рис. 1. Мастер создания пользовательского диалога

Рис. 9.1. Рис. 1. Мастер создания пользовательского диалога


В мастере есть возможность выбрать способ создания диалога – простым копированием (опция Copy), наследованием (опция Inherit) или непосредственным использованием. В большинстве случаев достаточно согласиться с копированием (опция по умолчанию) для того, чтобы можно было свободно манипулировать диалогом.

Согласимся с созданием простого стандартного диалога и посмотрим, что из этого получилось:

Рис. 2. Простой диалог, созданный с помощью мастера Delphi

Рис. 9.2. Рис. 2. Простой диалог, созданный с помощью мастера Delphi


Пример 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).

Изменим диалог так, чтобы он приобрел следующий вид:

Рис. 3. Сложный пользовательский диалог

Рис. 9.3. Рис. 3. Сложный пользовательский диалог


При этом свойства кнопок 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;

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

Рис. 4. Вариант диалога "О программе"

Рис. 9.4. Рис. 4. Вариант диалога "О программе"


Пример 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.