Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   передача переменной между классами (http://www.flasher.ru/forum/showthread.php?t=112201)

Ar4ibald 21.05.2008 04:54

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

Код:

public class XMLLoader extends MovieClip {

                public var maxx:Number;
                public var maxi:Number;
                public var thumbs:Array = new Array();
                public var pics:Array = new Array();
                public var descs:Array = new Array();
                private var novel:XML;
                private var urlLoader:URLLoader;


                public function XMLLoader( ) {




                        var urlRequest:URLRequest = new URLRequest("data/xmlphoto.xml");

                        urlLoader = new URLLoader( );
                        urlLoader.addEventListener(Event.COMPLETE, completeListener);

                        urlLoader.load(urlRequest);

                }

                public function completeListener(e:Event):void {




                        var gallery:XML = new XML(e.target.data);

                        this.maxx = gallery.photo.length(); // эту переменную надо передать
                       
                        var i:Number;
                        for (i=0; i < gallery.photo.length(); i++) {
                                this.thumbs.push(gallery.photo[i].tmb);
                                this.pics.push(gallery.photo[i].img);
                                this.descs.push(gallery.photo[i].desc);

                                trace(" Image: "+ pics[i]);
                                trace(" Thumb: "+ thumbs[i]);
                                trace(" Description: "+ descs[i]);

                                /*массивы тоже передать надо*/
                        }
                }
        }

Переменную maxx надо передать в следующий класс

Код:

public class Test extends MovieClip{
    public var testInfo:int;

    public function Test() {
          var n:News = new News();
                  var XMLLoaded:XMLLoader = new XMLLoader();
                    trace("Maxx:  " + XMLLoaded.maxi);//выводит NAN

    }
}

Подскажите, что я не так делаю. Заранее спасибо

Gaen 21.05.2008 07:56

Обращение к переменной происходит сразу после создания экземпляра класса, а она в это время ещё не определена, так как событие окончания загрузки происходит значительно позже.

Я бы здесь либо отправлял событие окончания загрузки из XMLLoader'a, либо из его собственного обработчика дёргал нужный объект и передавал ему переменную (которой может быть например объект с набором параметров)

Ar4ibald 21.05.2008 11:56

я только начинаю AS3, можете привести простой пример.

vooparker 21.05.2008 12:40

Можно пойти двумя путями - push и poll. Выбирая poll мы шлем событие XMLLoader'ом что все готово, а кому нужно "опрашивает" XMLLoader на предмет интересующей информации.
XMLLoader
Код:

public function completeListener(e:Event):void {
        var gallery:XML = new XML(e.target.data);

        this.maxx = gallery.photo.length(); // эту переменную надо передать
                       
        ...

        dispatchEvent(new Event(Event.COMPLETE));
}

Test
Код:

public class Test extends MovieClip{
    public var testInfo:int;

    public function Test() {
        var n:News = new News();
        var xmlLoaded:XMLLoader = new XMLLoader();
        xmlLoaded.addEventListener(Event.COMPLETE, onXMLComplete);

    }
   
    private function onXMLComplete (event:Event):void
    {
          var loader:XMLLoader = event.target as XMLLoader
          trace("Maxi: " + loader.maxi);
          // подобным образом читаем и наши массивы
    }
}

В случае с push, мы все необходимые данные сохраняем в объекте события и передаем вместе с ним же. Для этого нам потребуется создать наследника класса Event, скажем XMLLoaderEvent, с необходимыми свойствами и разослать его в качестве события.

Тогда код в XMLLoader может быть примерно таким:
Код:

public function completeListener(e:Event):void {
        ...
        var event:XMLLoaderEvent = new XMLLoaderEvent(Event.COMPLETE);
        event.maxi = this.maxi;

        // сюда же можно засунуть и массивы

        dispatchEvent(event);
}

Теперь в обработчике в Test:
Код:

    private function onXMLComplete (event:XMLLoaderEvent):void
    {
          trace("Maxi: " + event.maxi);
          ...
    }


Ar4ibald 21.05.2008 13:10

vooparker, выдает следущую ошибку :

1046: Type was not found or was not a compile-time constant: XMLLoaderEvent.

vooparker 21.05.2008 13:24

Цитата:

Сообщение от Ar4ibald (Сообщение 740388)
vooparker, выдает следущую ошибку :

1046: Type was not found or was not a compile-time constant: XMLLoaderEvent.

Пропустил главное :):

Цитата:

Для этого нам потребуется создать наследника класса Event, скажем XMLLoaderEvent
Ну в самом простом варианте он может выглядеть так:
Код:

package
{
        import flash.events.Event;

        public class XMLLoaderEvent extends Event
        {
                public var maxi:Number;
               
                public function XMLLoaderEvent(type:String)
                {
                        super(type);
                }
        }
}


Ar4ibald 21.05.2008 16:03

опять что-то не так

TypeError: Error #1034: Type Coercion failed: cannot convert flash.events::Event@2e282e1 to main.XMLLoaderEvent.
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at main::XMLLoader/completeListener()
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/flash.net:URLLoader::onComplete()

vooparker 21.05.2008 16:09

давай код

Ar4ibald 21.05.2008 17:38

Вложений: 1
в данном коде использую первый принцып

тут переменная выдает NAN

vooparker 21.05.2008 17:56

Вложений: 1
у тебя в коде каша из двух предложенных вариантов, поэтому и не работает. Плюс немного путаницы вносит именование свойств (maxx, maxi), при этом не понятно что они означают. Переделал твой пример под второй вариант. Единственно что дописал к классу события переопределенный метод clone, который создает точную копию текущего объекта события, собственно в твоем примере работать будет и без него, но на будущее запомни что у всех собственных объектов событий этот метод должен присутствовать и возвращать точную копию.

а про события почитай, это одна из основ программирования на as3


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

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