|
|
Вопрос про виджет внутри виджета и страницу внутри страницы
| Автор |
Сообщение |
|
Сообщение создано: 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".
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:)
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:)
if (f_start) contValOld=subWdg_val=contVal;
if (contVal!=contValOld) contValOld=subWdg_val=contVal;
else if (subWdg_val!=contVal) contValOld=contVal=subWdg_val;
И так с каждым проталкиваемым наверх атрибутом. То есть 3 строчки кода на параметр.
Нормальная идея, только можно проще.
if(contVal != contValOld) subWdg_val=contVal
contVal = contValOld = subWdg_val;
"punk" wrote:
Вы под "обвязывая их скриптом, в том числе используя атрибуты вложенных виджетов" подразумеваете
string linkSet(string attr, string vl, bool prm) — установка ссылки для атрибута виджета <attr>
Имел в виду то что Вы делали +
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 пока рано. Но есть вопросы:
- предполагалась ли такая возможность связывания "через уровень" ?
- если у меня база "кривая" (часто правлю дампы руками, когда нужно добавить похожие атрибуты в разные виджеты или переименовать их пачкой, может быть задел что-то) -- зависание теоретически допустимо, или скада должна выругаться, но устоять?
|
|
|
|
|
|