Problema de coerção em aplicações Flex 3 modularizadas

Category : Flex

Modularizar uma aplicação pode se tornar algo quase obrigatório depois que uma determinada aplicação ultrapassa um certo tamanho. Afinal, não queremos que nossos clientes fiquem horas e horas na frente da tela, esperando o sistema carregar uma infinidade de recursos que ele sequer utilizará para aquela tarefa.

Comecei a modularizar uma aplicação, e a uma certa altura dos testes, eis que me deparo com o seguinte erro:

TypeError: Error #1034: Falha de coerção de tipo: não é possível converter
mx.managers::DragManagerImpl@1444b809 em mx.managers.IDragManager.at
mx.managers::DragManager$
O erro ocorria sempre que eu carregava o módulo 1, descarregava-o, e então carregava o módulo 2. Sempre que eu clicava em uma DataGrid deste segundo módulo, o famigerado erro era disparado.

Pelo que pude observar depois de muita pesquisa e uns dias quebrando a cabeça, existe uma falha por parte do Flex quando trabalhamos com modularização. Se você faz referencia uma classe dentro de um módulo, por vezes, o Flex “se esquece” de linká-la na tua Main App. Ou seja, quando o módulo da sua aplicação tenta utilizá-lo, ele simplesmente não existirá.

A carta na manga!

Para solucionar este problema, vamos contar com uma característica do Flash Player: Por padrão, as definições de todas as classes que serão utilizadas pelo sistema podem estar presentes na aplicação principal. Ou seja, para evitar a falha, vamos forçar a referencia aos managers que estão gerando o erro.

Vi casos de pessoas que obtem um erro semelhante no uso de PopUpManagers. Para que isso não aconteça mais, escreva o seguinte código na sua aplicação principal:

import mx.managers.PopUpManager;
import mx.managers.DragManager;

private var popupMan:PopUpManager;
private var dragMan:DragManager;

Vc pode alterar o nome das variáveis popupMan e dragMan ao seu gosto. O importante é que elas sejam instanciadas com seus respectivos tipos. Isso deverá resolver seu problema.

Debugando objetos em Flex

1

Category : Flex

Este é um problema que eu tenho desde que conheci o Flex. Comandos como o trace(meuObjeto) não são tão eficazes nestes casos, pois irão retornar apenas um [object Object] no console do IDE.

Lí em alguns blogs uma solução utizando o loop for, mas ou menos da seguinte forma:

for(var i in n) {
trace(i + ‘:’ +n[i]);
}

É, funciona, mas nosso código correrá o risco de ficar um tanto poluído se precisarmos debugar vários objetos, isso sem contar que ainda poderemos dificultar a leitura dele se não utilizarmos um comentário informando que este trecho trata-se de um debug.

Como resolver isto? Esta semana encontrei um artigo que fala de uma classe interna do Flex que facilita muito nossa vida nesses momentos: É a classe ObjectUtil, pertencente ao pacote mx.utils. Para utiliza-lá, apenas importe a classe para o seu código (import mx.utils.ObjectUtil) e em qualquer momento que precisar, faça a chamada para o método da seguinte forma:

trace(ObjectUtil.toString(myObject));

A saída será exibida na janela de console do IDE. Fica aí a dica!

Aplicação em Flex para testar regras Regex

1

Category : Flex

regex-appNão é de hoje que aplicações em Adobe Flex (hoje, conhecido como Flash Builder) me chamam a atenção. Hoje, durante algumas sapeadas pela internet em busca de aplicações criadas sob esta plataforma, encontrei este utilitário que vai ser uma mão na roda para quem precisa trabalhar com regras Regex.

Ele elabora as regras, que podem ser criadas na unha, ou baseadas em templates já existentes no sistema. Ele também armazena alguns templates criados pela comunidade do software.Vale a pena conferir!

Link: http://gskinner.com/RegExr/

Atribuindo valores a uma variável baseando-se no estado de uma checkbox no Flex

1

Category : Flex

Olá!

Esta noite tive um problema para obter determinados valores dependendo do estado de uma checkbox. Basicamente, se a checkbox estiver selecionada, então o valor “S” deveria ser atribuído a uma variável. Caso contrário, o valor atribuído seria “N”.

Eu queria uma forma rápida e precisa de fazer isso, sem consumir muitas linhas de códigos. Até pensei em utilizar o operador condicional IF, mas eu queria algo mais resumido. Me lembrei do operador if ternário do PHP, e fui em busca de uma solução semelhante em Flex. Pois é: Existe!

Seria algo mais ou menos assim:

[codesyntax lang="actionscript3"]

exibir = (chkExibir.selected ? "S" : "N");

[/codesyntax]

Ou seja, se a propriedade selected da chkExibir for “true”, então retorna “S”, caso contrário retorna “N”.

Facil e rápido do jeito que eu queria, e o melhor, com apenas 1 linha de código!

Switch to our mobile site