Вы находитесь на страницах старой версии сайта.
Переходите на новую версию Interface.Ru

СТАТЬЯ
28.11.02


Предыдущая часть

Изучаем программирование
в Team Developer/Gupta

Шаг 3 : Меню, массивы, диалоги и прокрутка

© Большаков С. А., к.т.н.,
технический консультант Interface Ltd.

Введение

Если Вы познакомились с первыми двумя статьями данной серии, то, несомненно, обратите внимание на то, что мы изменим стиль изложения материала. Во-первых, Вы уже много знаете для дальнейшей работы, а во-вторых, мы постараемся излагать материал более интенсивно, что позволит нам вместе двигаться быстрее. Для успешного освоения данного материала, который, мы очень надеемся, может служить своеобразным самоучителем программирования на Gupta Team Developer, желательно познакомиться и выполнить задания статей "Шаг 1"  и "Шаг 2" .

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

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

Меню и диалоги TD

Работа с оконными меню. Редактор меню и ручной способ настройки

Ниже представлено главное окно приложения для изучения принципов построения меню и работы с окнами диалога. Назовем его (приложение) step3_dialog.app. Данное окно типа - Form Window. Меню в TD можно создавать для окон любого класса, кроме окон диалога (Dialog Box).

Рис. 1. Окно приложения для изучения меню и окон диалога в TD

Для создания меню можно использовать ассистент кодирования или визуальный редактор меню (Component->Menu Editor или "Правая кнопка"-> Menu Editor). Редактор меню, его окно показано на рисунке ниже, позволяет ввести и настроить пункты меню, построить вложенное меню (POPUP), задать порядок пунктов меню, разделители, настроить текст подсказки (Status Text) и определить горячие клавиши для пункта (Accelerator). Кроме этого Вы можете определить состояние пункта меню (доступен или недоступен, помечен или не помечен) с помощью констант, переменных и функций, а также задать вызываемую функцию или запускаемое окно приложения. Работа с редактором меню интуитивно понятна, а результат настроек отображается автоматически в OUTLINE окна и может в дальнейшем редактироваться вручную.

Рис. 2. Визуальный редактор меню TD

Результат конструирования меню будет занесен в текст разрабатываемой программы, который показан на рисунке ниже. Для наглядности здесь приведено дерево окна (слева), в котором для главного окна (frmFirst) выделена позиция оконного меню (Windows Menu), а справа показан текст построенного меню.

Рис. 3. Текстовое редактирование меню в режиме OUTLINE

Для наглядности не все пункты меню развернуты (мы их рассмотрим далее) и приведен фрагмент окна ассистента кодирования в режиме добавления новых позиций меню. Можно добавить: новую позицию меню (Menu Item), вложенное меню (Popup Menu), поименованное меню (Named Menu), стандартное меню управления окнами (Windows Menu), строки меню (Menu Row) и колонки меню (Menu Collumn). Последние две позиции позволяют организовать строчное меню в виде нескольких строк, а ниспадающее меню из нескольких колонок. Кроме того, можно в ниспадающем меню вставить разделители (Menu Separator).

Рис. 4. Окно приложения для изучения меню и окон диалога в TD

На рисунке, представленном ниже дан перечень основных объектов окна приложения, которое мы будем использовать для изучения режимов меню и работы с окнами диалога. Эти объекты соответствуют визуальным объектам окна.

Рис. 5. Объекты окна приложения для изучения меню и окон диалога в TD

Кнопка pbClose, обеспечивает закрытие окна. Поле dfNumMain служит для ввода целочисленного параметра, передаваемого в диалог. Поле mlStrMain (типа Multiline Field) служит для ввода многострочного параметра, передаваемого в диалог. Поле dfIndic, недоступное для редактирования, используется для индикации изменения строки передаваемой в диалог.

Меню. Деактивация и пометка пунктов меню

Состоянием меню можно легко управлять в процессе выполнения программы. Для этого могут быть заданы переменные или функции для описателей меню, содержащихся в разделе Menu Settings: Enadled when ("доступно, если") и Checked when ("помечено если"). В этих разделах OUTLINE можно:

  1. Ничего не задавать (по умолчанию "доступно" и "не помечено");
  2. Задать константу (TRUE и FALSE);
  3. Задать переменную (см. в примерах ниже - bQuit) или
  4. Выполнить вызов функции (см. ниже - MenuCheck).

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

Рис. 6. Главное окно с подменю.
Пункт "Вызов диалога" помечен и пункт "Диалог" недоступен.

Ниже дан фрагмент текста программы, содержащий код обработки пункта меню "Диалог". Реакция на активизацию пункта меню приводит к выполнению подпрограммы на языке SAL определенному в разделе Menu Actions. В данном пункте:

  1. Настраиваются поля окна и параметры для вызова диалога,
  2. Отключается пункт меню изменением переменной bQuit на FALSE,
  3. Проверяются и устанавливаются значения параметров (скрыто для краткости) и
  4. Вызывается окно диалога.

Рис. 7. Описание меню вызова окна диалога

После возврата из окна диалога:

  1. Проверяется код возврата (nCount), передаваемый из диалога.
  2. Анализируется возвращаемый параметр (strCommon) и
  3. Выводятся сообщения на экран со значением кода возврата (скрыто в if) и Значение возвращаемого параметра (strCommon - последняя строка).

Установки меню для другого вложенного пункта меню "Вызов диалога" сделаны так, что этот пункт всегда доступен (Enabled when - TRUE) и пометка управляется специальной функцией (MenuCheck), фрагмент которой приведен ниже. Функция работает в режиме триггера (меняет попеременно возвращаемое значение с TRUE на FALSE и обратно). Функция управляет внешним параметром bCheck. Таким образом, "галочка" появляется попеременно в пункте вложенного меню.

Рис. 8. Установки меню и функция установки

Выключение пункта "Диалог" главного меню выполняется в его процедуре обработки (мы уже об этом говорили выше). Внешний параметр bQuit устанавливается в FALSE. После этого с помощью специальной функции SalDrawMenuBar обновляется состояние пунктов меню.

Рис. 9. Выключение пунктов меню с помощью переменной

Включение пункта "Диалог" главного меню выполняется следующим аналогичным образом. Параметр bQuit устанавливается в TRUE. Это показано на рисунке, представленном ниже.

Рис. 10. Включение пунктов меню с помощью переменной

Более сложные операции по управлению меню в TD можно выполнять с помощью библиотеки Visual Toolchest (VT), которую мы предметно рассмотрим в следующих статьях. После того как мы научились, в основном, управлять пунктами меню, рассмотрим, как создавать и вызывать диалоговые окна.

Создание и описание окна диалога

Вид окна диалога "Пробный диалог", которой мы будем рассматривать представлен ниже на рисунке. В данном окне определены данные, в которых высвечиваются параметры, передаваемые в диалоговое окно. Кроме того, выделен переключатель (Check Box), который для иллюстрации используется для управления кодом возврата из диалога.

Рис. 11. Вид вызываемого окна диалога

Данные объекты выделены также в дереве приложения на рисунке ниже. Отметим, в древовидной структуре описания объектов размещаются и объекты фонового текста (Background Text) для заголовков полей параметров ("1-й и 2-й параметры").

Рис. 12. Фрагмент дерева приложения для окна диалога dlgTest

Самое подробное описание диалогового окна представлено в тексте программы (OUTLINE), которое дано на нижнем рисунке. В первой строке описание дается название формы типа Dialog Box - dlgTest.

Рис. 13. Описание окна диалога dlgTest (текст OUTLINE)

Рис. 14. Описание параметров окна диалога

В разделе Windows Parameters задаются параметры (формальные параметры), которые передаются в окно при его запуске. В качестве параметров могут передаваться любые переменные языка SAL. В нашем случае это: целочисленный параметр nTest и параметр типа длинная строка (Long String) - strTest. Перед параметром strTest стоит префикс Receive, который означает, что данный параметр может быть возвращен в вызывающую процедуру (см. ниже). После запуска окна диалога обрабатывается сообщение SAM_CreateComplete и элементам оконного интерфейса диалога (dfNumber и mlTest) присваиваются значения передаваемых параметров. Значение переключателя кода возврата cbReturn (Check Box) устанавливается по умолчанию в положение FALSE (выключено). Главное окно в момент перед вызовом окна диалога показано на нижнем рисунке. Перед вызовом диалога из главного окна можно вручную задать значения передаваемых параметров, либо использовать значения, задаваемые по умолчанию (44 и " Пример текста, Занимающего две строки! " соответственно). На рисунке они уже занесены в поля ввода "Число:" и "Длинная строка:".

Рис. 15. Главное окно с параметрами вызова

Для иллюстрации выхода из предложения и вызова диалога создадим вложенное меню (POPUP), подчиненное пункту главного меню "Выход из подменю". Определим наименование пунктов (Menu Item) подменю так: "Выход из приложения" и "Вызов диалога". На рисунке, расположенном ниже, приведен пример описания вложенного меню. Вид этого подменю в раскрытом виде был показан на рисунке выше.

Рис. 16. Описание POPUP меню

Вызов окна диалога в программе выполняется с помощью функции SalModalDialog. Пример вызова дан ниже на рисунке.

Рис. 17. Вызов окна диалога и проверка кода возврата nCount

Первый фактический параметр при вызове этой функции задает имя диалога (dlgTest), второй параметр определяет переменную указатель вызывающего окна (hWndForm - это стандартная переменная, определяющая указатель текущего окна, у нас это окно - frmFirst). Третий и четвертый - это необязательные параметры диалога. Таких параметров при описании диалогов можно определить произвольное число. В нашем случае это: dfNumMain - целочисленное поле ввода окна и strCommon переменная окна типа Long String. Код возврата, возвращаемый диалогом, будет записан в специальную переменную (nCount). Анализ данной переменной позволяет выдать сообщение, приведенное ниже.

Рис. 18. Сообщение с индикацией кода возврата

Строка, возвращаемая из диалога (strCommon), может быть проверена и выведена на экран. Это показано ниже во фрагменте текста. Сначала проверяется изменение параметра и на экран главного окна выдается сообщение индикации изменений (поле - dfIndic, защищенное от редактирования). Поле экрана mlStrMain задается в операторе присваивания, а затем для иллюстрации принятая из диалога строка выводится в окне сообщений (SalMessageBox).

Рис. 19. Контроль возвращаемого параметра strCommon

Результат вывода приведен на рисунке, расположенном ниже.

Рис. 20. Сообщение с индикацией возвращаемого параметра

Завершение диалога

Завершение работы диалогового окна выполняется функцией SalEndDialog. Пример ее вызова в окне диалога показан на рисунке приведенном ниже.

Рис. 21. Фрагмент текста завершения диалога с параметром

По значению переключателя (cbReturn), который может быть установлен в самом диалоговом окне вручную, код возврата устанавливается в 0 или 1. Данные действия выполняются в разделе Message Actions при реакции на сообщение SAM_Click для кнопки pbClose окна диалога.

В результате выполненных действий Вы получите приложение step3_dialog.app, которое для проверки усвоения материала можно скачать здесь.

Продолжение статьи

За дополнительной информацией обращайтесь в компанию Interface Ltd.

Обсудить на форуме Gupta Technologies

Рекомендовать страницу

INTERFACE Ltd.
Телефон/Факс: +7 (495) 925-0049
Отправить E-Mail
http://www.interface.ru
Rambler's Top100
Ваши замечания и предложения отправляйте редактору
По техническим вопросам обращайтесь к вебмастеру
Дата публикации: 28.11.02