EnglishРусскийУкраїнська
В теме много сообщений

Вопрос про виджет внутри виджета и страницу внутри страницы


Автор Сообщение
Сообщение создано: 24. 01. 2012 [14:10]
punk
Василий Петров
Создатель темы
Зарегистрирован(а) с: 09.05.2011
Сообщения: 29
Экспериментировал я тут с двумя вариантами размещения одного виджета внутри другого, и вот что заметил:
- события из включаемого виджета (при необработке в нем) спокойно передаются наверх, а события из открытой "подстраницы" - нет
- при открытии "подстраницы" можно связать ее атрибуты с открывающей (в т.ч. внешней) с помощью ключевого слова <page> в конфигурации, но нельзя связать атрибуты вложенного виджета со внешним

Отсюда 2 вопроса:
- можно ли передать события в открывающую страницу (например, в демо, панель grph_panel закрывается/заменяется на terminator при смене страницы, и непонятно как ее закрыть при нажатии на пустое место мнемосхемы/потери фокуса клапаном без внесения в обработку всех мнемосхем key_mousePress:*:open:/pg_control/pg_terminator и не создавая специального атрибута с динамическим связыванием через <page> и записывания в него "команд" с последующем разбором в корневой странице)
- можно ли сделать чтобы некоторые атрибуты внутреннего виджета "сами" связались с атрибутами использующего (в документации что-то сказано про нерекомендуемый префикс "wdg:"). Это, по идее, полезно для создания сложных библиотечных виджетов, в которых какой-то атрибут глубоко вложенного виджета был бы доступен на "верхнем" уровне для дальнейшего связывания

Или я снова не в ту сторону думаю и есть принципиально другой подход?
Сообщение создано: 24. 01. 2012 [16:20]
gsxr
Андрей Ехлаков
Зарегистрирован(а) с: 03.03.2010
Сообщения: 58
По второму пункту. Нужно связывать эти атрибуты через программу на javalikecalc.javascript. Не очень понятное сходу и не детальное, но все же описание есть в "Быстром старте"
Сообщение создано: 24. 01. 2012 [20:51]
roman
Roman Savochenko
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 1460
"punk" wrote:

- можно ли передать события в открывающую страницу

Можно.

"punk" wrote:

(например, в демо, панель grph_panel закрывается/заменяется на terminator при смене страницы, и непонятно как ее закрыть

Кого её?

"punk" wrote:

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

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

Читайте внимательно концепцию и изучайте ДемоБД, где реализованы и более сложные вещи без каких либо проблем!

Учиться, учиться и учиться лучше чем работать, работать и работать.
Сообщение создано: 25. 01. 2012 [07:57]
punk
Василий Петров
Создатель темы
Зарегистрирован(а) с: 09.05.2011
Сообщения: 29
"gsxr" wrote:

По второму пункту. Нужно связывать эти атрибуты через программу на javalikecalc.javascript. Не очень понятное сходу и не детальное, но все же описание есть в "Быстром старте"

Перечитал его. Увидел только перебрасывание значений
Рис. 5.3.2.19. Результирующий вид вкладки обработка виджета "elCooler" библиотеки "KM 101".
JAVASCRIPT
Ti_arg0val = Ti;
To_arg0val = To;
//тут обработка событий, случай "обратного" копирования
......
  if(ev_wrk == "ws_CombChange:/cw") Cw = cw_value;
......
cw_value = Cw;
cooler2_speed = Cw/5;

Андрей, если Вы про это - то не совсем то - тут копирование а не связывание. Или Вы что-то другое имели ввиду?
Сообщение создано: 25. 01. 2012 [09:21]
punk
Василий Петров
Создатель темы
Зарегистрирован(а) с: 09.05.2011
Сообщения: 29
"roman" wrote:

"punk" wrote:

- можно ли передать события в открывающую страницу

Можно.

Спасибо, намекните, куда смотреть.

"roman" wrote:

"punk" wrote:

(например, в демо, панель grph_panel закрывается/заменяется на terminator при смене страницы, и непонятно как ее закрыть

Кого её?

Попробую написать поподробнее. В обработке (evProc) корневой страницы ДемоБД есть строчка ws_BtPress:*:open:/pg_control/pg_terminator, которая заменяет ElCadr (с grph_panel что-то напутал) на terminator при нажатии на любую кнопку корневой страницы, а хотелось бы, чтобы это происходило при потере фокуса виджетом, открывшим ElCadr. Вот я и изобретаю, как это сделать. Вижу варианты:
- в evProc мнемосхемы написать что-то типа ws_FocusOut:*:open:/pg_control/pg_terminator, и пусть сами мнемосхемы разбираются с "закрытием" ElCadr
- в корневой странице поймать событие ws_FocusOut пришедший от любого виджета любой мнемосхемы (если бы оно пришло) и обработать там
Собственно, про второй вариант и был вопрос.

"roman" wrote:

"punk" wrote:

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

Из скрипта можно достать атрибут любого виджета в дереве сеанса проекта.

С этим пойду разбираться. Полезно, но для другой задачи.
"roman" wrote:

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

Об этом и разговор, что я пытаюсь связать некий "новый" атрибут виджета-контейнера с атрибутом внутреннего, а как - не могу найти, и в демо -- только копирование значений. Копирование я все-же сделал, но пришлось это делать криво т.к. значение может поменяться и извне и самим виджетом. Поэтому пришлось делать так:
(contVal, contValOld - целые в контейнере, subWdg_val - во внутреннем виджете; contVal - "связь выше" с prm:)
JAVASCRIPT
if (f_start) contValOld=subWdg_val=contVal;
if (contVal!=contValOld) contValOld=subWdg_val=contVal;
else if (subWdg_val!=contVal) contValOld=contVal=subWdg_val;

И так с каждым проталкиваемым наверх атрибутом. То есть 3 строчки кода на параметр.

Вы под "обвязывая их скриптом, в том числе используя атрибуты вложенных виджетов" подразумеваете
string linkSet(string attr, string vl, bool prm) — установка ссылки для атрибута виджета <attr>

Сообщение создано: 25. 01. 2012 [12:35]
roman
Roman Savochenko
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 1460
"punk" wrote:

Спасибо, намекните, куда смотреть.

На атрибут "event", который у любого виджета можно установить прямо. У контура параметра, например, таким образом осуществляется преобразование события нажатия кнопки "ПИД".

"punk" wrote:

Попробую написать поподробнее. В обработке (evProc) корневой страницы ДемоБД есть строчка ws_BtPress:*:open:/pg_control/pg_terminator, которая заменяет ElCadr (с grph_panel что-то напутал) на terminator при нажатии на любую кнопку корневой страницы, а хотелось бы, чтобы это происходило при потере фокуса виджетом, открывшим ElCadr. Вот я и изобретаю, как это сделать. Вижу варианты:
- в evProc мнемосхемы написать что-то типа ws_FocusOut:*:open:/pg_control/pg_terminator, и пусть сами мнемосхемы разбираются с "закрытием" ElCadr
- в корневой странице поймать событие ws_FocusOut пришедший от любого виджета любой мнемосхемы (если бы оно пришло) и обработать там
Собственно, про второй вариант и был вопрос.

Это называется "Подъём события через вложение в контейнер". Была мысль это сделать, но по каким-то объективным причинам это было невозможно. Погляжу, может уже нет проблем определить факт вложения страницы в контейнер и адрес этого контейнера.

"punk" wrote:

Об этом и разговор, что я пытаюсь связать некий "новый" атрибут виджета-контейнера с атрибутом внутреннего, а как - не могу найти, и в демо -- только копирование значений. Копирование я все-же сделал, но пришлось это делать криво т.к. значение может поменяться и извне и самим виджетом. Поэтому пришлось делать так:
(contVal, contValOld - целые в контейнере, subWdg_val - во внутреннем виджете; contVal - "связь выше" с prm:)
JAVASCRIPT
if (f_start) contValOld=subWdg_val=contVal;
if (contVal!=contValOld) contValOld=subWdg_val=contVal;
else if (subWdg_val!=contVal) contValOld=contVal=subWdg_val;

И так с каждым проталкиваемым наверх атрибутом. То есть 3 строчки кода на параметр.

Нормальная идея, только можно проще.
JAVASCRIPT
if(contVal != contValOld) subWdg_val=contVal
contVal = contValOld = subWdg_val;


"punk" wrote:

Вы под "обвязывая их скриптом, в том числе используя атрибуты вложенных виджетов" подразумеваете
string linkSet(string attr, string vl, bool prm) — установка ссылки для атрибута виджета <attr>


Имел в виду то что Вы делали +
JAVASCRIPT
ElTp attr(string attr) — получение значения атрибута виджета <attr>. Для отсутствующих атрибутов возвращается пустая строка.
TCntrNodeObj attrSet(string attr, ElTp vl) — установка атрибута виджета <attr> в значение <vl>. Возвращается текущий объект для конкатенации функций установки.


Учиться, учиться и учиться лучше чем работать, работать и работать.
Сообщение создано: 25. 01. 2012 [13:55]
gsxr
Андрей Ехлаков
Зарегистрирован(а) с: 03.03.2010
Сообщения: 58
"punk" wrote:


Андрей, если Вы про это - то не совсем то - тут копирование а не связывание. Или Вы что-то другое имели ввиду?

Другого не знаю.
Сообщение создано: 09. 02. 2012 [13:09]
roman
Roman Savochenko
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 1460
"roman" wrote:

Это называется "Подъём события через вложение в контейнер". Была мысль это сделать, но по каким-то объективным причинам это было невозможно. Погляжу, может уже нет проблем определить факт вложения страницы в контейнер и адрес этого контейнера.

Реализовал!

Учиться, учиться и учиться лучше чем работать, работать и работать.
Сообщение создано: 22. 02. 2012 [12:00]
roman
Roman Savochenko
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 1460
"roman" wrote:

"punk" wrote:

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

Префикс связи "wdg:" вообще не для выноса атрибутов вложенных виджетов на верх.

Реализовал возможность установки связей между виджетами посредством префикса "wdg:" в абсолютном и относительном виде.

Учиться, учиться и учиться лучше чем работать, работать и работать.
Сообщение создано: 27. 03. 2012 [12:44]
punk
Василий Петров
Создатель темы
Зарегистрирован(а) с: 09.05.2011
Сообщения: 29
"roman" wrote:
Реализовал возможность установки связей между виджетами посредством префикса "wdg:" в абсолютном и относительном виде.

Огромное спасибо, все работает. Но поимел тут я наглость написать что-то типа "wdg:../../xxx" (входная связь). Вроде-бы все заработало (параметр слинковался с соответствующим через уровень), но иногда при переключении страниц начались странные зависания -- интерфейс не реагирует ни на что. Добавил в средний уровень атрибут xxx, исправил на "wdg:../xxx" на нижнем (и среднем) уровне, зависния пропали. Повторить такое поведение на демо никак не удалось, так что говорить про bug пока рано. Но есть вопросы:
- предполагалась ли такая возможность связывания "через уровень" ?
- если у меня база "кривая" (часто правлю дампы руками, когда нужно добавить похожие атрибуты в разные виджеты или переименовать их пачкой, может быть задел что-то) -- зависание теоретически допустимо, или скада должна выругаться, но устоять?



0093