Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Léo M Moreira

[Resolvido] Função retornar valor de um Listener

Recommended Posts

Pessoal, desculpe-me criar um tópico meio parecido com o que já tem, mas acho que minha situação é mais específica.

 

Tenho um arquivo XML e estou desenvolvendo uma aplicação para lê-lo

 

playlist.xml

<?xml version="1.0" encoding="utf-8"?>
<midias version="1.0">
	<midia>
		<id>1</id>
		<titulo>Hora Certa</titulo>
		<arquivo>horacerta/horacerta.swf</arquivo>
		<tipo>swf</tipo>
		<rss></rss>
		<oferecimento>
			<id>1</id>
			<img>logo.png</img>
		</oferecimento>
	</midia>	
</midias>

Tenho um arquivo AS chamado arquivoXml.as

package studiom.gereLista{
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.display.*;
	import flash.events.*;

	public class arquivoXml extends MovieClip {

		//Propriedades
		var urlXML:String;
		var dadosXML:XML;
		var listaMidia:XMLList;
		//Método Construtor
		public function arquivoXml(_urlXML:String, _dadosXML:XML, _listaMidia:XMLList) {
			this.urlXML=_urlXML;
			this.dadosXML=_dadosXML;
			this.listaMidia=_listaMidia;
		}
		//Método de carregamento
		public function carregaXml():void {
			var leitorURL:URLLoader = new URLLoader();
			var requisicaoURL:URLRequest=new URLRequest(this.urlXML);
			leitorURL.load(requisicaoURL);
			leitorURL.addEventListener(Event.COMPLETE, xmlLido);
			function xmlLido(evt:Event):void {
				this.dadosXML=XML(leitorURL.data);
				trace(this.dadosXML);
			}
		}

	}
}

O arquivo fla está assim

import studiom.gereLista.*;
var urlXML:String=String("playlist.xml");
var dadosXML:XML = new XML();
var listaXML:XMLList = new XMLList();
var XMLMidias:arquivoXml=new arquivoXml(urlXML,dadosXML,listaXML);
XMLMidias.carregaXml();

Eis o problema... vejam que eu dou um trace(); quando executo o método carregaXml() e ele retorna a estrutura do XML bonitinho... só que o que eu preciso é que o método carregaXml() retorne um objeto do tipo :XML, só que como o objeto XML é criado apenas dentro da função do listener da abertura do arquivo (listaXML) não consigo fazer com que o método carregaXml() dê saída neste objeto.

Alguém poderia me dar uma força?

 

Abs!

Compartilhar este post


Link para o post
Compartilhar em outros sites

desse modo que você quer não teria como, pois a função leitorURL.load(), é assíncrona, existe um tempo até que ela

leia o XML, para só depois ela chama a 'xmlLido', e ela não "prende" a ordem dos comandos, por isso existe o evento COMPLETE

 

você vai ter que trabalhar com eventos tb, e só quando ele for executado, você chama alguma função para dar continuidade

 

 

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Salve!

 

Consegui resolver.... fiz da seguinte forma..

Na função XMLLido (executada no evento listener do URLLoader) coloquei o seguinte código

this.dispatchEvent( new Event(arquivoXml.COMPLETE));

Já no meu .fla coloquei

 

XMLMidias.addEventListener(arquivoXml.COMPLETE, leituraCompleta);
function leituraCompleta(evt:Event):void {
	trace(XMLMidias.listaMidia);	
}

Consegui!

 

Abs! Valeu por tudo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá gente.

 

Estou passando pelo mesmo problema que o Léo há meses (é só um hobby essa aplicação, então não estou dedicando muito tempo a isso) e tentei a mesma solução que ele, porém recebo o erro de "Access of possibly undefined property COMPLETE through a reference with static type Class." Como já apanhei muito com isso, já sei que esse erro é que estou tentando usar na Classe um método que ela não suporta. MAS COMO O DELE FUNCIONOU ???

 

Segue meu código:

 

 

Classe no arquivo twitterquery.as:

 

package

{

import flash.display.Sprite;

import flash.errors.*;

import flash.events.*;

import flash.net.URLLoader;

import flash.net.URLRequest;

import flash.net.URLVariables;

 

public class TwitterQuery extends Sprite

{

var _xmlTwitter:String

 

public function TwitterQuery(tipoConsulta:String)

{

//criando o URLRequest e a variável que irá junto no endereço

var urlPHP:URLRequest = new URLRequest("http://localhost/twitter.php");

var urlVariables:URLVariables = new URLVariables()

//----

 

//criando o URLLoader

var loader:URLLoader = new URLLoader()

//---

 

//definindo o valor das variáveis que serão enviadas juntas por GET

urlVariables.tipo = tipoConsulta;

//---

 

//criando a variavel que receberá o texto convertido dos dados para criar o XML

var dataTwitter:String;

//---

 

 

//Adicionando as variáveis à requisição de URL

urlPHP.data = urlVariables;

 

 

loader.load(urlPHP);

loader.addEventListener(Event.COMPLETE, useData);

 

 

function useData(event:Event):void

{

dataTwitter = event.target.data;

_xmlTwitter = dataTwitter.substring(dataTwitter.indexOf(".xml")+4,dataTwitter.length)

//trace(_xmlTwitter)

this.dispatchEvent( new Event(TwitterQuery.COMPLETE))

};

}

}

}

 

 

 

Código no FLA:

 

var query:TwitterQuery = new TwitterQuery("home_timeline")

 

query.addEventListener(arquivoXml.COMPLETE, leituraCompleta);

 

function leituraCompleta(evt:Event):void {

trace(query._xmlTwitter);

}

 

 

 

 

Vou continuar tentando resolver isso por aqui também por enquanto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

foi quase, só troca essa linha:

 

 

query.addEventListener(arquivoXml.COMPLETE, leituraCompleta);

 

por essa:

 

query.addEventListener(TwitterQuery.COMPLETE, leituraCompleta);

 

depois, declara essa variável na sua classe

 

 

 

public class TwitterQuery extends Sprite
{
var _xmlTwitter:String
public static const COMPLETE:String = "onComplete";


................

 

 

testa ai para ver

 

 

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.