PDA

Просмотр полной версии : Проблема с передачей переменных


Vic
30.06.2012, 03:12
Посоветуйте как можно передать переменную из класса в класс. Решил разобрать xml и создать массив и его уже передать в другой класс но ниче не выходит . Привожу оба класса. Поправьте пожалуйста. Или подскажите другой вариант.

package coms
{
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.display.Sprite;


public class Graphic
{
private var urlLoader:URLLoader;
private var data:XML;
public var records:XMLList;
public var result:Array;
private var date:String;
private var time:String;
private var open:String;
private var close:String;
private var high:String;
private var low:String;


public function Graphic()
{
urlLoader = new URLLoader;
urlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
}

public function load(path:String):void
{
urlLoader.load(new URLRequest(path));
}

private function xmlLoaded(e:Event):void
{
//trace(urlLoader.data);
data = XML(e.target.data);
records = data.Records.Record;
//trace(records.Date[10]);
candle();
}

private function candle()
{

date = records.Date;
time = records.Time;
open = records.Open;
close = records.Close;
high = records.High;
low = records.Low;
result = [date, time, open, close, high, low];

//trace(result);
}

public function getResult():Array
{
return result;

}


}

}

нужно передать переменные date, time, open, close, high, low или массив result в этот класс:
package coms
{
import flash.display.Sprite;
import flash.display.Graphics;
import flash.display.Shape;
import flash.events.Event;

public class ViewGraphics extends Sprite
{

private var dataXML:Graphic = new Graphic();

public function ViewGraphics()
{
viewXml(dataXML.getResult());

}

private function viewXml(vars:Array):void
{
trace("high " +vars);
}
}
}

Заранее спасибо.

in4core
30.06.2012, 03:26
В вашем примере dataXML не запускает даже метод load чтобы загрузить сам xml. А метод getResult выводит null ибо не определена переменная result.

Структура ViewGraphics должна быть такой

private var dataXML:Graphic = new Graphic();

public function ViewGraphics()
{
dataXML.load('someXML.xml');
dataXML.addEventListener(CustomEvent.LOADED , onLoad);

}
public function onLoad(e:CustomEvent)
{
trace(dataXML.getResult());
}

Vic
30.06.2012, 12:33
чет я немного не понял. Я на линии времени и так вызываю load. Вот код что пишу на линии времени:

import coms.Graphic;
import coms.ViewGraphics;

var graphic:Graphic = new Graphic();

graphic.load("xml/XML.xml");


var wiew:ViewGraphics = new ViewGraphics();

как тут быть?

strangedk
30.06.2012, 16:59
Не пишите на линии времени. Код загрузки XML асинхронный. т.е. он не будет вызываться четко строка за строкой. А только по факту загрузки либо ошибки (если у вас стоит подходящий обработчик)

Vic
01.07.2012, 14:39
сделал так как советовали но не понял что за CustomEvent вы написали. Флеш ругается на него что его не существует.. Подскажите пожалуйста

caseyryan
01.07.2012, 15:06
Там не нужен никакой CustomEvent, это просто лишняя заморочка.
Лучше уж так:

private var dataXML:Graphic = new Graphic();

public function ViewGraphics()
{
dataXML.addEventListener(Event.COMPLETE , onLoad);
dataXML.load('someXML.xml');


}
public function onLoad(e:Event)
{
trace(dataXML.getResult());
}


Ну а в первом класе, соответственно, доставить это событие:

package coms
{
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.display.Sprite;


public class Graphic extends EventDispatcher
{
private var urlLoader:URLLoader;
private var data:XML;
public var records:XMLList;
public var result:Array;
private var date:String;
private var time:String;
private var open:String;
private var close:String;
private var high:String;
private var low:String;


public function Graphic()
{
urlLoader = new URLLoader;
urlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
}

public function load(path:String):void
{
urlLoader.load(new URLRequest(path));
}

private function xmlLoaded(e:Event):void
{
//trace(urlLoader.data);
data = XML(e.target.data);
records = data.Records.Record;
//trace(records.Date[10]);
candle();
dispatchEvent(e); // доставляем событие
}

private function candle()
{

date = records.Date;
time = records.Time;
open = records.Open;
close = records.Close;
high = records.High;
low = records.Low;
result = [date, time, open, close, high, low];

//trace(result);
}

public function getResult():Array
{
return result;

}


}

}


И, чтобы это работало, первый класс должен расширять EventDispatcher

Vic
01.07.2012, 15:17
И так сделал .... Ругается на public class Graphic extends EventDispatcher . Ошибка Определение базового класса EventDispatcher не найдено.

КорДум
01.07.2012, 15:23
Так импортируйте.

Vic
01.07.2012, 16:10
Да чето не сообразил сразу) . Да все получилось но одно но... При получении массива данных в другой клас я не могу работать с массивами в этом массиве , а именно мне нужны
date
time
open
close
high
low

в них данные почему то в строчке . Надо сплитом бить каждый, что не есть хорошо. Можно как то передать из класса в класс массивы масива или может есть какой то вариант попроще и получше, потому что данных в массивах очень много около 10 000. Заранее спасибо всем за ответы.

strangedk
01.07.2012, 21:02
а зачем так сложно, массивы в массивах.

Передавайте хотя-бы тип Object а лучше вообще свой тип объекта, который будет содержать нужные поля.

Vic
01.07.2012, 21:11
Я так уже и сделал. )