STDFORM


Синтаксис

STDFORM(form: STRING[];
        [ title: STRING[] ];
        [ style: STYLE];
        [ abortCode: NUMERIC[0] ];
        ...;
        [ idleFunc: PROC ];
        [ onChangeProc: PROC ];
        [ useProportionalBasicTextFont: SCAL[2] ]
       )[: NUMERIC[0] ];

STYLE = STOP | TRY_LATER | STOP_AND_CALL_ADMIN | STOP_AND_CALL_AUTHOR | MENU |
        CHOICE | QUESTION | INFORM | INFORM_RED | INFORM_NEUTRAL | NONE | LIKE_WDO

Описание

Поднимает для редактирования или просмотра пользователем форму ввода, возвращает реакцию пользователя. Форма - это модальный диалог, который может содержать основной текст, статические текстовые элементы управления (static text controls), и нестатические элементы управления: поля ввода (edit text controls), списки (list boxes), флажки (check boxes), селекторы (radio buttons groups), кнопки (push buttons). Одна из кнопок формы может быть таймирована, т.е. снабжена обратным счетчиком времени, по истечении которого имитируется нажатие кнопки. Структура формы задается строкой form со сложным синтаксисом, текст заголовка формы - строкой title. Параметр style определяет стиль формы; в текстовом представлении стиль отражается палитрой формы, в графическом - иконкой формы (см. ниже). По умолчанию используется стиль LIKE_WDO. Дополнительно может быть задан abortCode - ненулевой код исключения, выбрасываемого по отказу формы (см. ниже). Параметр abortCode не может быть равен нулю, иначе будет выброшено исключение 19.

Тремя точками в описании синтаксиса обозначена последовательность переменных, которые используются для передачи/получения значения в/из поля ввода, списки, флажки и селекторы, а также в таймированной кнопке (переменная-таймер). Переменные должны следовать в том порядке, в котором заданы в form параметризованные элементы управления. Если элемент управления запрещен, т.е. пользователь не может редактировать его значение, вместо переменной допускается результат выражения (к переменной-таймеру это не относится). Текст/формат элемента управления также может быть вынесен программистом из строки form в данный список параметров (перед соответствующей переменной). Параметр idleFunc задает функцию, которая будет регулярно (10 раз в секунду) вызываться во время работы формы. Параметр onChangeProc указывает процедуру, которая будет вызываться в случае успешного изменения значения переменной,  соответствующей нестатическому элементу управления.

Параметр useProportionalBasicTextFont позволяет запретить применение пропорционального шрифта для основного текста формы. Если флаг поднят, основной текст формы может быть отображен пропорциональным шрифтом, заданным свойством APP.ProportionalFontFace. В режиме разработчика или для программиста в инженерной копии проекта, а начиная с версии 14.274.170 безусловно, значение useProportionalBasicTextFont по умолчанию равно 1.

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

Содержание

  1. Специальные последовательности и элементы управления
  2. Акселераторы
  3. Кнопки и реакция
  4. Стиль
  5. Форматирование и выравнивание основного текста
  6. Функция idleFunc
  7. Процедура onChangeProc
  8. Откладывание
  9. Подавление
  10. Текстовый и графический виды

Специальные последовательности и элементы управления

Строка form может содержать основной текст, переводы строк, тэги отчеркивания и специальные последовательности, задающие элементы управления. Переводы строк задаются символом '|', символом CHR(10), или подстрокой CHR(13)+CHR(10). Горизонтальные отчеркивания задаются тэгом отчеркивания (с параметром TITLE или без него), например CHR(29)+"HR TITLE='Рекомендация'"+CHR(29). Перед тэгом отчеркивания и после тэга отчеркивания безусловно добавляются по одному переводу строки. Например, строка "текст 1"+CHR(10)+CHR(29)+"HR"+CHR(29)+CHR(10)+"текст 2" даст следующий результат (здесь не указаны отступы, про которые см. ниже "Текстовый и графический виды"):

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

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

Специальная последовательность начинается с символа процент ('%') и заканчивается символом, задающим тип элемента управления формы. Чтобы вывести просто символ процента, следует использовать последовательность "%%". Функция Str.StdFormEscape дублирует все символы '%' в строке, чтобы они не воспринимались как начало специальной последовательности. В общем случае специальная последовательность выглядит так:

  1. Символ процента, открывающий специальную последовательность.
  2. Необязательный режим выравнивания. Задается одной буквой: 'L' - влево, 'C' - по центру, 'R' - вправо. Имеет смысл для поля ввода и статического текста.
  3. Необязательная ширина элемента управления. Имеет смысл для любого элемента управления.
  4. Необязательная высота элемента управления, отделяемая от ширины запятой. Имеет смысл для поля ввода и статического регулярного текста.
  5. Формат ввода/вывода или текст флажка/кнопки/статического текстового элемента управления в угловых, одиночных или двойных кавычках. Тип кавычек значения не имеет.
  6. Символы-префиксы, модифицирующие поведение элемента управления.
  7. Символ, задающий тип элемента управления.

Ниже приведен синтаксис специальных последовательностей подробно для каждого типа элемента управления.

Специальная_последовательность = Процент | Обратный_апостроф | Поле_ввода | Флажок | Селектор | Кнопка | Статический_регулярный_текст | Статический_текст_метка
Процент = '%%'
Обратный_апостроф = '%`'
Поле_ввода = '%' [ Режим_выравнивания ] [ Ширина ] [ ',' Высота ] ['<' Формат '>'] [ Префиксы ] Символ_поля_ввода
Флажок = '%' [ Ширина ] '<' Текст_флажка '>' [ Префиксы ] Символ_флажка
Селектор = '%' [ Ширина ] [ ',' Высота ] '<' Формат '>' [ Префиксы ] Символ_селектора
Кнопка =  '%' [ Режим_выравнивания ] [ Ширина ] '<' Текст_кнопки '>' [ Префиксы ] Символ_кнопки
Статический_регулярный_текст = '%' [ Режим_выравнивания ] [ Ширина ] [ ',' Высота ] '<' Статический_текст '>' [ Префиксы ] Символ_статического_регулярного_текста
Статический_текст_метка = '%' [ Режим_выравнивания ] [ Ширина ] '<' Статический_текст '>' [ Префиксы ] Символ_статического_текста_метки

Компонент Допустимые значения Описание Значение по умолчанию
Режим_выравнивания L Влево Для типов NUMERIC и FLOAT - вправо, для остальных - влево
C По центру
R Вправо
Ширина неотрицательное целое число Задает ширину элемента управления Для поля ввода - максимально возможная длина строки для заданного формата и типа переменной. Для кнопки - длина текста кнопки
Высота положительное целое число Задает высоту поля ввода, селектора, или статического регулярного текста 1
Формат строка Задает формат ввода/вывода; синтаксис формата совпадает с FLDTOSTR и STRTOFLD, подробнее см. "Типы форматов преобразования в строку и из строки". Для селектора ожидается перечислимый формат Формат по умолчанию для заданного типа переменной
Текст_флажка строка Текст флажка Должен быть указан явно
Текст_кнопки строка Текст на кнопке. Подстрока "%T" указывает на таймированность кнопки и обозначает местоположение обратного счетчика времени в тексте кнопки. Только одна кнопка в форме может быть таймирована Должен быть указан явно
Статический текст строка Текст статического текстового элемента управления Должен быть указан явно
Префиксы A Префикс статического или нестатического элемента управления, получающего текст/формат из списка параметров (сначала формат, затем переменная или значение). Формат, заданный в определении элемента управления, игнорируется. Удобно прежде всего для элементов управления со сложным форматом, поскольку не нужно контролировать текст формата на случай наличия закрывающих скобок или кавычек По умолчанию формат элемента управления считывается из описания поля
D Префикс для явного указания кнопки по умолчанию; эта кнопка сработает при нажатии Ctlr+Enter на любом поле ввода Если есть кнопка, не являющаяся кнопкой отказа, то она становится кнопкой по умолчанию, иначе кнопкой по умолчанию становится первая из разрешенных кнопок отказа. Если выбор кнопки по умолчанию неоднозначен (есть несколько кнопок, не являющихся кнопками отказа, или несколько кнопок помечены префиксом 'D'), будет исключение 536
F Префикс нестатического элемента управления, получающего управление первым По умолчанию первым управление получит первый разрешенный элемент управления
H Префикс кнопки, указывающий на отсутствие пропуска строки "под тень" кнопки По умолчанию, после строки, содержащей кнопки, автоматически пропускается строка под тени
K Префикс многострочного поля ввода, запрещающий вводить и распознавать переводы строк в данном поле По умолчанию в многострочных полях ввода перевод строк распознается и его разрешено вводить
N Префикс, указывающий, что нестатический элемент управления запрещен (никогда не получит управление) По умолчанию элемент управления разрешен
S Префикс "секретного" поля ввода, вводимые символы будут отображаться звездочками По умолчанию поле ввода не является секретным
Y Префикс поля ввода, разрешающего ввод пустого значения пользователем По умолчанию поле ввода (edit box и combo box) не допускает ввода пустого значения, а селектор (radio buttons group) требует выбрать один из вариантов, если ни один не выбран
Символ_поля_ввода I Элемент управления - поле ввода или список
Символ_флажка E Элемент управления - флажок
Символ_селектора O Элемент управления - селектор
Символ_кнопки B Элемент управления - кнопка успеха (submit button), реакция от 1 по порядку кнопок типа B. Кнопки типов X и Z на нумерацию не влияют
X Элемент управления - кнопка отказа от редактирования (reset button); эта кнопка сработает при нажатии клавиши Esc или кнопки "крест". Если параметр abortCode задан, по нажатию кнопки будет выброшено исключение класса Exc_Raise с кодом abortCode. Если параметр не задан - процедура-функция возвратит реакцию 0 В форме с кнопками должна присутствовать и кнопка отказа, иначе будет исключение 541
Z Элемент управления - кнопка отказа от редактирования (reset button), в отличие от кнопки 'X' по нажатию будет выброшено исключение класса Exc_Halt независимо от того, задан ли параметр abortCode В форме с кнопками должна присутствовать и кнопка отказа, иначе будет исключение 541
Символ_статического_регулярного_текста T Статический элемент управления - регулярный текст. Может быть однострочным или многострочным. Однострочный регулярный текст выравнивается заданным режимом выравнивания до указанной ширины. Многострочный регулярный текст автоматически разбивается по строкам, но не выравнивается
Символ_статического_текста_метки M Статический элемент управления - текст-метка. Может быть только однострочным. Выравнивается заданным режимом выравнивания до указанной ширины. В графическом виде отображается уменьшенным шрифтом. Начиная с версии 14.274.020, если содержит хотя бы один символ табуляции, применяется табличное выравнивание

Поведение элемента управления "поле ввода" зависит от высоты и формата. Ниже приведена таблица, описывающая эту зависимость.

Формат Высота Элемент управления
Перечислимый Единица Перечислимое поле ввода (combo box). Позволяет выбрать значение из справочника по нажатию F5
Перечислимый Больше единицы Список (list box)
Другой Единица Однострочное поле ввода (edit text)
Другой Больше единицы Многострочное поле ввода (edit text)

Если нестатический элемент управления формы помечен префиксом 'F', он получит управление (фокус ввода) первым. В противном случае первым получит управление левый верхний разрешенный нестатический элемент формы. Далее пользователь редактирует значения полей, селекторов и флажков формы, перемещая фокус ввода от одного разрешенного нестатического элемента управления к другому. Статические элементы никогда не получают управления. По нажатию одной из разрешенных кнопок формы работа процедуры-функции завершается.

Ниже описывается зависимость результата ввода от типа нестатического элемента управления.

Тип элемента управления Диапазон значений Реальная ширина
Поле ввода (edit box или combo box) Значение, приведенное к типу переменной-параметра функцией STRTOFLD; пустое значение допустимо только при указании префикса 'Y' На 2 знакоместа шире заданной (под маркеры прокрутки или кнопку поднятия справочника). Если явно указанная ширина поля ввода меньше, чем емкость переменной, автоматически включается прокрутка
Список (list box) Число - порядковый номер варианта от нуля На 2 знакоместа шире заданной. Если число вариантов больше высоты списка, автоматически включается прокрутка
Селектор (radio button group) Число - порядковый номер варианта от нуля На 6 знакомест шире заданной (" (" маркер ") " текст " ")
Флажок (check box) Число - 0 или 1 На 6 знакомест шире заданной (" [" маркер "] " текст " ")

Как видно из таблицы, список, селектор и флажок предполагают числовой параметр, причем в ограниченном диапазоне значений. Интерпретация входного значения, выходящего за пределы диапазона, зависит от элемента управления.

Акселераторы

Для любого нестатического элемента управления можно задать не более одной клавиши-акселератора (для селектора - не более одного акселератора на вариант).

В качестве акселератора допустимы любые алфавитно-цифровые символы (включая кириллицу), кроме пробела, и тех символов, что набираются нажатием Shift+Цифра. При обнаружении недопустимого акселератора в тексте кнопки/тексте флажка/формате селектора будет предупреждение StdFormInvalidAccelerator, а в тексте формы или статическом тексте-метке - исключение 550.

Разные элементы управления не могут иметь одинаковые клавиши-акселераторы. В случае конфликта акселераторов флажков, селекторов и кнопок между собой будет предупреждение StdFormAcceleratorUsedTwice; если же одна из сторон конфликта - акселератор в тексте формы или в тексте метки, выбрасывается исключение 551.

Кнопки и реакция

Как правило форма ввода должна иметь хотя бы одну разрешенную кнопку. Если разрешенные кнопки есть, работа формы может завершиться только нажатием кнопки, т.е. либо явным нажатием пользователем, либо имитацией нажатия кнопки по таймеру, либо имитацией из функции idleFunc. Нажатию кнопки соответствует целочисленный код реакции, возвращаемый процедурой-функцией. Кнопки отказа имеют реакцию 0, кнопки успеха пронумерованы от 1 слева направо и сверху вниз, независимо от префиксов 'D', 'F' и 'N'. Если форма завершилась отказом, переменным формы будут возвращены исходные значение (за исключением переменной-таймера). Если форма завершилась успешно, переменные получат отредактированные пользователем значения. Пользователь не сможет завершить работу с формой до тех пор, пока не введет значения, которые могут быть корректно преобразованы к типу указанной переменной, либо пока не сработает кнопка отказа.

Если в форме ввода есть разрешенные кнопки, одна из них должна быть кнопкой отказа, иначе будет выброшено исключение 541. В форме может присутствовать только один тип кнопок отказа: либо кнопки 'X', либо кнопки 'Z', иначе будет выброшено исключение 539.

Если в форме есть разрешенные кнопки, одна из них должна быть кнопкой по умолчанию. Если кнопка по умолчанию не выделена явно префиксом 'D', она будет назначена автоматически. Если есть разрешенная кнопка успеха, она становится кнопкой по умолчанию. Иначе кнопкой по умолчанию становится первая из разрешенных кнопок отказа. Если выбор кнопки по умолчанию неоднозначен (есть несколько разрешенных кнопок успеха, или несколько кнопок помечены префиксом 'D'), будет выброшено исключение 536.

В форме допускается не более одной таймированной кнопки, в противном случае будет выброшено исключение 540. Таймировать можно как кнопку успеха, так и кнопку отказа. Однако если в форме есть разрешенные поля ввода, таймированная кнопка успеха может не сработать из-за того, что пользователь ввел в поле недопустимое значение. Такая "просроченная" таймированная форма может быть завершена только действиями пользователя. Когда таймирована кнопка отказа, форма не может просрочена. Особый случай - запрещенная таймированная кнопка. Пользователь не может нажать такую кнопку, однако ее нажатие будет имитировано автоматически по истечении заданного таймаута.

Пользователь может управлять работой формы при помощи предопределенных комбинаций клавиш или мышью. Двойной щелчок мыши на любом разрешенном элементе управления интерпретируется аналогично нажатию Enter на текущем элементе управления.

Комбинация клавиш Текущий элемент управления Действие
Tab Любой разрешенный Передача управления следующему разрешенному элементу управления
Shift+Tab Любой разрешенный Передача управления предыдущему разрешенному элементу управления
Esc Любой разрешенный Нажатие кнопки отказа
Ctrl+Enter Любой разрешенный Нажатие кнопки по умолчанию
Enter Кнопка Нажатие текущей кнопки
Enter Список Нажатие кнопки по умолчанию
Enter Единственный в форме разрешенный Нажатие кнопки по умолчанию
Enter Поле ввода, флажок, селектор Передача управления следующему разрешенному элементу управления

Форма может иметь разрешенные кнопки отказа и успеха, только кнопки отказа, или вовсе не иметь разрешенных кнопок. Поведение по нажатию Esc, Enter и Ctrl+Enter изменяется согласно таблице, приведенной ниже.

Набор кнопок Реакция на комбинацию клавиш
Esc Enter Ctrl+Enter
Нет ни одной кнопки Текущий элемент - список Отказ Успех (1) Успех (1)
Текущий элемент - единственный разрешенный элемент управления в форме Отказ Успех (1) Успех (1)
Прочие случаи Отказ Передача управления следующему разрешенному элементу управления Нет реакции
Есть только кнопка отказа Отказ Передача управления следующему разрешенному элементу управления Отказ
Есть кнопка отказа и кнопки успеха Отказ Передача управления следующему разрешенному элементу управления Реакция на кнопку по умолчанию

Если пользователем были изменены значения нестатических элементов управления (некнопок), по нажатию кнопки отказа будет поднято сообщение: "Данные были изменены. Сохранить/Не сохранять/Редактировать дальше". В этом сообщении кнопка "Сохранить" соответствует кнопке по умолчанию, кнопка "Не сохранять" - кнопке отказа. Однако для таймированных форм, форм, где успешное завершение невозможно в принципе, а также для форм со стилем MENU или информационными стилями INFORM, INFORM_RED, INFORM_NEUTRAL такое сообщение не поднимается.

Стиль

Форма ввода любого стиля, кроме MENU, может быть отображена как в текстовом, так и в графическом виде; вид определяется значением свойства ASBCONNECTION.GUI. В графическом представлении стиль определяет иконку формы, цвета рамки, заголовка, верхней и нижней панелей формы, в текстовом виде - палитру. Формы стиля MENU допустимы только в текстовом представлении.

Формы стиля MENU предназначены для эмуляции меню и отображаются только в текстовом виде. Их отображение и поведение намеренно приближено к поведению меню. В частности, от рамки формы не делается отступов, текущая позиция в списке изменяется по движению курсора мыши, завершение формы ввода происходит по одиночному нажатию на элемент списка или мимо формы.

Стиль Графическое представление Текстовое представление
Иконка Цвет рамки и заголовка Цвета панелей Палитра
STOP Дорожный знак "проезд запрещен" (кирпич) Красный APP.ExtraColor_DialogPrimaryPaneBackground / APP.ExtraColor_DialogSecondaryPaneBackground Тревожная (красная)
TRY_LATER Песочные часы Красный APP.ExtraColor_DialogPrimaryPaneBackground / APP.ExtraColor_DialogSecondaryPaneBackground Тревожная (красная)
STOP_AND_CALL_ADMIN Стилизованное изображение администратора Красный APP.ExtraColor_DialogPrimaryPaneBackground / APP.ExtraColor_DialogSecondaryPaneBackground Тревожная (красная)
STOP_AND_CALL_AUTHOR Дорожный знак "дорожные работы" (копатель) Красный APP.ExtraColor_DialogPrimaryPaneBackground / APP.ExtraColor_DialogSecondaryPaneBackground Тревожная (красная)
CHOICE Восклицательный знак в желтом треугольнике Желтый APP.ExtraColor_DialogPrimaryPaneBackground / APP.ExtraColor_DialogSecondaryPaneBackground Тревожная (красная)
QUESTION Вопросительный знак в синем круге Нейтральный
APP.ExtraColor_NCActiveBackground / ExtraColor_NCInactiveBackground
APP.ExtraColor_DialogPrimaryPaneBackground / APP.ExtraColor_DialogSecondaryPaneBackground Информационная (синяя)
INFORM "Галочка" в синем круге Нейтральный
APP.ExtraColor_NCActiveBackground / ExtraColor_NCInactiveBackground
APP.ExtraColor_DialogPrimaryPaneBackground / APP.ExtraColor_DialogSecondaryPaneBackground Информационная (синяя)
INFORM_RED Восклицательный знак в красном треугольнике Нейтральный
APP.ExtraColor_NCActiveBackground / ExtraColor_NCInactiveBackground
APP.ExtraColor_DialogPrimaryPaneBackground / APP.ExtraColor_DialogSecondaryPaneBackground Тревожная (красная)
INFORM_NEUTRAL Отсутствует Нейтральный
APP.ExtraColor_NCActiveBackground / ExtraColor_NCInactiveBackground
APP.ExtraColor_DialogPrimaryPaneBackground / APP.ExtraColor_DialogSecondaryPaneBackground Нейтральная (серая)
NONE Отсутствует Нейтральный
APP.ExtraColor_NCActiveBackground / ExtraColor_NCInactiveBackground
APP.ExtraColor_DialogPrimaryPaneBackground / APP.ExtraColor_DialogSecondaryPaneBackground Нейтральная (серая)
LIKE_WDO Отсутствует Нейтральный
APP.ExtraColor_NCActiveBackground / ExtraColor_NCInactiveBackground
APP.PaletteKit.TextPalette[FORM_FIELD.Color_Text].BkColor / APP.ExtraColor_SecondaryPaneBackground Нейтральная (серая)
MENU       Палитра меню (черная)

Если форма допускает выбор реакции пользователем и выбрасывает исключение по кнопке отказа, использовать в ней стиль STOP_AND_CALL_AUTHOR запрещено, будет выброшено исключение 544.

Форматирование и выравнивание основного текста

Если форма ввода является сообщением, основной текст сообщения автоматически форматируется (добавляются переводы строк), чтобы ширина сообщения не превышала ширины главного окна. Если форма ввода не является сообщением, основной текст и статические текстовые элементы управления отсекаются справа по максимальной ширине главного окна. Если при максимальном размере главного окна 240*120 не все нестатические элементы управления полностью видимы, форма спроектирована неправильно, будет выброшено исключение 545. Масштаб формы может быть уменьшен так, чтобы она поместилась в пределах главного окна. В консольном виде, если форма ввода не является сообщением, основной текст и статические текстовые элементы управления отсекаются справа по ширине главного окна, а нестатические элементы управления должны быть полностью видимы, т.е. минимально допустимый размер формы определяется расположением и размером нестатических элементов управления; если минимально допустимый размер формы больше текущего размера консоли, но меньше максимального, будет выброшено исключение 74, рекомендующее пользователю увеличить размер главного окна.

Все строки формы, в том числе и те, что содержат элементы управления, автоматически выравниваются по центру добавлением пробелов слева и справа до фактической ширины формы.

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

После строки, содержащей кнопки, автоматически пропускается одна строка под тени кнопок, если все кнопки этой строки не имеют префикса 'H', разрешающего не пропускать строку.

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

Функция idleFunc

Если параметр idleFunc (типа PROC) не пропущен и не пуст, во время работы формы с частотой 10 раз в секунду будет вызываться функция idleFunc.

  1. Функция может либо разрешить продолжать исполнение формы, вернув отрицательное число или пустое значение, либо завершить исполнение формы, вернув неотрицательное число, т.о. имитировав нажатие кнопки. Нулевой код возврата соответствует нажатию кнопки отказа, положительный код - нажатию кнопки успеха. Наличие в форме кнопки с соответствующим кодом реакции не проверяется.
  2. Функция idleFunc должна завершаться максимально быстро, чтобы пользователь не ощущал задержек во время ввода. Исполнение функции не может быть прервано нажатием Esc или CtrlS во избежание потери событий ввода, предназначенных для формы. В случае зависания функции (например в бесконечном цикле) прервать исполнение программы будет невозможно.
  3. Функция idleFunc не принимает никаких параметров. Предполагается, что все нужные ей переменные будут глобальными.
  4. Переменные, переданные в STDFORM по ссылке, имеет смысл модифицировать в теле idleFunc только если функция намерена вернуть положительную реакцию. Во всех остальных случаях значения параметров, переданных в STDFORM по ссылке, по выходу из функции idleFunc будут восстановлены. Значения переменной-таймера по выходу из функции idleFunc восстанавливается в любом случае. Изменения прочих переменных не контролируются.
  5. Исключение, выброшенное в теле idleFunc прерывает исполнение формы и пробрасывается далее по стеку.

Процедура onChangeProc

Необязательный параметр onChangeProc, если не пропущен и не пуст, задает процедуру, которая будет вызываться после каждого успешного изменения разрешенного нестатического элемента управления. Для разных типов элементов управления "успешное изменение" понимается по-разному.

Тип элемента управления Действия пользователя, понимаемые как успешное изменение элемента управления
Поле ввода (edit box и combo box) Изменил текст поля, после чего попытался перейти к следующему элементу управления, либо завершить работу с формой. Измененный текст был успешно преобразован в соответствующую переменную
Флажок (check box) Изменил состояние флажка
Селектор (radio button group) Изменил положение селектора
Список (list) Изменил текущий элемент списка

Чтобы не требовалось описывать все параметры STDFORM как глобальные переменные, соответствующие нестатическим элементам управления параметры STDFORM передаются в onChangeProc параметрами по ссылке. Причем передаются параметры, соответствующие не только разрешенным элементам управления, но и тем запрещенным, для которых параметром в STDFORM была передана переменная, а не результат выражения, что позволяет изменять состояние запрещенных элементов управления. Более того, если формат нестатического элемента управления передается в STDFORM отдельным параметром (с использованием префикса 'A') и в качестве этого параметра подставляется переменная, то и эта переменная-формат будет передана в onChangeProc перед соответствующей переменной-результатом. Порядок параметров onChangeProc следующий: первый - имя параметра onChangeProc, соответствующего изменившемуся элементу управления, второй - предыдущее значение изменившейся переменной, далее - параметры STDFORM, как указано выше. В момент входа в onChangeProc переменная, имя которой указано в первом параметре, уже получила измененное значение.

Переменные-форматы передается в onChangeProc для любых нестатических элементов управления, кроме кнопок. Однако изменение формата адекватно обрабатывается только для полей ввода (edit box, combo box) и списков (list). При этом тип элемента управления, ширина, высота и выравнивание не изменяются, как бы не менялся формат. Для флажка (check box) и селектора (radio button group) переменная-формат хотя и передается в onChangeProc, но изменение ее значения игнорируется.

В случае отказа формы исходные значения восстанавливаются только для тех переменных, которые доступны для редактирования пользователю, т.е. только для переменных-результатов, соответствующих разрешенным нестатическим элементам управления. Переменные-форматы и переменные-результаты запрещенных элементов управления изменяются только процедурой onChangeProc и, соответственно, их значения не восстанавливаются в случае отказа формы.

Исключение, выброшенное в теле onChangeProc, прерывает исполнение формы и пробрасывается далее по стеку. Значения параметров STDFORM остаются такими, какими были на момент выброса исключения.

Вызов процедуры onChangeProc поддержан только для графической версии STDFORM.

Откладывание

Можно выделить особый класс форм, весь смысл которых состоит в информирования пользователя о необработанном исключении. Такие формы обладают рядом характерных признаков.

  1. По отказу формы выбрасывается исключение класса Exc_Raise.
  2. Форма не содержит разрешенных нестатических элементов управления кроме кнопок.
  3. Форма не содержит также и таймированной кнопки (неважно, разрешенной или запрещенной, поскольку запрещенная все-таки срабатывает по истечению таймаута).
  4. Все разрешенные кнопки являются кнопками отказа типа 'X'.

Формы с перечисленными характеристиками называются откладываемыми формами. Отображение такой формы откладывается до момента, пока связанное с ней исключение не приведет к останову программного комплекса; отложенная форма становится скрытым свойством исключения (см. Exc_Root.HasDeferredMsg). Если исключение будет обработано, отложенная форма показана не будет.

Формы с кнопкой отказа типа 'Z' по определению являются неоткладываемыми.

Подавление

При подавлении реакция формы (код возврата или исключение) определяется следующим образом:

Если реакцией на подавление формы является исключение класса Exc_Raise (форма с кнопкой отказа типа 'X'), искаженная до состояния откладываемой копия формы становится скрытым свойством исключения (см. Exc_Root.HasSuppressedMsg). При искажении все нестатические элементы управления, кроме кнопок отказа запрещаются, таймирование отключается.

Если реакцией на подавление формы является исключение класса Exc_Halt (форма с кнопкой отказа типа 'Z'), форма не искажается и не связывается с исключением.

Текстовый и графический виды

Особенности отображения формы в текстовом и графическом виде представлены в таблице.

Детали отображения Текстовый вид Графический вид
Открытие формы Консоль клиента ASB автоматически поднимается на передний план аналогично действию BRINGTOFOREGROUND Если главное окно клиента ASB неактивно, заголовок главного окна и значок в панели задач подсвечиваются
Края формы От псевдографической рамки слева и справа отступается по одному знакоместу, за исключением форм стиля MENU От края окна отступается 0.75 ширины знакоместа. Необходимо, поскольку рамки полей ввода, списков, селекторов и групп флажков проходят по краю соседнего знакоместа
Автоматические преобразования фрагментов основного текста формы Подписи сверху и слева к элементам управления Не выделяются среди основного текста Отображаются уменьшенным шрифтом (тем же, что и статический текст-метка)
Рамки и отчеркивания, заданные псевдографикой Отображаются псевдографикой Заменяются графическими рамками и отчеркиваниями
Надписи на рамках, заданных псевдографикой Не выделяются среди основного текста Отображаются уменьшенным шрифтом
Статический текст-метка Не выделяется среди основного текста Отображается уменьшенным шрифтом
Тэг отчеркивания Отображается псевдографикой Отображается графическим отчеркиванием
Выделение текста перед первым тэгом отчеркивания Нет Дополнительно отступается по одному знакоместу перед текстом и после текста
Группировка позиций селектора и группы соседних флажков Цветом фона Графической рамкой
Группировка кнопок Кнопки не группируются Кнопки, расположенные ниже текста, всех полей, списков, селекторов и флажков формы, группируются на панели кнопок и выравниваются вправо. Прочие кнопки не группируются

Принципы автоматического преобразования основного текста формы к графическому виду:

Пример 1

Row := 0;
Col := 0;
R := STDFORM("|"+
             "Введите позицию||"+
             "Строка %3I Столбец %3I|",
             ,
             ,
             ,
             Row, Col);

 

Пример 2

D := SYSDATE();
R := STDFORM("|"+
             "Привет, %L23NI|"+
             "Дата              Последний сеанc|"+
             "%<D.N.y>I         %NI||"+
             "%< Принять дату последнего сеанса >B|"+
             "%< Принять "+FLDTOSTR(D)+" >DB            ",
             " Сегодня ",
             ,
             ,
             FULLNAME(), D, LastDate);

См. также