sábado, 18 de abril de 2009

Criação dinâmica de objetos

Uma coisa que acho muito legal é a criação dinâmica de objetos.

Bem como isso funciona:
1. Fazer o import das classes que serão utilizadas.
import flash.net.registerClassAlias;
import mx.core.UIComponent;
import mx.containers.TitleWindow;
import mx.controls.TextInput;
import views.CadCliente;

2. Registrar as classes que você irá usar. O compilador "precisa" saber quais classes precisam ser compiladas. Para isso é necessário criar uma instância do objeto com new ou com registerClassAlias:

registerClassAlias
("views.CadCliente", CadCliente); // herda de TitleWindow
registerClassAlias("mx.controls.TextInput", TextInput);

Registrando as classes no aquivo que tem a tag Applicattion irá fazer com que possa ser criado objetos de forma dinâmica em qualquer parte do sistema.

3. Criação dinâmica.
import flash.net.getClassByAlias;
import
flash.utils.getDefinitionByName;

private function criacaoDinamica():void {
// var clazz:Class = getDefinitionByName("views.CadCliente") as Class; ou
var clazz:Class = getClassByAlias("views.CadCliente");

var window:TitleWindow =
TitleWindow(PopUpManager.createPopUp(this, clazz, true));

var clazzTI
:Class = getClassByAlias("mx.controls.TextInput");
var instance:UIComponent = new clazzTI() as UIComponent;

window.addChild(instance);
}

Em acréscimo dois métodos interessantes:
flash.utils.getQualifiedClassName e flash.utils.getQualifiedSuperclassName.
Os dois recebem um object como parâmetro e retornam uma string com o nome completo (pacote + classe) da classe (
getQualifiedClassName) e da sua classe pai (getQualifiedSuperclassName).

12 comentários:

  1. Puxa vida: extremamente útil! Obrigado!

    PS: essa pérola postada em Abril e nenhum comentário ainda? Cade o reconhecimento da comunidade? Affe..

    ResponderExcluir
  2. Felipe

    Muito bom cara !
    Valeu!

    ResponderExcluir
  3. Cara, inutil...Mas a intençao eh o que vale.

    ResponderExcluir
  4. Obrigado pelo post!
    Resolvi um problema com Java BlazeDS (AMF Remoting).

    ResponderExcluir
  5. Cara essa sua solução é muito útil,
    pois aqui na minha aplicação agora não preciso criar uma função ou if para cada objeto que eu quero criar, apenas preciso saber o seu nome.
    Show de bola
    Parabéns

    ResponderExcluir
  6. Show de bola!!!!!
    É desse tipo de conteúdo que precisamos.
    Parabéns!

    ResponderExcluir
  7. Muito legal, parabéns!!!
    Só uma dúvida, é possível instancias dinamicamente um objeto através de um nome fornecido em tempo de execução? ou seja, sem a possibilidade de realizar o import?

    ResponderExcluir
  8. @Pedro Zatta
    Obrigado.
    O nome da classe vc pode obter de qq lugar, até mesmo digitando numa TextInput em tempo de execução.
    Mas sempre será necessário o import e o registro (com new ou registerClassAlias) pq o compilador precisa saber o q "levar" junto.
    []s

    ResponderExcluir
  9. Parabéns, muito util.

    Estou utilizando no projeto de estudo que estou desenvolvendo

    Arnaldo

    ResponderExcluir
  10. Kralho.. valeu!! mesmo sendo um post antigasso me ajudou bastante!! o blaze nao tava registrando minhas classes!!

    ResponderExcluir
  11. Cara, mto obrigado pelo post! resolvi meu problema graças a ele!!

    Valeu Fabio!

    ResponderExcluir