Программирование диалоговых окон на языке DCL
Функция done_dialog
Функция done_dialog используется только внутри LISP-выражений в функции action-tile или атрибуте action. Она закрывает диалоговое окно и передает значение, которое будет возвращаемым значением функции start_dialog. Синтаксис:
(done_dialog [<число>])
Аргумент <число> - это положительное целое число, которое станет возвращаемым значением функции start_dialog. Возвращаемое значение - список из двух целых чисел с координатами левого верхнего угла диалогового окна в момент его закрытия.
Пример:
(done_dialog 92) - может вернуть список (220 180), а функция start_dialog при этом вернет 92.
Функция term_dialog
Функция term_dialog закрывает все открытые диалоговые окна так, как будто пользователь вышел из каждого из них, нажимая кнопку Cancel. Синтаксис:
(term_dialog)
Возвращаемое значение - nil.
Если работа приложения прерывается по какой-то причине, а некоторые диалоговые окна остались незакрытыми, то система AutoCAD сама обеспечивает вызов функции term_dialog.
Функции управления элементами диалога
Несколько функций языка LISP управляют элементами и их действиями. Они позволяют выполнять следующие операции:
- задавать LISP-выражение, выполняемое при выборе элемента и нажатии клавиши ENTER или щелчке левой клавишей мыши (функция action_tile);
- отключать элемент и включать его (функция mode_tile);
- читать текущее содержимое элемента (функция get_tile);
- менять текущее содержимое элемента (функция set_tile);
- читать значение атрибута элемента (функция get_attr);
- связывать с элементом данные пользователя (функция client_data_tile).
Функция action_tile
Функция action_tile задает при помощи LISP-выражения действие, которое нужно выполнить системе AutoCAD при выборе элемента или редактировании его содержимого. Синтаксис функции:
(action_tile <код> <выражение>)
Аргументы: <код> - строка с кодом элемента, <выражение> - строка с LISP-выражением. Возвращаемое значение - Т.
Большинство элементов диалогового окна являются элементами управления. Для них должны быть описаны действия, выполняемые системой AutoCAD при выборе пользователем этого элемента. Под выбором элемента имеются в виду, в частности, такие события, вызванные пользователем:
- нажатие клавиши Enter;
- щелчок мышью по кнопке Button;
- редактирование содержимого поля edit_box;
- выбор элемента списка list_box или popup_box;
- движение шкалы элемента slider.
Отклик системы на события окна совершается тогда, когда после операции с одним элементом курсор перейдет к другому элементу или пользователь выйдет из диалогового окна с помощью кнопки выхода.
Такое действие для каждого элемента может быть задано с помощью атрибута action DCL-файла. Значением атрибута может быть строка с LISP-выражением (там не должно быть функции command). Другой вариант задания действия - указание LISP-выражения в строке, передаваемой в качестве аргумента функции action_tile. Обращение к этой функции должно быть записано между вызовами функций new_dialog и start_dialog.
Действие, заданное с помощью аргумента <выражение> функции action_tile аннулирует действие, заданное значением атрибута action этого элемента в DCL-файле. Действие всегда задается через код элемента. Значение атрибута key передается функции action_tile в качестве аргумента <код>.
LISP-выражение в функции action_tile может использовать значения зарезервированных глобальных переменных со следующими именами:
- $value - текущее значение рассматриваемого элемента;
- $key - код рассматриваемого элемента;
- $reason - тип действия, выполненного над элементом;
- $data - данные элемента, заданные функцией client_data_tile;
- $x и $y - координаты указанной точки внутри изображения.
Примеры:
(action_tile "accept" "(done_dialog)") - действие кнопки выхода;
(action_tile "Test" (strcat "(if (<= (atoi $value) 0))" "(alert \"Отрицательные числа не допускаются!\")")) - проверка значения элемента на отрицательные числа или ноль;
В этом примере длинное LISP-выражение получено сцепкой двух строк. Обратите внимание на то, что внутренние двойные кавычки, необходимые для вызова функции alert, применяются с предшествующим слэшем.
(action_tile "Test" "(setq myTest 1) (saveVars) (done_dialog)")
По событию с элементом "Test" выполняется три действия: переменной myTest присваивается значение 1, запускается функция saveVars и закрывается диалоговое окно. Обратите внимание, что и код и выражение всегда берутся в кавычки.
Функция mode_tile
Функция mode_tile изменяет состояние элемента диалога. Синтаксис:
(mode_tile <код> <состояние>)
Аргументы: <код> - код элемента; <состояние> - целое число от 0 до 4 (см. таблицу). Возвращаемое значение - nil.
Значение | Действие |
---|---|
0 | Включить элемент |
1 | Выключить элемент (сделать недоступным) |
2 | Выбрать элемент |
3 | Подсветить содержимое элемента |
4 | Включить/выключить подсветку изображения |
При выключении элемента его цвет приглушается. Он становится недоступным для пользователя. Чтобы сделать его вновь доступным, его надо включить.
Примеры:
(mode_tile "k1" 1) - выключает элемент с кодом k1;
(mode_tile "k1" 0) - включает элемент с кодом k1.
Функция set_tile
Функция set_tile позволяет менять содержание диалога, заданное атрибутом value.
(set_tile <код> <значение>)
Аргументы: <код> - код элемента; <значение> - строка с новым значением, присваиваемым атрибуту value данного элемента.
Возвращаемое значение - значение второго аргумента, переданного функции.
Функция get_tile
Функция get_tile читает содержимое элемента диалога (текущее значение атрибута value). Синтаксис:
(get_tile <код>)
Аргумент - строка с кодом элемента.
Возвращаемое значение - строка с текущим значением атрибута value.
Функция get_attr
Функция get_attr читает значение атрибута элемента текущего каталога:
(get_attr <код> <атрибут>)
Аргументы: <код> - строка с кодом элемента, <атрибут> - строка с именем атрибута. Возвращаемое значение - строка со значением атрибута элемента.
Пример:
(get_attr "user" "alignment") - возвратит "centered"
Функция client_data_tile
Функция client_data_tile связывает с элементом диалогового окна строку с пользовательскими данными. Синтаксис:
(client_data_tile <код> <данные>)
Аргументы: <код> - строка с кодом элемента, <данные> - строка с пользовательскими данными. Возвращаемое значение - nil.
Чтобы обратиться к данным, присоединенным к элементу диалогового окна, нужно прочитать значение переменной $data в функции action_tile. Так можно изменять действие, присвоенное элементу, в зависимости от пользовательских данных.
Пример:
(client_data_tile "user" "2110") - связывает строку 2110 с элементом "user".
Переменные действия
Во время работы диалогового окна система AutoCAD формирует значения глобальных переменных, которые называются переменными действия:
$key, $value, $reason, $data, $x, $y.
В них сохраняются некоторые дополнительные данные о состоянии диалогового окна и выполненных в нем действиях пользователя. Переменные используются в LISP-выражениях, задаваемых в качестве второго аргумента функции action_tile. Вне этой функции значения переменных действия не определены.
Пользовательская программа не может изменять значения этих переменных и должна применять их только для чтения. В таблице рассматриваются различные варианты формирования значений переменных действия.
Примеры:
(action_tile "user" "(setq nam (strcat \ "Пользователь: \" $value))"); (action_tile "cldat" "(setq tyg (read $data))");