Flex - Cast

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!

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.

tinha copiado a errada aqui no forum! hehehe

o erro continua o mesmo!

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

mesmo erro!

Como vc obtém dataProvider?

pego pelo brazerds e jogo em um

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

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.

mesma coisa!

não tem como fazer algo desse tipo ?

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

[quote=viniciuspadua]mesma coisa!

não tem como fazer algo desse tipo ?

private var pessoa:ArrayCollection = new ArrayCollection <PessoaVO>; [/quote]

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?

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

[quote=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/[/quote]

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

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,