logo
Algus0309

Разработка диалогового окна

В предыдущем параграфе было рассмотрено использование стандартного диалогового окна. В этом пункте рассмотрим создание собственного диалогового окна. Используем там два новых элемента управления: кнопки выбора (CheckBox) и радиокнопки (RadioButton). Оба они предназначены для определения, прежде всего, режимов работы программы. Отличие заключается в следующем. Радиокнопки предназначены для выбора из взаимоисключающих возможностей, для кнопок выбора такого ограничения нет. Другими словами, если имеем n (n1) кнопок, то в случае радиокнопок должна быть нажата одна и только одна кнопка. В случае кнопок выбора можно выбрать от 0 до n кнопок. Название “радиокнопка”, говорят, связано с тем, что на многих радиоприемниках выбор диапазона волн осуществляется нажатием одной-единственной кнопки. Радиокнопки обычно объединяют в группу (RadioGroup), если таких групп несколько, то из каждой группы выбирают одну кнопку.

Для создания диалогового окна используем стандартное окно из галереи. Вспомним, как мы включили в свое приложение окно About! Поступим точно так же, выберем из меню Delphi последовательно Tools, Repository, Dialogs, Standard Dialog. Имеется два варианта окна Standard Dialog. Они отличаются только расположением кнопок ОК и Cancel (внизу или справа), поэтому можно выбрать любой. Окно Standard Dialog – это класс типа TOKRightDlg. Свойство FormStyle диалогового окна должно иметь значение fsMDIChild, что означает дочернее окно. На диалоговое окно занесем следующие компоненты:

В диалоговом окне уже имеются две кнопки нажатия ОК и Cancel.

Рассмотрим это подробнее. Начнем с кнопок выбора. Дадим им названия (свойство Caption) “Случай 1” и “Случай 2”. Их именами (свойство Name) по умолчанию являются CheckBox1 и 2. Не будем их менять, по этим именам можно ссылаться на них в программах. Обратим внимание на свойство “Checked”: если оно имеет значение True, то эта кнопка считается нажатой при запуске программы. Проверяя в программе значение этого свойства, можно определить, какие кнопки выбраны.

Группе радиокнопок дадим название “Выбор варианта”; именем оставим RadioGroup1. Названия и количество самих радиокнопок определяется свойством Items. Это свойство имеет три точки и для выбора значений откроем диалоговое окно, в котором набираем названия кнопок, каждое в отдельную строку. В нашем случае “Вариант 1” и “Вариант 2” (2 строки). Свойство Columns задает количество столбцов радиокнопок внутри группы, по умолчанию оно имеет значение 1, что нас устраивает. При большом количестве кнопок в группе можно предусмотреть их расположение в нескольких столбцах. Свойство ItemIndex задает номер кнопки, выбранной при запуске программы, нумерация кнопок начинается с нуля. Значение 1 означает, что ни одна кнопка не отмечена. Выберем значение 1, что означает “точку” в нижней кнопке. Проверяя в программе значение этого свойства, можно определить, какая кнопка выбрана.

Метка и строка редактирования ничем не отличаются от рассмотренных в первой главе.

На этом оформление диалогового окна завершено, приступим к реализации работы с ним. Необходимо решить следующие задачи:

В Delphi все окна могут создаваться

По умолчанию все окна создаются автоматически. Часто это нецелесообразно, потому что созданные окна, даже если они невидимы, расходуют ресурсы ЭВМ, при сложных окнах они могут быть значительными. Поэтому рекомендуют создать автоматически при запуске программы главное окно.

Для вывода формы из числа автоматически создаваемых войдем в меню Delphi, выберем пункт Project, затем Options и активизируем там окно Forms (обычно оно уже активизировано). Окно Forms показано на рис. 2.2. В левой колонке приведен перечень автоматически создаваемых форм (Auto-create forms). В правой колонке перечень форм, создаваемых в ходе выполнения программы по запросу пользователя (Available forms). Выделяем мышью форму OKRightDlg и нажмем на символ >. В результате эта форма переходит в правую колонку.

Приступим к программированию создания диалогового окна. Создаем в пункте меню File новый подпункт New Dialog (Как его создать – см. выше!). Его реализация:

procedure TForm1.NewDialog1Click(Sender: TObject);

Var

dlg6:TOKRightDlg;

{Объявляем локальную переменную типа TOKRightDlg }

begin

dlg6:=TOKBRightDlg.Create(Application);

{Создаем окно и присвоим его адрес переменной dlg6}

{ }

{Даем начальные значения компонентам диалогового окна}

{если этого не делать, то останутся значения,}

{заданные при проектировании формы }

dlg6.Edit1.Text:='Я живу в Москве';

dlg6.Checkbox1.Checked:=False;

dlg6.Checkbox2.Checked:=True;

dlg6.Radiogroup1.ItemIndex:=0;

dlg6.Show;

end;

Рис. 2.2. Окно выбора опций приложения

На работе с диалоговым окном нет необходимости подробно останавливаться: она ничем не отличается от работы со стандартными диалоговыми окнами Windows 95. Переходим к реализации закрытия окна, представленного на рис. 2.3. При нажатии на кнопку CANCEL внесенные во время диалога изменения не сохраняются, необходимо только закрыть окно (оператор Close;) и освободить занятые им ресурсы. Освобождение занятых ресурсов должно осуществиться при возникновения события “Закрытие окна” (onClose). Поэтому, находясь в создаваемом диалоговом окне, переключим его инспектор объектов на события, найдем событие onClose и делаем на нем двойной щелчок.

Реализация процедуры приведена ниже:

procedure TOKRightDlg.FormClose(Sender: Tobject;

var Action: TCloseAction);

begin

Action:=caFree;

end;

По умолчанию параметр Action имеет значение caMinimize, что означает минимизацию окна до иконки (в пределах главной формы). Точно такой же эффект имеет щелчок на значке  в углу формы (минимизация или ликвидация).

Рис. 2.3. Диалоговое окно

Остался последний вопрос: обеспечить сохранение внесенных во время диалога значений перед закрытием окна. Для этого необходимо до закрытия фиксировать внесенные в ходе диалога значения. Их можно, например, присвоить переменным модуля главного окна. Только в этом случае придется в модуль диалогового окна добавить оператор Uses Multi1; (имя модуля главной формы), он должен быть в разделе реализации implementation, во избежание перекрестных ссылок между модулями. Текст процедуры закрытия с сохранением:

procedure TOKRightDlg.OKBtnClick(Sender: TObject);

begin

rida1:=Edit1.Text;

{присвоим значение переменным модуля главной формы}

b1:=CheckBox1.Checked;

b2:=CheckBox2.Checked;

RInd:=RadioGroup1.ItemIndex;

close;

end;

Примечание:rida1, b1, b2, RInd – переменные модуля главной формы, они должны быть там объявлены.

Для проверки правильности передачи значений из диалогового окна в данном учебном примере имеется в пункте меню Help подпункт Control New Dialog, при выборе которого введенные значения будут показаны на экране. Это сделано, естественно, только для демонстрации:

procedure TForm1.ControlnewDialog1Click(Sender: TObject);

Var