Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   PopupManager помогите решить проблему (http://www.flasher.ru/forum/showthread.php?t=187428)

Vasyaga 19.11.2012 12:07

PopupManager помогите решить проблему
 
Недавно столкнулся с проблемой: В приложении есть окно с контролами. Фактически, оно является дочерним элементом контейнера Application. В этом окне при нажатии на кнопку пытаюсь вызвать модальный popup-диалог с помощью PopUpManager. Выдает следующую ошибку:
Код:

[Fault] exception, information=ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
Вызываемый модальный диалог унаследован от TitleWindow. Причем способ вызова всплывающего окна не важен - хоть PopupManager.createPopup, хоть PopupManager.addPopup (для уже созданного экземпляра диалога). Пытался отладчиком посмотреть - никаких результатов - ошибка вылетает после клика, но до захода в обработчик события нажатия на кнопку. Похоже, событие перехватывается SystemManager. Вот скриншот стека во время ошибки:
http://www.flasher.ru/forum/picture....&pictureid=325
Есть ли у кого мысли по этому поводу? Всю голову сломал ;)

Astraport 19.11.2012 13:23

Желательно хотя бы минимум кода. Одно окно вызывается из другого окна?

Vasyaga 19.11.2012 13:59

Код AS3:

                public function popupWizard() : IFlexDisplayObject {
                        var displayObject:IFlexDisplayObject =PopUpManager.createPopUp(this, GalleryWizard, true);
                        return displayObject;
                }

Функция popupWizard описана в mxml-е вызывающего окна. GalleryWizard - наследник TitleWindow

Astraport 19.11.2012 14:57

Так ошибка в этой строке var displayObject:IFlexDisplayObject =PopUpManager.createPopUp(this, GalleryWizard, true); ? В каком именно параметре?

Можно попробовать вместо parent использовать FlexGlobals.topLevelAplication

Vasyaga 19.11.2012 15:49

В том-то и дело, что ни в каком параметре ошибки нет! Ошибка возникает раньше. Опишу по шагам:
1) Ставлю breakpoint отладчика на строку вызова popup.
2) Запускаю приложение и дебаг не доходит до обработчика события CLICK и тем более до вызова PopUpManager.
3) Если закомментировать весь код с PopUpManager, то все начинает работать без ошибок

alatar 19.11.2012 20:31

Цитата:

В приложении есть окно с контролами.
Какое окно? Созданное PopUpManager?

Цитата:

Похоже, событие перехватывается SystemManager.
SystemManager подписывается на capture фазу события MOUSE_DOWN.

Стек полностью приведите.
Посмотрите что приходит в качестве target в mouseEventHandler в SystemManager или в mouseDownHandler в ActiveWindowManager.

Vasyaga 20.11.2012 09:25

Цитата:

Какое окно? Созданное PopUpManager?
Нет, это mxml-Application (не обязательно верхнего уровня), которое будет родителем для созданного PopUpManager-ом окна
Цитата:

SystemManager подписывается на capture фазу события MOUSE_DOWN.

Стек полностью приведите.
Посмотрите что приходит в качестве target в mouseEventHandler в SystemManager или в mouseDownHandler в ActiveWindowManager.
Хорошо, посмотрю, спасибо.

Vasyaga 20.11.2012 11:32

Вложений: 1
alatar, по target: Действительно, отрабатывается событие 'MOUSE_DOWN' в ActiveWindowManager. В качестве target там присутствует контрол, на котором нажата кнопка мыши. Естественно, target меняется в зависимости от того, на что нажали.
В качестве currentTarget там выступает экземпляр SystemManager с классом документа (главный mxml) в качестве child. Скриншот стека во вложении.
Теряюсь в догадках в чем может быть проблема.
Я просто не могу понять сути - откуда ошибка? В чем разница между адобовским примером и моим приложением?

alatar 20.11.2012 19:35

Цитата:

Скриншот стека во вложении.
Трейс стека можно взять из консоли в виде текста. Что толку от ваших обрезков?

Vasyaga 20.11.2012 20:13

Цитата:

Трейс стека можно взять из консоли в виде текста. Что толку от ваших обрезков?
Я, конечно, извиняюсь, но как это сделать во FlashDevelop?

alatar 20.11.2012 21:06

Ох уж этот FlashDevelop. Из флеш плеера скопируйте.

Vasyaga 21.11.2012 11:48

Код:

ArgumentError: Error #2025: Предоставленный DisplayObject должен быть дочерним элементом вызывающего объекта.
        at flash.display::DisplayObjectContainer/getChildIndex()
        at mx.managers::SystemManager/getChildIndex()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\SystemManager.as:1823]
        at mx.managers.systemClasses::ActiveWindowManager/mouseDownHandler()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\systemClasses\ActiveWindowManager.as:483]
        at flash.events::EventDispatcher/dispatchEventFunction()
        at flash.events::EventDispatcher/dispatchEvent()
        at mx.core::UIComponent/dispatchEvent()[E:\dev\4.y\frameworks\projects\framework\src\mx\core\UIComponent.as:13152]
        at mx.managers::SystemManager/mouseEventHandler()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\SystemManager.as:2918]

Оно?

AlexCooper 21.11.2012 12:07

насколько я понимаю у вас не соответствие родителя с наследником. По простому вы вызываете mc.getChildIndex(spr) где spr не относиться к mc.

Vasyaga 21.11.2012 12:13

AlexCooper, спасибо, кэп ;) Только вот я ничего нигде не вызываю! До этого не доходит, перед CLICK срабатывает MOUSE_DOWN. Инициализация листнера, видимо, происходит при инициализации статического класса PopUpManager. По идее, я вообще не должен заморачиваться на внутренней реализации этого класса, ибо это часть Flex framework. Но приходится ;)

AlexCooper 21.11.2012 12:44

Кэп всегда на стрёме))

alatar 21.11.2012 12:53

Код вашего Application с кнопками привести можете? Или минимальный пример в котором воспроизводится это поведение.

Vasyaga 21.11.2012 13:33

Небольшую зацепку нашел: у меня в основном mxml после инициализации создается объект MainWindow (потомок Application), который затем добавляется методом addElement к основному application. Уже в экземпляре MainWindow я пытаюсь вызывать PopUpManager.addPopUp и это дает ошибку (по-прежнему непонятно почему). Если я делаю тот же вызов PopUpManager.addPopUp в главном mxml, то всё работает нормально. Буду признателен, если у кого-нибудь есть мысли по этому поводу. Пока что перемещу всё в основной mxml и буду оттуда вызывать popup-ы.

GBee 21.11.2012 14:09

А у вас spark или mx? Просто везде в трейсах вижу мх, а используете addElement, который вроде как спарка.

Vasyaga 21.11.2012 14:13

GBee, в spark используется mx-овский PopUpManager: http://help.adobe.com/en_US/flex/usi...0dcf-8000.html (см. пример ниже по тексту страницы)

GBee 21.11.2012 15:51

А вы так и не ответили.

Да я так размышляю. Вы добавляете с помощью addElement. А валится на getChildIndex(), хотя по идее должен использовать getElementIndex(). То есть какая-то запутка все-таки есть, поэтому я и спрашиваю у вас Аппликейшен мх или спарк? И, по идее, указание FlexGlobals.topApplication в качестве парента должно помочь в таком случае.

alatar 21.11.2012 16:20

Цитата:

у меня в основном mxml после инициализации создается объект MainWindow (потомок Application)
Чем обусловлено такое решение? Это собственно и есть причина ошибки.

Добавлено через 6 минут
Цитата:

А валится на getChildIndex(), хотя по идее должен использовать getElementIndex().
Валится в SystemManager, который не является spark контейнером.

Vasyaga 21.11.2012 16:53

Мой аппликейшн - спарк. Указывать FlexGlobals.topApplication уже пробовал - без изменений.

Добавлено через 3 минуты
Цитата:

Чем обусловлено такое решение? Это собственно и есть причина ошибки.
Предполагал, что, возможно, будут еще splash-screen - подобные окошечки отображаться в процессе инициализации, может быть прелодеры, wizard-ы при первом запуске и т. д. Не хотел создавать экземпляр UI в памяти. Объясните, пожалуйста, природу ошибки. В чем там проблема?

alatar 21.11.2012 18:11

Цитата:

Предполагал, что, возможно, будут еще splash-screen - подобные окошечки отображаться в процессе инициализации, может быть прелодеры, wizard-ы при первом запуске и т. д.
И как это объясняет желание создать в приложении второй Application, который не является ребенком SystemManager?
Цитата:

Не хотел создавать экземпляр UI в памяти.
Это вообще к чему? Не хотите не создавайте.
Цитата:

Объясните, пожалуйста, природу ошибки. В чем там проблема?
Проблема в слушателе mouseDownHandler в SystemManager. Предполагается, что Application является ребенком SystemManager, что в вашем случае оказывается неверным и при попытке получить индекс объекта в SystemManager вываливается ошибка.

Vasyaga 21.11.2012 18:17

2 alatar, Всё, я просветлился, спасибо! Выходило вот что: я создавал внутри Application другой Application и в этом была проблема. Изменил у внутреннего (динамически создаваемого окна) mxml тэги <Application> на <Group> и всё заработало! Всем спасибо!


Часовой пояс GMT +4, время: 07:30.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.