..:: MX Studio Fóruns ::..: Ajuda com Classe em ActionSript 2.0 - ..:: MX Studio Fóruns ::..

Jump to content

Publicidade




ATENÇÃO

Para evitar posts desnecessários e que não influam para o andamento e desenvolvimento do fórum, clique aqui e leia todas as regras.
Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Ajuda com Classe em ActionSript 2.0 O objeto não consegue retornar o valor!

#1 User is offline   DanielGianni 

  • Group: Membros
  • Posts: 33
  • Joined: 28-February 05

  Posted 07 March 2005 - 01:51 PM

Criei a danada da Classe, só que meu objeto não retorna nenhum valor.

Aluno.as
CODE

class Aluno {
/////////////////////////////////
// Variáveis
/////////////////////////////////

private var _alunoID  : String;
private var _alunoNome  : String;
private var _alunoErro  : String;

/////////////////////////////////
// construtor
////////////////////////////////

function Aluno() {
_alunoID  = '';
_alunoNome  = '';
_alunoErro  = '';
BuscaNomeID();
}

/////////////////////////////////
// busca informações aluno
////////////////////////////////

private function BuscaNomeID() {
trace('BuscaNomeID rodando');
var recebe:LoadVars   = new LoadVars();
recebe.onLoad     = function(success) {
 if (recebe.alunoErro=="nao") {
 
  _alunoNome   = recebe.alunoNome;
  _alunoID   = recebe.alunoID;
  _alunoErro  = '';
  trace('BuscarNomeID nome->'+_alunoNome);
       
 } else {
  _alunoErro+= 'Erro: ' + recebe.alunoErro + '\n';    
 }
}

recebe.load("http://127.0.0.1/aluno.php?action=nome_id&"+(new Date().getTime()));
// recebe.load está retornando corretamente
// recebe.alunoNome => "Daniel"
// recebe.alunoID   => "100"
// recebe.erro      => "nao"
}
/////////////////////////////////
// retorna informações aluno
////////////////////////////////

public function NomeAluno():String {
return _alunoNome;
}

public function IDAluno():String {
return _alunoID;
}

} // fecha class



No filme com somente 1 frame, tenho apenas o código AS 2.0

aluno.swf
CODE

import Aluno

var objAluno:Aluno = new Aluno();
trace ( 'NomeAluno='+objAluno.NomeAluno() );
trace ( 'IDAluno='+objAluno.IDAluno() );


O menu Output gera pelos meus traces o seguinte:

CODE

BuscaNomeID rodando
NomeAluno=
IDAluno=
BuscarNomeID nome->Daniel


Acho que o erro está em rodar o trace no objeto antes do carregamento dos dados. Não sei não já estou desesperado porque não consigo mais pensar no porque não funciona!
0

#2 User is offline   hufersil 

  • Group: Moderadores
  • Posts: 1265
  • Joined: 15-January 04

Posted 08 March 2005 - 08:16 AM

o erro está exatamente onde vc falou.
O correto seria vc disparar um evento assim que o carregamento tivesse terminado, e através de um listener, vc capturasse este evento.

Assim:

CODE

// no inicio

import mx.events.EventDispatcher;

class Aluno {

// declaramos as funções que iremos usar da classe EventDispatcher
var addEventListener:Function = new Function();
var removeEventListener:Function = new Function();
var dispatchEvent:Function = new Function();

// depois, no construtor:

function Aluno() {
// inicializa o EventDispatcher
mx.events.EventDispatcher.initialize(this);
_alunoID  = '';
_alunoNome  = '';
_alunoErro  = '';

}


// depois, na hora do load

// temos que copiar a classe dentro do objeto loadVars, para que ele possa
// usufruir do EventDispatcher e, ao invés de deixar ela como uma função
// private, vamos coloca-la como publica e tirar do construtor, para que
// possamos utilizar o dispatcher corretamente.

public function BuscaNomeID() {
trace('BuscaNomeID rodando');
var recebe:LoadVars   = new LoadVars();

recebe._ref = this;

recebe.onLoad     = function(success) {
if (recebe.alunoErro=="nao") {
 
 _alunoNome   = recebe.alunoNome;
 _alunoID   = recebe.alunoID;
 _alunoErro  = '';
 trace('BuscarNomeID nome->'+_alunoNome);
       
} else {
 _alunoErro+= 'Erro: ' + recebe.alunoErro + '\n';    
}
// depois que carregar, dispara o evento onData
this._ref.dispatchEvent(new Object({type:"onData"}));
}

recebe.load("http://127.0.0.1/aluno.php?action=nome_id&"+(new Date().getTime()));
// recebe.load está retornando corretamente
// recebe.alunoNome => "Daniel"
// recebe.alunoID   => "100"
// recebe.erro      => "nao"
}


ok, na sua classe agora tem que funcionar
vamos para o outro arquivo:

CODE

import Aluno

var objAluno:Aluno = new Aluno();
var lis:Object = new Object();

lis.onData = function (evt) {
 trace(evt.target.NomeAluno());
 trace(evt.target.IDAluno());
}

objAluno.addEventListener('onData',lis);
objAluno.BuscaNomeID();


agora, toda vez que vc usar a função BuscaNomeID ele irá executar o que está no ouvinte lis e executar a função onData do mesmo.

@braços
0

#3 User is offline   DanielGianni 

  • Group: Membros
  • Posts: 33
  • Joined: 28-February 05

  Posted 08 March 2005 - 09:56 AM

hufersil, agradeço e muito sua ajuda, mas o négocio tá feio mesmo. Não funcionou!

Os arquivos com as alterações colocadas por você:

Aluno.as
CODE
import mx.events.EventDispatcher;

class Aluno {
/////////////////////////////////
// Eventos Dispatcher
/////////////////////////////////
var addEventListener:Function    = new Function();
var removeEventListener:Function = new Function();
var dispatchEvent:Function       = new Function();

/////////////////////////////////
// Variáveis
/////////////////////////////////

public var _alunoID   : String;
public var _alunoNome : String;
public var _alunoErro : String;

/////////////////////////////////
// construtor
////////////////////////////////

function Aluno() {
// inicializa o EventDispatcher
mx.events.EventDispatcher.initialize(this);
_alunoID  = '';
_alunoNome       = '';
_alunoErro  = '';
}

/////////////////////////////////
// busca informações aluno
////////////////////////////////

public function BuscaNomeID() {
trace('BuscaNomeID rodando');
// depois, na hora do load
// temos que copiar a classe dentro do objeto loadVars, para que ele possa
// usufruir do EventDispatcher e, ao invés de deixar ela como uma função
// private, vamos coloca-la como publica e tirar do construtor, para que
// possamos utilizar o dispatcher corretamente.

var recebe:LoadVars   = new LoadVars();
recebe._ref = this;
recebe.onLoad    = function(success) {
 if (recebe.alunoErro=="nao") {
  _alunoNome   = recebe.alunoNome;
  _alunoID   = recebe.alunoID;
  _alunoErro  = '';
 } else {
  _alunoErro  += 'Erro: ' + recebe.alunoErro + '\n';    
 }
 // depois que carregar, dispara o evento onData
this._ref.dispatchEvent(new Object({type:"onData"}));
}

recebe.load("http://127.0.0.1/aluno.php?action=nome_id&"+(new Date().getTime()));
// recebe.load está retornando corretamente
// recebe.alunoNome => "Daniel"
// recebe.alunoID   => "100"
// recebe.erro      => "nao"
}
/////////////////////////////////
// retorna informações aluno
////////////////////////////////

public function get NomeAluno():String {
return String(_alunoNome);
}

public function get IDAluno():String {
return String(_alunoID);
}

} // fecha class



Como pode ver até tentei colocar o GET na declaração das funções de retorno NomeAluno() e IDAluno() além de colocar todas as variáveis como PUBLIC mas nem com isso funcionou.

aluno.swf
CODE
import Aluno

var objAluno:Aluno = new Aluno();
var lis:Object = new Object();

lis.onData = function (evt) {
trace('evtNome='+evt.target.NomeAluno());
trace('evtID='+evt.target.IDAluno());
}

objAluno.addEventListener('onData',lis);
objAluno.BuscaNomeID();

trace ( 'NomeAluno='+objAluno.NomeAluno() );
trace ( 'IDAluno='+objAluno.IDAluno() );


Vejamos o que está retornando com GET nas functions de retorno NomeAluno() e IDAluno():
CODE
BuscaNomeID rodando
NomeAluno=undefined
IDAluno=undefined
evtNome=undefined
evtID=undefined


Agora sem o GET nas functions de retorno NomeAluno() e IDAluno():
CODE
BuscaNomeID rodando
NomeAluno=
IDAluno=
evtNome=
evtID=

0

#4 User is offline   hufersil 

  • Group: Moderadores
  • Posts: 1265
  • Joined: 15-January 04

Posted 08 March 2005 - 10:25 AM

testei essa e funcionou

CODE

import mx.events.EventDispatcher;
class Aluno {
/////////////////////////////////
// Eventos Dispatcher
/////////////////////////////////
var addEventListener:Function = new Function();
var removeEventListener:Function = new Function();
var dispatchEvent:Function = new Function();
/////////////////////////////////
// Variáveis
/////////////////////////////////
private var _alunoID:String = new String();
private var _alunoNome:String = new String();
private var _alunoErro:String = new String();
/////////////////////////////////
// construtor
////////////////////////////////
function Aluno() {
 // inicializa o EventDispatcher
 mx.events.EventDispatcher.initialize(this);
}
/////////////////////////////////
// busca informações aluno
////////////////////////////////
public function BuscaNomeID() {
 trace('BuscaNomeID rodando');
 // depois, na hora do load
 // temos que copiar a classe dentro do objeto loadVars, para que ele possa
 // usufruir do EventDispatcher e, ao invés de deixar ela como uma função
 // private, vamos coloca-la como publica e tirar do construtor, para que
 // possamos utilizar o dispatcher corretamente.
 var recebe:LoadVars = new LoadVars();
 recebe._ref = this;
 recebe.onLoad = function(success) {
  if (this.alunoErro == "nao") {
   this._ref._alunoNome = this.alunoNome;
   this._ref._alunoID = this.alunoID;
   this._ref._alunoErro = '';
  } else {
   this._ref._alunoErro += 'Erro: '+this.alunoErro+'\n';
  }
  // depois que carregar, dispara o evento onData
  this._ref.dispatchEvent(new Object({type:"onData", target:this._ref}));
 };
 recebe.load("http://127.0.0.1/aluno.php?action=nome_id&"+(new Date().getTime()));
 // recebe.load está retornando corretamente
 // recebe.alunoNome => "Daniel"
 // recebe.alunoID   => "100"
 // recebe.erro      => "nao"
}
/////////////////////////////////
// retorna informações aluno
////////////////////////////////
public function NomeAluno():String {
 return this._alunoNome;
}
public function IDAluno():String {
 return this._alunoID;
}
}
// fecha class


swf
CODE

import Aluno

var objAluno:Aluno = new Aluno();
var lis:Object = new Object();

lis.onData = function (evt) {
trace('evtNome=' + evt.target.NomeAluno());
trace('evtID=' + evt.target.IDAluno());
}

objAluno.addEventListener('onData',lis);
objAluno.BuscaNomeID();


PHP

CODE

alunoNome=hugo&alunoID=150&alunoErro=nao


@braços!
0

#5 User is offline   DanielGianni 

  • Group: Membros
  • Posts: 33
  • Joined: 28-February 05

  Posted 08 March 2005 - 04:07 PM

hufersil, agora sim! funcionou mesmo!

Só que veja, actionscript 2.0 é linguagem anti-programador.

Saco só como o problema migrou de lugar! blink.gif
CODE
import Aluno

var objAluno:Aluno = new Aluno();
var lis:Object = new Object();

var nome:String = new String();
var id:String       = new String();


lis.onData = function (evt) {
trace('evtNome=' + evt.target.NomeAluno());
trace('evtID=' + evt.target.IDAluno());

nome = evt.target.NomeAluno();
id      = evt.target.IDAluno();

}

objAluno.addEventListener('onData',lis);
objAluno.BuscaNomeID();

// hora da mágica!!!!

trace(nome);
trace(id);

// esses 2 traces vão retornar .... adinvinha? .... NADA.... vão ficar fazios, as variáveis não sae do lis.onData, o que era a mesma coisa dentro da classe.


Sabe o que eu tive que fazer ph34r.gif tive que criar 3 dynamic text fora do palco e guardar os valores neles, só assim consigo usá-los no resto do filme.

Nossa que sofrimento esse AS2.0, acho que vou comprar a bíblia em inglês pra ver se melhoro!

Mesmo assim, valeu mesmo a força, você tá virando o Guru do Fórum, vencendo os desafios, postando resposta de questões mediúnicas como essa rsrs.
0

#6 User is offline   hufersil 

  • Group: Moderadores
  • Posts: 1265
  • Joined: 15-January 04

Posted 08 March 2005 - 05:00 PM

hehehe

é normal o que aconteceu.
Quando vc dá akele trace direto, o Flash ainda não havia recebido os valores das vars enviadas pelo PHP, daeh não mostra nada mesmo.

Por isso, elas devem ser alteradas dentro do evento do listener que te mostrei, por que ele se certifica que a resposta do PHP foi recebida.

@braços
0

#7 User is offline   DanielGianni 

  • Group: Membros
  • Posts: 33
  • Joined: 28-February 05

  Posted 09 March 2005 - 01:55 PM

O problema acho que deve ser o modelo de OOP do flash, porque veja só:

CODE
import Aluno

// instanciar objetos
var objAluno:Aluno = new Aluno();
var lis:Object     = new Object();
var n:Object       = new Object();
var x:String       = new String();

lis.onData = function (evt) {
 var y:String = new String();
 trace("Nome do Aluno =>"+evt.target.NomeAluno());
 trace("ID do Aluno =>"+evt.target.IDAluno());
 trace("Msg de Erro =>"+evt.target.ErroAluno());
 n.addProperty("dados",evt.target.NomeAluno(),null);
 x = evt.target.NomeAluno();
 _global.y = evt.target.NomeAluno();
}

objAluno.addEventListener('onData',lis);
objAluno.BuscaNomeID();

trace('n =>'+n.dados);
trace('x =>'+x);
trace('y =>'+lis.y);



Tá vendo, não consigo arrancar os valores para atribuir as variáveis nem evocando tudo que é jeito pelo flash, e olha que até tentei passar as variáveis na chamada de lis.OnData function (evt, x:String)

Desisto! isso não tem jeito terei q fazer um monte de dynamic text ocultos para guardar as informações para usar no resto do filme, e não quero nem pensar na ora de fazer o contrário FLASH -> PHP.

A Macromedia tem alguma coisa contra os programadores? ou ela quer catequizar todo mundo com OOP do jeito dela?
0

#8 User is offline   hufersil 

  • Group: Moderadores
  • Posts: 1265
  • Joined: 15-January 04

Posted 09 March 2005 - 03:15 PM

as linhas onde tem
CODE

trace('n =>'+n.dados);
trace('x =>'+x);
trace('y =>'+lis.y);


estão fora do lis.onData, logo, elas são executadas tão logo o SWF é carregado, não esperando pelos dados serem recebidos.
Então, você pode colocar esses traces dentro do lis.onData.

Tipo assim, o lis é um ouvinte, que fica escutando o objeto objAluno até que ele diga "onData", sacou? Na hora em que o objAluno disser onData, significa que os dados foram carregados.

Os traces não estão esperando por esse alerta, então eles se auto-executam sem perguntar.

Esse esquema de ele dizer onData, são os Eventos. Tipo, no botão não tem os on(release), on(press) da vida, pois é, on significa quando e os press e release são os eventos.

Ou seja, quando release, faz tal coisa.

Só que no seu caso, você tem que fazer na classe e no swf, como eu te mostrei anteriormente. Repetindo mais uma vez, os traces não funcionam, por que eles não esperam o evento ser disparado.

É isso que está acontecendo, entendeu?

Qualquer coisa, posta aeh biggrin.gif
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic



Publicidade




1 User(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)