Вступление

Часто размерностей, задающих фильтрацию и отбор данных в проекте, бывает очень много и встает вопрос, как разместить такое количество объектов выбора одновременно и в тоже время компактно… Об одном из таких подходов и пойдет далее пример. В нём мы выделим правую вертикальную полоску экрана для полного списка, имеющихся в проекте размерностей, а когда будем нажимать на название, то будет появляться уже сам объект выбора, причём предыдущий открытый объект выбора по другой размерности будет сворачиваться для экономии места.

НА ЗАМЕТКУ! Для реализации данного примера нам потребуется возможность клика динамически изменять данные во внутренних таблицах макета. Для включения данной возможности нужно в меню «Settings\Document Properties» на вкладке «Server» включить галочку «Enable Dynamic Data Update».

Итак, приступим.

Для управления свертыванием/развертыванием меню нам потребуется в скрипте документа создать специальную таблицу, в которую будем записывать состояние выбрана/не выбрана та или иная размерность в нашем меню. Для нашего примера из десяти меню выбора размерностей надо создать 11 полей в таблице:

И создадим одну переменную:

Элементы выбора меню по нашим размерностям реализуем с помощью «Text Object».

Создадим первый такой «Text Object». В качестве «Text» напишем штрих-код.

Слегка доработаем объект, чтобы он походил на меню выбора…
Продолжаем на вкладке General параметр «Horizontal Alignment» выберем «Left».

Для визуального выделения, что меню выбрано, настроим цвет фона объекта. Зайдём в настройки цвета «Background Color» и выберем, как в нашем примере, тип цвета «Two Colors Gradient». Первый цвет (Base Color) выберем как расчетный (Calculated) и пропишем следующую формулу:

Для второго цвета (Second Color) аналогично выберем «Calculated» и пропишем:

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

(последние две переменные — будем использовать для цвета текста размерностей на меню)

С учетом введенных переменных, формула «Base Color» станет такой:

На вкладке Fonts:
Выберем шрифт: Tahoma, полужирный, 9.
А цвет шрифта — выберем «Solid Color», расчетный (Calculated) и пропишем следующую формулу:
IF( _LMenu01=1, €(cLMenuSelect_font), €(cLMenuNoSelect_font))

Высоту объекта сделаем поменьше, например 26 пикселей.
Получили пример (А).

Теперь самое главное: чтобы динамически менять у объектов клика параметры, мы воспользуемся встроенным Visual Basic и напишем на нём пару процедур. Войдем в редактор Visual Basic, выберем в меню «Tools\Edit Module…».
В окне редактора на левой панели настроек выберем: «VBScript». Параметр «Requested Module Security» выберем «System Access», а параметр «Current Local Security» — «Allow System Access».

Первая процедура — это процедура, раскрывающая выбранный объект при выборе меню и передвигающая остальные объекты на свои места. Скопируйте её целиком в редактор VB:
(меню: Tools\Edit Module…)

А также вторую процедуру, которая нужна для первоначальной установки объектов после расчета основного скрипта загрузки:

Как можно заметить в первой процедуре (SelectLMenu), чтобы передать в неё информацию, на какой же элемент меню нажалиЭ, мы передаём её через переменную
vCurrentLMenu, поэтому первый триггер, который мы пропишем для нашего первого элемента меню будет: External\Set Variable —> vCurrentLMenu с присвоением значения =1

И вот тут идея:

Почему мы не стали использовать эту переменную для отображения состояния нашего меню? Да потому, что в клике, при нажатии на команды «Back» или «Forward» значение переменных меняется (также как и состояние выборки) на предыдущее! А это элемент интерфейса, и если он выбран/настроен, то не должен меняться.

Решение — перенести переменные управления в поля макета. Вот для чего мы создали ранее таблицу «_LMenu» с полями «_LMenu01», «_LMenu02» и т.д. (по количеству меню).

Поэтому запишем в эти поля таблицы информацию, что мы выбрали первый элемент. Добавим вторую команду к триггеру, после команды присвоения переменной:
External\Dynamic Update и в поле ввода «Statement» пропишем следующий список команд:

Как видим, мы только в «_LMenu01» записали «1», а во все остальные поля «0».

Осталось только подключить процедуру VB, которая «раскрывает» выбранный элемент меню. Для этого в меню «Settings\Document Properties» на вкладке «Triggers», в нижнем блоке «Variable Event Triggers», находим переменную:
vCurrentLMenu, которую мы уже создали, и для неё пропишем триггер «OnChange»:
External\Run Macro и в поле ввода «Macro Name» впишем имя нашей процедуры: SelectLMenu

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

Пример (Б)

Осталось научить клик понимать какие объекты листа относятся к динамическому меню, а какие нет.

И вот тут ещё одна возможность клика! Мы можем любому объекту клика присваивать любой идентификационный код! То есть на вкладке «General» в поле «Object ID» мы вправе вписать любой свой идентификатор, закодировав в нём нужную нам информацию о данном объекте и для передачи этой информации в процедуры обработки. Если вы уже обратили внимание на процедуры VB, которые мы с вами добавили, то в них делается поиск объектов, ID которых начинается с «LM» или с «FR». Иными словами, мы в «Object ID» для элементов меню выбора (в нашем случае это «Text Object» с названиями размерностей) должны закодировать следующую конструкцию: LM{NN}SH{LL}, где первые буквы «LM» означают кратко «Left Menu», далее {NN} идет порядковый номер меню «01», «02» и т.д., после идет ID листа, на котором мы строим меню с его порядковым номером {LL}.

Для нашего примера (ID листа которого «SH06») составной идентификатор для первого элемента меню будет «LM01SH06», что и нужно прописать в «Object ID».

А вот объект выбора, который при этом появляется при нажатии меню, должен иметь «Object ID» формата как «FR01SH06»! Именно такой объект ищется в процедуре SelectLMenu и передвигается по вертикали к своему нажатому меню (когда нажато первое меню списка).

Итак, создав сначала элементы меню (объекты с ID начинающиеся на LM…), создаем и сами фреймы — объекты клика, которые будут появляться при раскрытии меню и позволят управлять выбором наших размерностей. В простом варианте — это обычные объекты клика, списки (ListBox).

В примере (В) созданы два элемента меню и два списка для выбора размерностей. Как их следует назвать приведено справа на сносках.

Осталась одна деталь, но самая важная. Когда все элементы уже разработаны, нужно для объектов выбора размерностей прописать условие их показа. А именно для первого ListBox, которое имеет название «FR01SH06» нужно на вкладке «Layout» прописать условие «Conditional» _LMenu01=1.

Для второго списка «FR02SH06» условие уже будет _LMenu02=1 и т.д. (думаю, зависимость понятна).
Теперь вы без труда создадите всё меню полностью.

Чтобы привести всё меню после окончания разработки в начальное состояние (т.е. свернуть всё), нужно проапдэйтить все поля с _LMenu01 по _LMenu10 в ноль и вызвать процедуру SetLMenu.
Обе эти команды можно прописать в триггере на переход на страницу и (или) добавить в приложение кнопку «свернуть всё» и прописать эти команды в её триггере (или на вкладке «Actions» если это «Text Object»).

Первая команда:

И вторая команда:
External\Run Macro
в поле ввода «Macro Name» пишем процедуру: SetLMenu

Итак, наш интерфейс готов.

Друзья, на этом все на сегодня! До новых встреч в эфире!