Оператор вывода на экран окна может работать и как процедура (т. е. не иметь выходных параметров), и как функция. В этом случае результатом является значение, определяющее, какая кнопка была нажата: либо mbNone (т. е. ни одна кнопка не была нажата), либо значение соответствующей клавиши, префиксом mr.
Примеры использование функции MessageDlg.
Пример 1
При нажатии на кнопку формы появляется диалоговое окно. При нажатии на кнопку Yes содержимое компонента RichEdit1 сохраняется
в файле D:\Temp\Пример.dat. Код процедуры будет иметь вид:
procedure TForm1.Button1Click(Sender: TObject);
begin
if MessageDlg('Изменения сохранить ',mtWarning, [mbYes, mbNo, mbCancel],0)=mrYes
then RichEdit1.Lines.SaveToFile('D:\Temp\Пример.dat');
end;
В данном примере вызывается диалоговое окно предупреждения.
В том случае, если оно закрывается нажатием кнопки Yes, содержимое компонента записывается в файл.
Пример 2
Вычислить значение f(x) = ln(x)×x c проверкой области значения данной функции. Значение переменной x определяется в компоненте Edit1.
В том случае, если данная функция существует для исходного аргумента, происходят вычисления, в противном случае выдается окно с сообщением об ошибке.
procedure TForm1.Button1Click(Sender: TObject);
Var x,y:Real;
begin
x:=StrToFloat(Edit1.Text);
if x<=0 then MessageDlg('Логарифм данного аргумента не существует', mtError, [mbOk],0)
else
begin
y:=ln(x)*x;
Edit2.Text:=FloatToStr(y);
end;
end;
Пример 3
Использовать окна можно и во время создания формы. Например, можно сделать так, чтобы до появления основной формы появлялось диалоговое окно с приглашением.
procedure TForm1.FormCreate(Sender: TObject);
begin
MessageDlg('Добро пожаловать', mtCustom,[mbYes],0);
end;
Диалоговое окно MessageDlg позволяет определить нажатую кнопку, но не имеет возможности для передачи информации от пользователя
в приложение. Для данной цели существуют еще две функции.
InputBox(Caption,Msg,Default:String):String — функция, которая выводит диалоговое окно с заголовком Caption, сообщением Msg и поле для ввода информации, в котором вначале находится текст, заданный строкой Default, а также двумя кнопками Ok и Cancel. Если диалоговое окно закрывается нажатием кнопки Ok, то функция возвращает набранную строку, в противном случае возвращается строка по умолчанию Default.
InputQuery(Caption,Msg:String, Var Value: String):Boolean — функция, которая выводит подобное диалоговое окно, однако строка ввода по умолчанию пустая. Если диалоговое окно закрывается нажатием кнопки Ok, то функция возвращает значение True и в параметре Value передается введенная строка, в противном случае возвращается значение False.
Пример 4
При нажатии кнопки появляется диалоговое окно, которое будет закрыто только в том случае, если введен пароль и нажата клавиша Ok.
procedure TForm1.Button1Click(Sender: TObject);
const pasword:string=’1111’; {Пароль }
var Value: string;
begin
value:='';
Repeat
Until (InputQuery(‘Мое приложение ‘,’Введите пароль’,value)) and (value=pasword);
end;
Изменим условие таким образом, что пароль можно вводить только определенное количество раз. Если пароль был введен неправильно, то все приложение закрывается. В этом случае можно рассмотреть событие onCreate для самого компонента Form, в процедуре обработки которого
и будет происходить проверка пароля. В этом случае имеем следующую процедуру:
procedure TForm1.FormCreate(Sender: TObject);
const pasword:string='1111'; {Пароль }
n=3; {Количество попыток}
var Value: string;
i:integer;
begin
value:='';
i:=0;
Repeat
i:=i+1
Until ((InputQuery('Мое приложение ','Введите пароль',value))
and (value=pasword)) or (i=n);
if i=n then form1.Close;
end;
В языке программирования Delphi реализовано несколько компонентов, позволяющие осуществить диалог между пользователем и программой. Эти компоненты находятся на странице Dialogs. Рассмотрим некоторые из них:
OpenDialog позволяют просматривать содержимое внешних запоминающих устройств и выбирать имя файла, который затем можно открыть для работы;
SaveDialog позволяют выбрать имена файлов для сохранения;
OpenPictureDialog SavePictureDialog предназначены для аналогичной работы с файлами, содержащими графическое изображение;
FontDialog предназначен для определения параметров шрифта.
Существуют также диалоговые окна, выбирающие текущий цвет, параметры печати, осуществляющие поиск файлов и т. д. Все компоненты, которые позволяют отображать диалоговые окна, представлены на рисунке 20.
Рассмотрим более подробно компоненты OpenDialog и SaveDialog. Свойство FileName, которое доступно как во время проектирования, так
и во время выполнения содержит имя искомого файла.
Свойство Filter имеет текст фильтров файлов. Он представляет собой любое количество пар последовательных символов. В каждой паре первая часть задает текст фильтра, выдаваемый в диалоговом окне, а вторая часть содержит сам фильтр. При выборе данного свойства в инспекторе объектов появляется диалоговое окно Filter Edit (рис. 21), которое состоит из двух частей: первая имеет имя Filter Name и предназначена для ввода текста фильтра, вторая имеет имя Filter и задает сам фильтр.
Рисунок 20
Рисунок 21
Для вывода диалогового окна на экран предназначен метод-функция Execute, которое возвращает значение True, если диалоговое окно было закрыто кнопкой Ok, и False — в противном случае.
В диалоговом окне FontDialog с помощью свойства Font можно установить начальное значение шрифта и затем посредством того же свойства определить выбранный в диалоговом окне шрифт.
Пример 5
Создать программу, которая позволяет читать, создавать текстовые файлы в формате RTF, а также менять шрифт.
Для решения данной задачи поместим на форму компонента RichEdit, в котором будем обрабатывать содержимое текстового файла, OpenDialog и SaveDialog для выбора имени файла, компонент FontDialog для выбора шрифта и несколько компонентов Button. Первый из них будет отвечать за чтение файла, второй — за запись файла, третий — за выбор шрифта, следовательно, свойству Name первой кнопки можно придать значение «Open», второй «Save», а третьей «Font». Тогда процедуры обработки нажатий на эти кнопки будут иметь следующий вид:
procedure TForm1.SaveClick(Sender: TObject);
begin
If SaveDialog1.Execute
Then RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
end;
procedure TForm1.OpenClick(Sender: TObject);
begin
If OpenDialog1.Execute
Then
begin
RichEdit1.Lines.Clear;
RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
end;
procedure TForm1.FontClick(Sender: TObject);
begin
If FontDialog1.Execute
Then RichEdit1.Font:=FontDialog1.Font;
end;
Если всех имеющихся возможностей ввода на экран сообщений и ведения диалога не хватает, то в проект может быть добавлена дополнительная форма с помощью пункта меню File New, Form. В этом случае
в проект автоматически добавляется еще одна форма и в редакторе кода появляется третья закладка, которая указывает на модуль данной формы. По умолчанию первая созданная форма является активной и при загрузке приложения именно она появляется на экране. Вторая форма может быть выдана как в модальном виде, используя метод ShowModal, так и не модальном — метод Show. Если форма выдается как модальная, то она блокирует выполнения приложения до своего закрытия.
При работе в Delphi имеется возможность пользоваться ранее созданными модулями и формами, для этого они должны быть помещены в специальное хранилище — репозиторий. Открыть репозиторий можно при помощи команды меню File, New, Other... При этом появляется диалоговое окно New Items (новый элемент), в котором можно выбрать необходимый в новом приложении элемент. Все элементы, находящиеся в репозитории, располагаются на различных страницах.
Добавить форму в репозиторий можно с помощью пункта меню Project, Add to Repository… В этом случае необходимо выбрать названия для элемента, страницу, на которой он будет располагаться и пиктограмму.
Пример 6
Создать проект, имеющий дополнительную форму, на которой находится дополнительная информация об авторских правах и которая
вводится при нажатии кнопки на главной форме. Воспользуемся формой, созданной в примере 2.
Теперь необходимо в проект добавить эту форму. Можно воспользоваться командой New Form пункта меню File для добавления чистой формы или выбрать заготовленную форму, имеющуюся в репозитории. Для этого выберем команду New пункта File и на закладке Form выберем компонент с именем About Box. После этого в проекте добавится новая форма с именем AboutBox из класса TAboutBox и модуль с именем Unit2. Форма AboutBox содержит несколько меток (компонент Label), одно изображение (компонент Image) и кнопку (компонент Button). Воспользовавшись свойством Caption компонента Label, можно изменить выводимую информацию, и свойством Picture компонента Image — выводимую картинку. При нажатии на кнопку форма должна закрываться, следовательно, процедура обработки этого события будет содержать команду Close или AboutBox.Close. В этом случае весь модуль Unit2 будет иметь вид:
unit Unit2;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
type
TAboutBox = class(TForm)
Panel1: TPanel;
ProgramIcon: TImage;
ProductName: TLabel;
Version: TLabel;
Copyright: TLabel;
Comments: TLabel;
OKButton: TButton;
procedure OKButtonClick(Sender: TObject);
private
public
end;
var AboutBox: TAboutBox;
implementation
{$R *.DFM}
procedure TAboutBox.OKButtonClick(Sender: TObject);