Перейти к основному содержимому
Версия: 7.0

Инструкция 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;