PDA

Просмотр полной версии : передача переменной между классами


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
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
в данном коде использую первый принцып

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

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

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

Ar4ibald
21.05.2008, 18:02
vooparker, спасибо огромное.Был бы плюсик - добавил бы! :)

badun
21.05.2008, 18:45
плюсики тут модераторы добавляют ))