PDA

Просмотр полной версии : PopupManager помогите решить проблему


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

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

Vasyaga
19.11.2012, 13:59
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
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/using/WS6c678f7b363d5da52e8f1ca1124a0430dcf-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> и всё заработало! Всем спасибо!