Flex - Cast

12 respostas
viniciuspadua

Tenho uma classe pessoa.

package vo
{
	[Bindable]
	[RemoteClass(alias="domainvo.PessoaVO")]
	public class Pessoa
	{
		public var id:Number;
		public var nome:String;
		public var data:Date;
	}
}

Populo um dropDownList no load. Queria que ao clicar em um botão pegasse o objeto que esta selecionado, entretanto não consigo fazer o cast, sempre da erro.

<s:DropDownList id="lista" x="106" y="252" width="296" dataProvider="{pessoa}"  labelField="nome"  ></s:DropDownList>

código ao clicar no botão:

<!-- Isso funciona -->
Alert.show( ' * '+ lista.selectedItem.id +' - '+lista.selectedItem.nome );

<!-- Mais queria fazer o cast no tipo para não popular tudo na mão e é lançada a execption abaixo -->
var p:Pessoa = lista.selectedItem as Pessoa;
Alert.show( ' * '+ p.id +' - '+p.nome );

TypeError: Error #1009: Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.
at projeto/button1_clickHandler()[C:\Users\vinicius\Adobe Flash Builder 4\Novo\src\formpp.mxml:104]
at projeto/___formp_Button3_click()[C:\Users\vinicius\Adobe Flash Builder 4\Novo\src\formpp.mxml:24]

como posso fazer esse cast? se é possível!

12 Respostas

davidbuzatto

Pelo o que você mostrou, sua classe no Flex chama Paciente, vc percebeu?
Como vai ser feito em cast para uma classe que não existe?

Mantenha os nomes iguais, tanto no Flex quanto no backend em Java. Vc evita confusões.

viniciuspadua

tinha copiado a errada aqui no forum! hehehe

o erro continua o mesmo!

davidbuzatto

Hummm
Vc tentou chamar sua classe Pessoa de PessoaVO, como a classe em Java?

viniciuspadua

mesmo erro!

davidbuzatto

Como vc obtém dataProvider?

viniciuspadua

pego pelo brazerds e jogo em um

[Bindable]
private var pessoa:ArrayCollection = new ArrayCollection();
davidbuzatto

Pq vc precisa de uma variável para o dataProvider?
Pq no resultEvent da carga das pessoas, vc já não fazer direto assim:

Teste mudar isso e verifique se funciona.

viniciuspadua

mesma coisa!

não tem como fazer algo desse tipo ?

private var pessoa:ArrayCollection = new ArrayCollection <PessoaVO>;
davidbuzatto

viniciuspadua:
mesma coisa!

não tem como fazer algo desse tipo ?

private var pessoa:ArrayCollection = new ArrayCollection <PessoaVO>;

O ActionScript não tem tipos genéricos. O que você pode tentar fazer é usar a metadata tag ArrayElementType

[ArrayElementType("Pessoa")] private var pessoa: ArrayCollection = new ArrayCollection();

Mas o cast deveria estar funcionando… A sua entidade tem o construtor padrão?

F

Vinicius,
Isto acontece pq a classe não é utilizada em código, com isso o compilador não a leva junto, se vc debugar verá q vem um ArrayCollection de Object ou ObjectProxy.
Vc precisa registrar esta classe com registerClassAlias ou dando um new http://fabiophx.blogspot.com/2009/04/criacao-dinamica-de-objetos.html.

[]s
Fabio da Silva

davidbuzatto

fabiophx:
Vinicius,
Isto acontece pq a classe não é utilizada em código, com isso o compilador não a leva junto, se vc debugar verá q vem um ArrayCollection de Object ou ObjectProxy.
Vc precisa registrar esta classe com registerClassAlias ou dando um new http://fabiophx.blogspot.com/2009/04/criacao-dinamica-de-objetos.html.

[]s
Fabio da Silva
http://fabiophx.blogspot.com/

Oloco, mas fazer cast já não indica que está usando a classe?
Que coisa porca… Tem alguma razão para isso ou pq o compilador é burro mesmo?

[]´s

marcosFA

Solução:

//import da classe que você quer fazer cast aqui
//import br.com.....Pessoa

private var dummy:Pessoa;
//ou somente
Pessoa;

O negócio é o seguinte, você precisa “usar” essa classe tipando algo como aqui em cima, e que não seja já no seu cast.
O compilador só importa a classe se fizer assim.

Uma forma padrão que uso é criar uma classe que já faz isso com todas as classes que chegarão do java antes de você ter criado uma instância delas.
Dai você só instancia essa classe.

Abs,

Criado 2 de setembro de 2010
Ultima resposta 2 de set. de 2010
Respostas 12
Participantes 4