На этом шаге мы рассмотрим создание диалогового окна.
До этого момента мы создавали только обычные окна. Однако большинство приложений содержит больше диалоговых окон, чем обычных окон. Диалоговые окна используются как формы или как совокупности элементов управления. Диалоговые окна - это специализированные окна, в которых программе не нужно что-либо рисовать или обновлять их содержимое. Элементы управления используются в качестве пользовательского интерфейса для ввода, вывода или модификации значений.
Существует два вида диалоговых окон: немодальные и модальные. Немодальные диалоговые окна похожи на окна, которые мы создавали ранее. Вы можете открывать немодальное диалоговое окно и продолжать работать с другими окнами. Но когда вы создаете модальное диалоговое окно, система входит в специальный редактор, в котором нельзя работать с другими окнами или диалоговыми окнами (в пределах данного приложения) до тех пор, пока вы не закроете модальное диалоговое окно.
Код для обработки диалогового окна может быть очень похож на код для обработки окна. Существует предикат для создания диалогового окна и предикат обработчика событий, который получает все события для этого диалогового окна. По событию e_Create вы можете инициализировать все элементы управления, а когда нажата кнопка ОК, вы можете получить все значения.
Однако, в качестве одной из опций проекта, имеется также диалоговый пакет, который может автоматизировать большую часть тривиальной работы, связанной с диалоговыми окнами. Используя этот пакет, можно инициализировать элементы управления, возвращать значения после завершения и делать проверки правильности данных. Диалоговый пакет поддерживается экспертом окон и диалоговых окон, поэтому для каждого элемента управления можно определить тип содержимого, требования проверки правильности и Пролог-переменные (для возвращаемых значений).
Для того чтобы реализовать пример использования диалоговых окон, выполните следующие действия:
Здесь надо использовать визуальные компоненты: статический текст (static text) для написания заголовков перед элементами редактирования и списка элементов, рамка, которая окружает кнопки Male и Female.
Скомпонуйте ваше диалоговое окно следующим образом (рис. 1).
Рис.1. Компоновка диалогового окна
Затем вызовите эксперта кода для диалогового окна, выберите исходный модуль dialogs.pro и выберите стиль кода dialog_Create перед активизацией кнопки Default Code (рис. 2).
Рис.2. Добавление кода для диалогового окна
Чтобы увидеть, как работает сгенерированный по умолчанию код, вам нужно добавить дополнительное предложение для события пункта меню Task окна Test | Dialog, вставить вызов для создания диалогового окна и запустить приложение.
Чтобы наше новое диалоговое окно нормально работало, снабдим его входными значениями и "попросим" возвращать набор значений после того, как оно будет закрыто. Кроме того, для некоторых элементов управления можно устанавливать особые параметры или выполнять необходимые правила верификации.
Для того чтобы упростить задачу, вы можете использовать эксперт диалогового пакета - инструмент, который отражает все опции, доступные в диалоговом пакете. В дополнение к определению различных опций этого пакета, вы можете также использовать его для того, чтобы давать имена Пролог-переменным, которые будут содержать входные значения и получать выходные значения.
Самый простой способ вызвать эксперт диалогового пакета - выбрать имя диалогового окна в окне проекта, выбрать эксперт кода и затем нажать кнопку Dialog Pack.
Экран эксперта диалогового пакета разделен на две части (рис. 3). Левая область всегда содержит список доступных элементов управления. Некоторые из них снабжены префиксом + (плюс): двойной щелчок на + отображает более детальную информацию. Правая сторона используется для отображения и изменения различных настроек выбранного элемента управления.
Рис.3. Эксперт диалогового пакета. Поле имени
Выберите элемент управления, который должен содержать имя человека idc_name -тип переменной должен быть строковый (string). Нажмите на значок + и, когда он изменится на -, выберите из раскрывшегося списка значение Init value, щелкните на кнопке списка Setting method, затем выберите значение Variable, чтобы указать, что начальное значение задается из переменной. В поле Variable (init) вы должны ввести имя переменной - Name. Ваше диалоговое окно теперь должно выглядеть так же, как на рис. 3.
Точно так же для поля возраста Age вы определите, что (рис. 4):
Рис.4. Эксперт диалогового пакета. Поле возраста
Элемент управления idc_married - это независимый переключатель; мы определяем, установлен ли он, по значению переменной Married (рис. 5).
Рис.5. Эксперт диалогового пакета. Поле семейного положения
Следующий элемент управления - список навыков (рис. 6). Это список с возможностью множественного выбора, т. к. человек может обладать множеством разнообразных навыков. Пункты списка в окне списка всегда постоянны, а навыки человека выбраны (высвечены).
Рис.6. Эксперт диалогового пакета. Список навыков
В диалоговом окне Alternatives вы можете ввести список статических элементов в виде строк, разделенных запятыми. В диалоговом окне Init value вы можете определить, что переменная Skills будет возвращать список целых чисел (индексы выбранных навыков).
Также в эксперте диалогового пакета нужно:
Новые группы переключателей создаются при нажатии кнопки New; кнопки Add и используются, чтобы добавлять (удалять) зависимые переключатели в группы (рис.7).
Рис.7. Эксперт диалогового пакета. Группа зависимых переключателей
На следующем шаге мы рассмотрим сгенерированный код.