Инструкция WINDOW
Инструкция WINDOW - создание нового окна, инструкция EXTEND WINDOW - изменение отрисовщика существующего окна или того, как оно рисует открытые в нём формы, инструкция HIDE WINDOW - скрытие существующего окна.
Синтаксис
WINDOW name [caption] [windowKind] [options];
Опции options, которые идут в конце инструкции, могут быть указаны друг за другом в произвольном порядке:
HIDETITLE
HIDESCROLLBARS
AUTOSIZE
orientationType
POSITION(x, y, width, height)
fixedPositionType
HALIGN(alignType)
VALIGN(alignType)
TEXTHALIGN(alignType)
TEXTVALIGN(alignType)
CLASS cssClassExpr
CUSTOM customExpr
Существующему окну можно задать отрисовщик, указать, как оно рисует открытые в нём формы, или скрыть его отдельными инструкциями:
EXTEND WINDOW windowName CUSTOM customExpr;
EXTEND WINDOW windowName FORMS [formsKind] [formsClose];
HIDE WINDOW windowName;
Где windowKind - одно из:
NATIVE
FORMS [formsKind] [formsClose]
formsKind - одно из:
TABBED
NOTABBED
а formsClose - одно из:
CLOSE seconds
NOCLOSE
Описание
Инструкция WINDOW объявляет новое окно и добавляет его в текущий модуль.
По умолчанию создаётся окно, в котором отображаются элементы навигатора. Окно FORMS вместо этого держит формы, как System.forms: форма открывается в него оператором SHOW ... WINDOW windowName, и так форма становится шапкой или боковой панелью приложения.
Инструкция EXTEND WINDOW задаёт уже объявленному окну, в том числе стандартному, компонент React или HTML-шаблон, который рисует его элементы навигатора, оставляя всё остальное в окне как есть. Элементы остаются в том окне, в которое были помещены, поэтому структура навигатора, выбор в нём и поведение при запуске сохраняются, а меняется только отрисовка. Окно должно быть уже объявлено. Окну FORMS и окну System.log можно задать компонент и ничего другого; остальным окнам NATIVE нельзя задать ни того, ни другого. Если окно расширяют несколько модулей, последний литерал задаёт разметку, с которой окно начинает, а последнее свойство — то, которое её пересчитывает.
Та же инструкция задаёт и то, как окно, держащее формы, их рисует и когда закрывает вытесненную форму. Для System.forms это единственный способ такое сказать, поскольку это окно объявляет платформа и заново объявить его приложение не может. Задаётся хотя бы одна из двух частей, и каждая заменяет только себя: расширение, которое говорит, когда закрывать, оставляет окно рисующим формы так, как оно их рисовало, а то, которое переводит полосу закладок, оставляет заданную окну политику закрытия. Окно, не держащее форм, так расширить нельзя. Именно так рабочая область начинает заменять своё содержимое, а не копить закладки.
Инструкция HIDE WINDOW скрывает указанное окно, делая его невидимым. Скрытое окно ничего не рисует: окну, которому задан компонент CUSTOM, а затем оно скрыто, компонент не рисуется, а сообщения скрытого System.log выводятся в лог и не показываются нигде.
Параметры
-
nameИмя окна. Простой идентификатор. Имя должно быть уникально в пределах текущего пространства имен.
-
captionЗаголовок окна. Строковый литерал. Если заголовок не задан, то заголовком окна будет являться его имя.
-
NATIVEКлючевое слово, указывающее, что окно наполняет клиент, а не навигатор: поместить в него элементы навигатора нельзя. Так задано предопределённое окно
System.log, в котором выводятся сообщения пользователю. Для такого окна применяются опцииPOSITION,CLASS,HIDETITLE,HIDESCROLLBARSиAUTOSIZE, а ориентация - это ось, поперёк которойAUTOSIZEзадаёт размер окна; выравнивание не учитывается. -
FORMSКлючевое слово, указывающее, что окно держит формы: поместить в него элементы навигатора нельзя, а форма открывается в него оператором
SHOW ... WINDOW windowName. Так задано предопределённое окноSystem.forms, и именно в нём открывается форма, когдаWINDOWне называет окна. Применяются те же опции, что и для окнаNATIVE, включаяAUTOSIZEи ориентацию, поперёк которой он задаёт размер, аCUSTOMможет задать компонент React, который рисует окно вместо стандартного представления, как описано ниже.Такое окно рисует одну форму за раз и ничего своего вокруг неё - ни полосы закладок, ни кнопки закрытия, ни собственной панели платформы, - то, что нужно шапке, боковой панели или киоску. Какая форма нарисована, говорит приложение - операторами
SHOWиACTIVATE FORM. Держит окно при этом больше одной: когда в него открывается форма, форма, которая уже там, вытесняется, и ей отправляется запрос закрыться - тот же, что делает её кнопка закрытия, - а форма с несохранёнными изменениями спрашивает пользователя и может остаться открытой, скрытой за нарисованной формой, где до неё доходитACTIVATE FORM. Ни одна из двух форм пары, открытой сWINDOW windowNameв синхронном режиме, в этом не участвует: заблокированную форму закрыться не просят, так как она не может закрыться, пока та открыта, а блокирующая форма не просит закрыться формы, которые уже в окне.Одну форму рисует только десктопный веб-клиент: мобильный веб-клиент рисует такое окно полосой закладок, и оставшаяся форма там - закладка, а десктоп-клиент рисует одно окно
System.forms, поэтому форма, открытая в любое другое окноFORMS, открывается там закладкой. -
TABBEDКлючевое слово, указывающее, что окно рисуется полосой закладок, по одной на открытую форму, и переключается между ними пользователь; ничего не вытесняется и само собой не закрывается, поэтому вместе с ним нельзя указать
formsClose. Обычно такое окно в приложении одно, и этоSystem.forms, которое с ним и объявлено; окно, объявленное безformsKind, рисует одну форму за раз. -
NOTABBEDКлючевое слово, указывающее, что окно рисует одну форму за раз. Так рисует окно, объявленное без
formsKind, поэтому пишется это слово, чтобы перевестиSystem.formsв рабочую область, которая заменяет своё содержимое. -
secondsЦелочисленный литерал в диапазоне от
0до2000000- сколько держать вытесненную форму, прежде чем закрыть её.CLOSE 0отправляет ей запрос закрыться сразу - так делает окно, которомуformsCloseне задан, - и форма с несохранёнными изменениями тогда спрашивает пользователя и может остаться. По истечении срока закрывается только форма, которая закрывается без вопроса: форма с несохранёнными изменениями остаётся открытой, скрытой за нарисованной формой, пока её не закроет приложение или пользователь, - о форме, на которую пользователь уже не смотрит, его не спрашивают. Форма, к которой за это время вернули пользователя - операторомACTIVATE FORM, операторомSHOW ... ACTIVATEтой же формы или работой в ней, - не закрывается вовсе, а повторное вытеснение, пока она ещё ждёт, отсчёт заново не начинает. Форма, которая рисуется, не вытесняется и ждать не начинает; не начинает и та, чьё место заняла форма, которая ещё не пришла: открытие может не состояться, а форма, открытая сWAIT, оставляет окно держащим то, что оно держало, - это и есть ответ, к которому вернётся её открыватель.Окно, которое рисует компонент
CUSTOM, само ничего не закрывает: что такое окно рисует, решает компонент, и он может рисовать несколько форм сразу, так что платформе не отличить форму, которую перестали рисовать, от формы, которую переставили. Такое окно закрывает то, что держит, своим контроллером. -
NOCLOSEКлючевое слово, указывающее, что вытесненной форме запрос закрыться не отправляется вовсе: она остаётся открытой, скрытой за нарисованной формой, пока её не закроет приложение или пользователь.
-
windowNameИмя скрываемого окна. Составной идентификатор существующего окна.
Опции инструкции
-
HIDETITLEКлючевое слово, указывающее на отсутствие заголовка окна в пользовательском интерфейсе.
-
HIDESCROLLBARSКлючевое слово, указывающее на отсутствие скроллбаров для компонента данного окна.
-
AUTOSIZEКлючевое слово, указывающее, что размер окна равен размеру того, что оно рисует, вместо доли, которую запрашивает его
POSITION, - это то, что нужно окну, которое рисует шапку: она не выше своей формы. Так задаётся размер поперёк собственной ориентации окна, а вдоль неё окно растягивается:HORIZONTAL-окно имеет высоту своей формы и ширину отведённого места,VERTICAL-окно - ширину своей формы и высоту отведённого места. Если ориентация не указана, окно с элементами навигатора -VERTICAL, а окноNATIVEилиFORMS-HORIZONTAL, поэтому шапка, объявленная без неё, имеет высоту своей формы.POSITIONпо-прежнему определяет, где окно стоит и с чем группируется. Группа окон получает размер по содержимому, только если его получают все окна группы, поэтомуAUTOSIZE-окно рядом с обычным оставляет группу растягивающейся, как и раньше. Учтите, что клиент запоминает размер, который пользователь потянул мышью, и восстанавливает его поверх объявленного, пока действиеService.resetWindowsLayoutне вернёт объявленные размеры. Так размер окна задаёт только веб-клиент: десктопный клиентAUTOSIZEигнорирует. -
orientationTypeУказание вертикальной или горизонтальной ориентации создаваемого тулбара или панели. Задается одним из ключевых слов:
VERTICAL- вертикальная ориентация. Значение по умолчанию для окна с элементами навигатора.HORIZONTAL- горизонтальная ориентация. Значение по умолчанию для окнаNATIVEилиFORMS.
-
POSITION(x, y, width, height)Указание размеров и местоположения окна.
-
xКрайняя левая координата окна. Целочисленный литерал в диапазоне от
0до100. -
yКрайняя верхняя координата окна. Целочисленный литерал в диапазоне от
0до100. -
widthШирина окна. Целочисленный литерал в диапазоне от
0до100. -
heightВысота окна. Целочисленный литерал в диапазоне от
0до100.
-
-
fixedPositionTypeУказание фиксированного расположения окна на рабочем столе, которое не позволяет пользователю изменять его положение и размер. Размер окна в таком случае выбирается автоматически исходя из предпочитаемых размеров компонента. Окно будет расположено слева, справа, сверху, снизу рабочего стола соответственно. Опция не может быть использована одновременно с опцией
POSITION. Задается одним из ключевых слов:LEFT- расположение слеваRIGHT- справаTOP- сверхуBOTTOM- снизу
-
HALIGN(alignType)Указание горизонтального выравнивания кнопок в вертикальном тулбаре.
-
alignTypeТип выравнивания. Задается с помощью одного из ключевых слов:
START- выравнивание по левому краю (значение по умолчанию).CENTER- выравнивание по центру.END- выравнивание по правому краю.
-
-
VALIGN(alignType)Указание вертикального выравнивания кнопок в горизонтальном тулбаре.
-
alignTypeТип выравнивания. Задается с помощью одного из ключевых слов:
START- выравнивание по верхнему краю (значение по умолчанию).CENTER- выравнивание по центру.END- выравнивание по нижнему краю.
-
-
TEXTHALIGN(alignType)Указание горизонтального выравнивания текста на кнопках.
-
alignTypeТип выравнивания. Задается с помощью одного из ключевых слов:
START- выравнивание по левому краю (значение по умолчанию).CENTER- выравнивание по центру.END- выравнивание по правому краю.
-
-
TEXTVALIGN(alignType)Указание вертикального выравнивания текста на кнопках.
-
alignTypeТип выравнивания. Задается с помощью одного из ключевых слов:
START- выравнивание по верхнему краю.CENTER- выравнивание по центру (значение по умолчанию).END- выравнивание по нижнему краю.
-
-
CLASS cssClassExprУказание имени CSS-класса для DOM-элемента, создаваемого для компонента окна в HTML. Может быть использовано для применения пользовательских стилей.
-
cssClassExprВыражение, значение которого определяет имя класса.
-
-
CUSTOM customExprЭлементы навигатора этого окна рисует компонент React или HTML-шаблон, а не стандартная панель. Так их рисует только десктопный веб-клиент: мобильный веб-клиент и десктоп-клиент оставляют своё стандартное меню, и то же относится к описанным ниже окну
FORMSи окнуSystem.log, которые сохраняют там своё стандартное представление.-
customExprВыражение (строковое значение). Строковый литерал, соответствующий
[A-Z][A-Za-z0-9_$]*, задаёт имя компонента React; литерал с разметкой и любое свойство — HTML-шаблон; литерал, который не является ни тем, ни другим, — ошибка. Компонент задаётся только литералом, так как отрисовщик выбирается до того, как придёт первое значение, а шаблон, заданный свойством, пересчитывается по мере изменения этого значения, и окно рисуется заново по новой разметке.Литерал и свойство можно задать вместе — так же, как
CLASSпринимает и литерал, и свойство: литерал задаёт разметку, по которой окно рисуется, пока свойство не вычислит первое значение, а дальше его заменяет свойство. Компонент React со свойством сочетать нельзя, так как компонент рисует окно сам и вычисленный шаблон никогда не был бы нарисован.Шаблон — это разметка, которую пишет приложение и которую платформа вставляет как есть, поэтому за её содержимое отвечает приложение:
<script>в ней не выполняется, а атрибут-обработчик, написанный на элементе (onclick,onerror), — выполняется. Шаблон здесь тот же, который принимает атрибутcustomконтейнераDESIGN, с теми же правилами записи места; здесь<Lsf:name>— место, куда попадает стандартная кнопка элемента навигатора с этим именем. В литерале имя разрешается в пространствах имён модуля, поэтому элемент должен быть уже объявлен, а имя, которое ни во что не разрешается, — ошибка; шаблон, вычисляемый свойством, не разрешается, и там пишется каноническое имя.Окно
FORMS— в том числеSystem.forms— и окноSystem.logэлементов навигатора не содержат, но каждому из них можно задать компонент React, и тогда компоненту вместо элементов навигатора передаётся то, что положило в окно работающее приложение: формы, открытые в окне, и сообщения, выведенные вSystem.log. Помещается это тегом<Lsf name/>, и то, что компонент никуда не поместил, не теряется: форма остаётся открытой и скрытой, а сообщение — выведенным. Задать можно только компонент: элементов навигатора, которые заняли бы места шаблона, здесь нет, а то, что показывает такое окно, существует только пока приложение работает, поэтому ни шаблон, ни свойство не принимаются.Остальным окнам
NATIVEнельзя задать ни компонент, ни шаблон, так как в них нет ни элементов навигатора, ни чего-либо другого, по чему их можно было бы нарисовать.
-
Примеры
// cоздание системных окон в модуле System
WINDOW logo HORIZONTAL POSITION(0, 0, 10, 6) VALIGN(CENTER) HALIGN(START) HIDETITLE HIDESCROLLBARS CLASS logoWindowClass();
WINDOW root HORIZONTAL POSITION(10, 0, 70, 6) VALIGN(CENTER) HALIGN(CENTER) HIDETITLE HIDESCROLLBARS CLASS rootWindowClass();
WINDOW system HORIZONTAL POSITION(80, 0, 20, 6) VALIGN(CENTER) HALIGN(END) HIDETITLE HIDESCROLLBARS CLASS systemWindowClass();
WINDOW toolbar VERTICAL POSITION(0, 6, 20, 94) HIDETITLE CLASS toolbarWindowClass();
// в forms открываются формы, в log выводятся сообщения
WINDOW forms FORMS TABBED POSITION(20, 6, 80, 94) CLASS formsWindowClass();
WINDOW log NATIVE POSITION(80, 6, 20, 93) HIDETITLE CLASS logsWindowClass();
// горизонтальное окно внизу рабочего стола, в котором все кнопки будут выравниваться по центру, а текст - выравниваться вверх
// в это окно можно, например, помещать формы для быстрого открытия
WINDOW hotforms HORIZONTAL BOTTOM VALIGN(CENTER) TEXTVALIGN(START);
// окно над областью форм, которое держит одну форму за раз и не выше своей формы, - шапка приложения, открываемая один раз при старте клиента
WINDOW header 'Шапка' FORMS AUTOSIZE POSITION(20, 6, 80, 10) HIDETITLE;
onWebClientStarted() + { SHOW appHeader WINDOW header NOWAIT; }
// окно, которое рисует прикладной компонент React
WINDOW appMenu VERTICAL POSITION(0, 6, 20, 94) HIDETITLE CUSTOM 'AppMenu';
// окно, в котором открываются формы, рисует прикладной компонент React вместо стандартных вкладок
EXTEND WINDOW System.forms CUSTOM 'FormsBoard';
// окно, в котором выводятся сообщения, рисует прикладной компонент React вместо стандартного списка
EXTEND WINDOW System.log CUSTOM 'MessageLog';
// скрытие предопределённого окна сообщений (его сообщения тогда выводятся в лог и не показываются нигде)
HIDE WINDOW System.log;