Просмотр полной версии : PopupManager помогите решить проблему
Недавно столкнулся с проблемой: В приложении есть окно с контролами. Фактически, оно является дочерним элементом контейнера 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
Желательно хотя бы минимум кода. Одно окно вызывается из другого окна?
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
В том-то и дело, что ни в каком параметре ошибки нет! Ошибка возникает раньше. Опишу по шагам:
1) Ставлю breakpoint отладчика на строку вызова popup.
2) Запускаю приложение и дебаг не доходит до обработчика события CLICK и тем более до вызова PopUpManager.
3) Если закомментировать весь код с PopUpManager, то все начинает работать без ошибок
В приложении есть окно с контролами.
Какое окно? Созданное PopUpManager?
Похоже, событие перехватывается SystemManager.
SystemManager подписывается на capture фазу события MOUSE_DOWN.
Стек полностью приведите.
Посмотрите что приходит в качестве target в mouseEventHandler в SystemManager или в mouseDownHandler в ActiveWindowManager.
Какое окно? Созданное PopUpManager?
Нет, это mxml-Application (не обязательно верхнего уровня), которое будет родителем для созданного PopUpManager-ом окна
SystemManager подписывается на capture фазу события MOUSE_DOWN.
Стек полностью приведите.
Посмотрите что приходит в качестве target в mouseEventHandler в SystemManager или в mouseDownHandler в ActiveWindowManager.
Хорошо, посмотрю, спасибо.
alatar, по target: Действительно, отрабатывается событие 'MOUSE_DOWN' в ActiveWindowManager. В качестве target там присутствует контрол, на котором нажата кнопка мыши. Естественно, target меняется в зависимости от того, на что нажали.
В качестве currentTarget там выступает экземпляр SystemManager с классом документа (главный mxml) в качестве child. Скриншот стека во вложении.
Теряюсь в догадках в чем может быть проблема.
Я просто не могу понять сути - откуда ошибка? В чем разница между адобовским примером и моим приложением?
Скриншот стека во вложении.
Трейс стека можно взять из консоли в виде текста. Что толку от ваших обрезков?
Трейс стека можно взять из консоли в виде текста. Что толку от ваших обрезков? Я, конечно, извиняюсь, но как это сделать во FlashDevelop?
Ох уж этот FlashDevelop. Из флеш плеера скопируйте.
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.
AlexCooper, спасибо, кэп ;) Только вот я ничего нигде не вызываю! До этого не доходит, перед CLICK срабатывает MOUSE_DOWN. Инициализация листнера, видимо, происходит при инициализации статического класса PopUpManager. По идее, я вообще не должен заморачиваться на внутренней реализации этого класса, ибо это часть Flex framework. Но приходится ;)
AlexCooper
21.11.2012, 12:44
Кэп всегда на стрёме))
Код вашего Application с кнопками привести можете? Или минимальный пример в котором воспроизводится это поведение.
Небольшую зацепку нашел: у меня в основном mxml после инициализации создается объект MainWindow (потомок Application), который затем добавляется методом addElement к основному application. Уже в экземпляре MainWindow я пытаюсь вызывать PopUpManager.addPopUp и это дает ошибку (по-прежнему непонятно почему). Если я делаю тот же вызов PopUpManager.addPopUp в главном mxml, то всё работает нормально. Буду признателен, если у кого-нибудь есть мысли по этому поводу. Пока что перемещу всё в основной mxml и буду оттуда вызывать popup-ы.
А у вас spark или mx? Просто везде в трейсах вижу мх, а используете addElement, который вроде как спарка.
GBee, в spark используется mx-овский PopUpManager: http://help.adobe.com/en_US/flex/using/WS6c678f7b363d5da52e8f1ca1124a0430dcf-8000.html (см. пример ниже по тексту страницы)
А вы так и не ответили.
Да я так размышляю. Вы добавляете с помощью addElement. А валится на getChildIndex(), хотя по идее должен использовать getElementIndex(). То есть какая-то запутка все-таки есть, поэтому я и спрашиваю у вас Аппликейшен мх или спарк? И, по идее, указание FlexGlobals.topApplication в качестве парента должно помочь в таком случае.
у меня в основном mxml после инициализации создается объект MainWindow (потомок Application)
Чем обусловлено такое решение? Это собственно и есть причина ошибки.
Добавлено через 6 минут
А валится на getChildIndex(), хотя по идее должен использовать getElementIndex().
Валится в SystemManager, который не является spark контейнером.
Мой аппликейшн - спарк. Указывать FlexGlobals.topApplication уже пробовал - без изменений.
Добавлено через 3 минуты
Чем обусловлено такое решение? Это собственно и есть причина ошибки.
Предполагал, что, возможно, будут еще splash-screen - подобные окошечки отображаться в процессе инициализации, может быть прелодеры, wizard-ы при первом запуске и т. д. Не хотел создавать экземпляр UI в памяти. Объясните, пожалуйста, природу ошибки. В чем там проблема?
Предполагал, что, возможно, будут еще splash-screen - подобные окошечки отображаться в процессе инициализации, может быть прелодеры, wizard-ы при первом запуске и т. д.
И как это объясняет желание создать в приложении второй Application, который не является ребенком SystemManager?
Не хотел создавать экземпляр UI в памяти.
Это вообще к чему? Не хотите не создавайте.
Объясните, пожалуйста, природу ошибки. В чем там проблема?
Проблема в слушателе mouseDownHandler в SystemManager. Предполагается, что Application является ребенком SystemManager, что в вашем случае оказывается неверным и при попытке получить индекс объекта в SystemManager вываливается ошибка.
2 alatar, Всё, я просветлился, спасибо! Выходило вот что: я создавал внутри Application другой Application и в этом была проблема. Изменил у внутреннего (динамически создаваемого окна) mxml тэги <Application> на <Group> и всё заработало! Всем спасибо!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.