Пример 2. Диалоговые окна

 

Разработаем приложение, осуществляющее ввод и вывод информации с помощью диалоговых окон. В приложении будет 5 кнопок, при нажатии на одну их 4 первых кнопок будет появляться диалоговое окно, а при нажатии на последнюю кнопку приложение должно завершать свою работу.

 

В окне Object Inspector на вкладке Properties необходимо установить следующие значения для свойств формы:

Свойство

Значение

Caption

Диалоговые окна

Height

75

Width

537

Left

300

Top

200

 

Следует заметить, что такие свойства как Height, Width, Left, Top можно изменять, не используя окно Object Inspector. Свойства Height и Width можно изменить, наведя курсор мыши к краю формы, и когда он примет вид двусторонней чёрной стрелки, удерживая нажатой левую кнопку мыши, переместить мышь. Положение формы, т.е. свойства Left и Top, можно изменить, если навести курсор мыши к строке заголовка окна и, удерживая нажатой левую кнопку мыши переместить окно. Т.е. изменение размеров формы и её положения осуществляется таким же способом, как это делается с обычными окнами в Windows. Но, если необходимо установить точные значения, то без окна Object Inspector не обойтись.

 

Разместите на форме 5 кнопок редактирования и установите для них следующие свойства в окне Object Inspector:

Свойства, одинаковые у всех 5 кнопок:

Width

97

Top

8

Следующие свойства различны для каждой кнопки:

Button1

Caption

InputBox

Left

8

 

Button2

Caption

MessageDlgPos

Left

112

 

Button3

Caption

MessageDlg

Left

216

 

Button4

Caption

ShowMessage

Left

320

 

Button5

Caption

Выход

Left

424

 

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

 

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

Сделаем так, чтобы при нажатии на первую кнопку появлялось диалоговое окно с полем редактирования, в которое можно было бы ввести какое-нибудь слово, а при нажатии на вторую кнопку появлялось окно с сообщением, отображающим введённое слово. При нажатии на третью кнопку также выдаётся окно введённым словом, и в этом окне присутствуют несколько кнопок. При нажатии на четвёртую кнопку появляется диалоговое окно с сообщением о том, какую кнопку нажал пользователь в предыдущем окне.

Для работы второго и третьего окон понадобится переменная строкового типа, для работы четвёртого окна понадобится ещё две переменные – строковая и целочисленная.

 

В разделе объявления переменных добавьте три новые переменные.
 

var

   str1,str2 : string;

   x : integer;

   

Чтобы ввести текст процедуры, описывающей событие OnClick, для кнопки не обязательно открывать вкладку Events окна Object Inspector, достаточно сделать двойной челочек левой кнопкой мыши по той кнопке, для которой необходимо написать процедуру, тогда откроется окно кода программы с зарезервированной заготовкой для описания процедуры.

 

Процедура для первой кнопки выглядит следующим образом:

 

procedure TForm1.Button1Click(Sender: TObject);

begin

   str1 := InputBox('Пользователь','Введите слово','Слово');

end;


При нажатии на первую кнопку будет выдаваться диалоговое окно с полем ввода, в котором уже будет некоторое содержимое – «Слово». Если пользователь не изменит строку в поле редактирования, то переменной str1 будет присвоено значение «Слово», в противном случае переменной присваивается значение, введённое в поле редактирования.

 

Процедура для второй кнопки:
 

procedure TForm1.Button2Click(Sender: TObject);

begin

  ShowMessagePos (str1,300,200);

end;

 

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

 

Процедура для третьей кнопки:
 

procedure TForm1.Button3Click(Sender: TObject);

begin

  x := MessageDlg ('Вы ввели слово "'+str1+'"', mtInformation,

                   [mbOK,mbYes,mbNo,mbIgnore,mbCancel], 0);

end;

 

При нажатии на третью кнопку будет появляться информационное диалоговое окно, отображающее значение переменной str1, окно будет закрываться при нажатии любой из пяти кнопок: OK, Yes, No, Ignore, Cancel или закрытии окна с помощью стандартной кнопки для всех окон Windows, либо нажатии клавиши Esc. Так как необходимо запомнить, какую кнопку нажал пользователь, то переменной x присваивается значение процедуры MessageDlg, таким образом, переменная будет хранить значение результата.

 

Процедура для четвёртой кнопки:

 

procedure TForm1.Button4Click(Sender: TObject);

begin

   case x of

    0: ShowMessage ('Вы ничего не нажали в предыдущем диалоговом окне');

    1: str2 := '"OK"';

    2: str2 := '"Cancel" или закрыли окно';

    5: str2 := '"Ignore"';

    6: str2 := '"Yes"';

    7: str2 := '"No"';

   end;

   if x<>0 then ShowMessage ('Вы нажали кнопку '+str2);

end;

 

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

Содержимое данного окна полностью зависит от того, как пользователь работал с третьим окном. Если пользователь не нажимал на третью кнопку, тогда переменная x имеет значение, равное нулю, и в четвёртом окне выдастся сообщение о том, что пользователь ничего не нажимал в третьем окне. Если же пользователь уже работал с третьим окном, то переменной x присвоится некоторое значение в зависимости от того, какая кнопка была нажата. В данной процедуре переменная x не меняется, в зависимости от её значения присваивается какое-либо значение переменной str2 и выдаётся соответствующее сообщение.

 

Процедура для пятой кнопки:

 

procedure TForm1.Button5Click(Sender: TObject);

begin

   Form1.Close;

end;

 

Данная процедура осуществляет завершение работы приложения.

 

Вид приложения при его запуске:

 

 

Вид диалогового окна, появляющегося при нажатии на первую кнопку:

 

 

Вид диалогового окна, появляющегося при нажатии на вторую кнопку:

 

 

Вид диалогового окна, появляющегося при нажатии на третью кнопку:

 

 

Вид диалогового окна, появляющегося при нажатии на четвёртую кнопку:

 

 

Текст кода модуля
 

unit Unit1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

 

type

  TForm1 = class(TForm)

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    Button4: TButton;

    Button5: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Button4Click(Sender: TObject);

    procedure Button5Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

  str1,str2: string;

  x: integer;

 

implementation

 

{$R *.dfm}

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  str1 := InputBox('Пользователь','Введите слово','Слово');

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin

   ShowMessagePos (str1,300,200);

end;

 

procedure TForm1.Button3Click(Sender: TObject);

begin

  x := MessageDlg ('Вы ввели слово "'+str1+'"', mtInformation,

                    [mbOK,mbYes,mbNo,mbIgnore,mbCancel], 0);

end;

 

procedure TForm1.Button4Click(Sender: TObject);

begin 

   case x of

    0: ShowMessage ('Вы ничего не нажали в предыдущем диалоговом окне');

    1: str2 := '"OK"';

    2: str2 := '"Cancel" или закрыли окно';

    5: str2 := '"Ignore"';

    6: str2 := '"Yes"';

    7: str2 := '"No"';

  end;

  if x<>0 then ShowMessage ('Вы нажали кнопку '+str2);

end;

 

procedure TForm1.Button5Click(Sender: TObject);

begin

   Form1.Close;

end;

 

end.