Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   PopUp окно (http://www.flasher.ru/forum/showthread.php?t=145395)

Freedom77 06.10.2010 17:28

PopUp окно
 
Как вызвать, передать и получить данные из окна, размещённого в родном mxml? Есть примеры, везде идёт вызов как отдельной компоненты. Нужно вызвать окно не создавая дополнительной компоненты.

Astraport 06.10.2010 19:01

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

Код AS3:

import mx.managers.PopUpManager;//не забудь
 
protected function optionStart_clickHandler(event:MouseEvent):void
                        {
                                var pop2:optionBlock = optionBlock(PopUpManager.createPopUp(this, optionBlock, true));
                                pop2.title="Настройки";
                                pop2.targetMean = meanSend;
                                pop2.targetRotate = rotateSend;
                                pop2.targetSlider = cardWidth/100;
                                PopUpManager.centerPopUp(pop2);
                        }
 
                        public function getOptions(sendMean:Boolean, sendRotate:Boolean, sendSlider:Number):void
                        {
                                meanSend=sendMean;
                                rotateSend=sendRotate;
                                image3.width = sendSlider;
 
                        }

сам поп-ап optionBlock.mxml

Код AS3:

import mx.core.FlexGlobals;//это тоже важно
                        import mx.managers.PopUpManager;
 
private function submitData():void {
                                if (sr1.selected == true){
sendMean = true;
}
                                if (rot.selected == true){
sendRotate = true;
}
                                sendSlider = slSize.value*100;
 
                                FlexGlobals.topLevelApplication.getOptions(sendMean, sendRotate, sendSlider);
                                removeMe();
                        }


Freedom77 06.10.2010 20:53

Спасибо!. Но как я понял из примера тут тоже 2 mxml файла. А как сделать всё на одном. Не создавая дополнительные модули.
+ Вопрос. При нажатии на кнопку создаётся новый компонент "окно". Большое количество нажатий н данную кнопку сказывается ли как то на производительность? Судя по всему просто перезаписывается старая, но на всякий случай спрошу.

Astraport 06.10.2010 21:40

Цитата:

Но как я понял из примера тут тоже 2 mxml файла. А как сделать всё на одном.
А зачем в одном?
Цитата:

При нажатии на кнопку создаётся новый компонент "окно". Большое количество нажатий н данную кнопку сказывается ли как то на производительность?
Не будет других нажатий, т. к. новое окно будет по типу как выводится алерт - к элементам первого нет доступа.

Freedom77 06.10.2010 22:01

1) Желательно в одном, так как вызывающая mxml уже сама является модулем. А плодить модули модулей как то не впечатляет, хотя....
2)Не совсем понял. Вопрос в том, что если редактировать поля датагрида в отдельном окне, то отображать это окно нужно будет много раз. Данные конечно подгружаются каждый раз отдельно из базы. Просто не скажетсля ли
Код AS3:

var windows:Window = new Window();

на производительности (как указывается во многих примерах, хотя в вышеуказанном примере такого нет).

Добавлено через 15 минут
из описания рекомендаций Adobe, говорится что создавать окна можно как и addPopUp() так и createPopUp(). Разница в том что addPopUp() лучше использовать для одноразового вывода информации и код создания можно использовать в родном mxml. Пример:
Код AS3:

 import mx.events.CloseEvent;
            import mx.controls.Label;
            import mx.events.FlexEvent;
            import mx.containers.TitleWindow;
            import mx.managers.PopUpManager;
 
            // method to open the TitleWindow on creationComplete
            private function openTitleWindow(evt:FlexEvent):void {
                // create and configure the TitleWindow
                var tw:TitleWindow = new TitleWindow();
                tw.title = "Title Goes Here";
                tw.showCloseButton = true;
                tw.addEventListener(Event.CLOSE, closeTitleWindow);
                // create and configure a Label
                var label:Label = new Label();
                label.text = "This is a very simple popup window";
                // add the Label to the TitleWindow
                tw.addChild(label);
                // open the TitleWindow as a modal popup window
                PopUpManager.addPopUp(tw, this, true);
            }
 
            // method to close the TitleWindow targeted by a close event
            private function closeTitleWindow(evt:CloseEvent):void {
                PopUpManager.removePopUp(TitleWindow(evt.target));
            }

А createPopUp() лучше использовать для многоразовых вызовов с редактированием данных. И в таком случае лучше создать отдельный mxml со всеми нужными компонентами.
Пошёл копать дальше.

Добавлено через 2 часа 15 минут
Создал компонент Windows.
В программе есть открытие окна при щелчке:
Код AS3:

{
var login:Window=Window(PopUpManager.createPopUp(this, Window , true) as spark.components.TitleWindow);
}

Builder ругается:
1046: Тип не найден или не является константой времени компиляции: Window.
1120: Обращение несуществующего свойства Window.
1180: Вызов предположительно неопределенного метода Window.
Что ему не нравиться?
P.S.: Вызов идет из модуля основного приложения.

GBee 07.10.2010 09:03

создайте окно как компонент, а не как модуль.

Для своих целей я делаю так:
1) Создаю компонент - наследник TitleWindow (хотя все равно чего)
2) В нем прописываю метод

Код AS3:

public function show():void
{
  PopupManager.addPopUp(this, Sprite(Application.application), true);
  PopupManager.centerPopUp(this);
}

3) Где нужно вызываю

Код AS3:

var win:MyWindow = new MyWindow();
win.show();

Соответственно для передачи параметров вовнутрь можно юзать любой метод (win.setParam(bla,bla)). Для получения каких-то данных из окна, я обычно юзаю CloseEvent его детали и публичные геттеры окна (хотя, наверно, лучше генерить свои события)

Пишу по памяти, в коде могут быть ошибки

Freedom77 07.10.2010 09:58

Создаю то как раз как компонент.

Добавлено через 1 час 6 минут
Попробовал как описано Tour De Flex один в один (Flex 4 - TitleWindow). Создал отдельный проект и компонент
Так работает.

У меня копонент размещён не в корне, а в пакете. Может ли это как то вляить? Flash Builder при наведении верно определяет путь до компоненты.

Добавлено через 2 часа 12 минут
Проблема оказалась в том что он размещён в пакете. После переноса в пакет По умолчанию, то всё работает.
Теперь вопрос: Как прописать адрес компоненты так, чтобы заработал из пакета.

Ivanaka 11.12.2010 15:06

Чтобы не плодить тему спрошу здесь. Сделал в самом компоненте попапа метод:
Код AS3:

                        import mx.managers.PopUpManager;
                        public function show(content:String):void        {
                                PopupManager.createPopUp(parentApplication, this, true);
                                PopUpManager.centerPopUp(this);
                        }

Выдает ошибку: "Access of undefined property PopupManager". Видимо проблема в parentApplication, но не пойму что не так...


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

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