
Ok, o trocadilho do título do post foi muito ruim, mas eu tenho esperança de conseguir ser engraçado uma hora destas ![]()
Mas o Flex For Kids é um evento que tem dois objetivos principais:
Quem organiza o evento é a e-Genial, que também organiza o Rails for Kids.
No Flex For Kids as doações recebidas vão direto para a Cotolengo, o que é bem legal, na prática você estara assistindo a excelentes palestras de grátis, a única coisa que é cobrada é que você faça um pouquinho de caridade ![]()
Bom, veja o que você vai poder aproveitar neste evento, e tudo isto sem sair de casa (ou do trabalho) já que o evento utiliza a excelente plataforma Treina Tom (Também da e-Genial)
Palestra: Desenvolvimento Multi-touch com AIR 2.0
Nesta palestra o participante irá conhecer a API Multi-touch introduzida na versão 2.0 do Adobe Integrated Runtime, que traz grande facilidade para o desenvolvimento de aplicações explorando este recurso.
Público Alvo: Desenvolvedores, gerentes de projeto e entusiastas no desenvolvimento de soluções utilizando o AIR 2.0
Palestra: Construa painéis administrativos em Flex integrados com ASP.NET MVC.
Você verá na prática como integrar o Flex com a nova abordagem MVC do ASP.NET, indo além do CRUD.
Público Alvo: Desenvolvedores Flex que utilizem ou querem utilizar o ASP.NET MVC como Back-End.
Palestra: Swiz Framework: MVC Simples e Poderoso para projetos Flex/AIR
Essa palestra visa mostrar a brutal diferença entre seus “concorrentes” e entender melhor a “conceptual constraint” que levou os autores do Swiz Framework a desenvolverem uma solução simples e flexível para projetos Flex/AIR, em relação aos demais frameworks conhecidos. (Cainrgorm, PureMVC, Mate, etc). Pré requisito: Conhecer “Dependency Injection” (DI) e “Inverse of Control” (IoC).
Público Alvo: Desenvolvedores Flex.
Palestra: Flex e VOIP: Adicione essa tecnologia em suas aplicações
Essa palestra tem por objetivo demonstrar a desenvolvedores Flex como implementar em suas aplicações funcionalidades de um discador VOIP, usando soluções open source.
Público Alvo: Desenvolvedores Flex.
Palestra: Desktop com HTML, Javascript e Adobe AIR
Conheça um novo mundo de possibilidades e tecnologias com Javascript e HTML para desktop e descubra como Adobe Air se integra a este ambiente, utilizando como case o PomoDo.
Público Alvo: Desenvolvedores de qualquer linguagem.
Palestra: Estudo de caso: User Experience em um RIA
Será debatido um estudo de caso onde implementamos um mecanismo de busca semântica através do design (!) A interface apenas pode ser viabilizada pela alta capacidade de componentização do Flex e porque entendemos o que o usuário precisava fazer com a interface.
Público Alvo: Desenvolvedores Flex e designers de todos os credos e cores.
Palestra: Desmistificando o Cairngorm
O Cairngorm é considerado por muitos como um framework com uma curva de aprendizado elevada. A finalidade desta palestra é desvendar o Cairngorm utilizando uma abordagem diferenciada, com o objetivo de facilitar o aprendizado do mesmo.
Público Alvo: Desenvolvedores Flex.
Palestra: Introdução ao Mate: a importância de um framework MVC para Flex
Muitos ainda não se convenceram da necessidade da utilização de um dos frameworks MVC (Model – View – Controller) presentes no mercado e esta palestra tem como objetivo mostrar a sua importância e indicar o framework escolhido pela RIA Labs.
Público Alvo: Desenvolvedores Flex.
Palestra: Coloque uma interface Flex em seus projetos JEE
Entenda como funciona a integração Adobe Flex com todos os serializadores disponíveis no mercado (BlazeDs, LivecycleDs,WebOrb for java,Pimento,Red5) para integração com seu back-end Java e crie novas ferramentas com recursos ímpar para seu negócio.
Público Alvo: Desenvolvedores Java.
Palestra: O Quarteto Fantástico: Flash 10.1, Flex 4, Flash Catalyst e Flash Builder
Como as principais novidades da Plataforma Flash poderão impactar o desenvolvimento de Rich Internet Applications.
Público Alvo: Pessoas interessadas no desenvolvimento de Rich Internet Applications.
Para se inscrever, ou só para ver mais alguns detalhes antes de se inscrever, é só acessar o site do evento.
Já sou desenvolvedor a algum tempo (comecei em 1997, façam as contas se quiserem
), e uma das coisas mais importantes que aprendi até hoje é com certeza que todas as mensagens de erro geradas por linguagens de programação, frameworks, e assemelhados, são realmente feias.
Os Stack Traces do Java são realmente muito feios, chegam a assustar quem esta começando, os do Ruby não são muito melhores.
Em C++ não tem stack traces, mas os memory dumps fazem um papel parecido, e memory dumps podem ser conseguidos a partir de qualquer linguagem compilada.
O C# tem stack traces também, bem próximos do Java, acredito que isto seja parte do .NET e não uma particularidade do C#, mas eu conheço muito pouco de .Net, então agradeço se alguem puder confirmar isto.
Outra coisa bastante importante, e uma verdade absoluta, regra inquebrável, e como tal, tem pouquíssimas exceções, é que o código que você vai escrever não vai funcionar de primeira, você não é perfeito, e você vai cometer erros.
Pode acontecer de uma ou duas vezes durante a sua vida, você conseguir testar alguma coisa e esta coisa funcionar de primeira, mas eu não faria com que a minha felicidade dependesse disto, por que esta é uma situação bastante incomum.
Beleza, e o que uma coisa tem a ver com a outra?
Se você vai cometer erros, você vai precisar descobrir o que você fez de errado, e muitas das vezes, isto não vai ser fácil, e o seu melhor amigo para esta situação, a melhor ajuda que você vai conseguir, não vai ser do seu colega do lado, por mais Nerd que ele seja, vai ser a mensagem de erro/stack trace/memory dump que vai salvar a sua pele nesta situação.
Se o seu colega Nerd for te ajudar, provavelmente, ele vai perguntar: “Qual foi o erro?”
E se preste atenção nesta listinha de respostas:
Estas são resposta inválidas, e provavelmente vão fazer o seu colega, que poderia te ajudar, ficar bastante chateado, e te ajudar com má vontade.
Para resolver este problema, você precisa aprender a ler estas mensagens de erro, isto vai te poupar muito tempo, e tudo o que poupa tempo, acaba te tornando mais produtivo, se tu for mais produtivo, o teu chefe vai gostar mais de ti, e tu vai ganhar mais, se tu for mais produtivo, tu vai terminar o que tem que fazer mais rápido, e por conseqüência, vai pra casa mais cedo
A leitura de mensagens de erro, seja qual for a encarnação, requer quatro coisas:
Algumas vezes, apenas ler a mensagem ja resolve o problema, como neste exemplo que peguei por ai na web:
INFO 13:37:20 [org.hibernate.connection.ConnectionProviderFactory] - Initializing connection provider: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider WARN 13:37:41 [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 17002, SQLState: null ERROR 13:37:41 [org.hibernate.util.JDBCExceptionReporter] - Io exception: The Network Adapter could not establish the connection WARN 13:37:41 [org.hibernate.cfg.SettingsFactory] - Could not obtain connection metadata java.sql.SQLException: Io exception: The Network Adapter could not establish the connection at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:162) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:274) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:328) at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:361) at oracle.jdbc.driver.T4CConnection. (T4CConnection.java:151) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:595) at java.sql.DriverManager.getConnection(DriverManager.java:525) at java.sql.DriverManager.getConnection(DriverManager.java:140) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:291) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:277) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:259) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:241) at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:80) at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:72) at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:1859) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1152) at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:800) at org.springframework.orm.hibernate3.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:726) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1059) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:363) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:226) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:147) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:269) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:320) at org.springframework.context.support.ClassPathXmlApplicationContext. (ClassPathXmlApplicationContext.java:87) at org.springframework.context.support.ClassPathXmlApplicationContext. (ClassPathXmlApplicationContext.java:72) at org.springframework.test.AbstractSpringContextTests.loadContextLocations(AbstractSpringContextTests.java:121) at org.springframework.test.AbstractDependencyInjectionSpringContextTests.loadContextLocations(AbstractDependencyInjectionSpringContextTests.java:210) at org.springframework.test.AbstractSpringContextTests.getContext(AbstractSpringContextTests.java:101) at org.springframework.test.AbstractDependencyInjectionSpringContextTests.setUp(AbstractDependencyInjectionSpringContextTests.java:178) at junit.framework.TestCase.runBare(TestCase.java:125) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Como pode ser visto na linha 5, os stack traces no Java, começam sempre pelo nome completo da classe da última exceção gerada, seguida imediatamente pela mensagem de erro, separadas por “:”.
No caso deste exemplo, precisamos apenas acreditar que não foi possível conectar no banco de dados, ocorreu algum problema de rede.
Isto nos leva a um ponto que você vai descobrir sozinho quando trabalhar com oracle por um tempo, eles não ajudam muito a descobrir qual o problema ![]()
Acredito que este erro tenha ocorrido por problemas de configuração da conexão com o banco de dados ou então problemas com o banco de dados real …
Mas este stack esta aqui só pra eu poder reclamar um pouquinho da Oracle ![]()
Não serve como um exemplo do que eu quero mostrar para vocês (que tiveram paciência de ler até aqui);
Vejam este outro stack que eu gerei de propósito como exemplo:
Exception in thread "main" java.lang.NullPointerException at java.io.File.(File.java:222) at utils.urubatan.StackTraceReadingExample.readConfigurationFromFileName(StackTraceReadingExample.java:29) at utils.urubatan.StackTraceReadingExample.readConfiguration(StackTraceReadingExample.java:25) at utils.urubatan.StackTraceReadingExample.verifyConfiguration(StackTraceReadingExample.java:21) at utils.urubatan.StackTraceReadingExample.connectAndExecuteQuery(StackTraceReadingExample.java:17) at utils.urubatan.StackTraceReadingExample.main(StackTraceReadingExample.java:11)
Na linha 1, já temos um erro bastante comum, e se você ler isto, olhar para o seu colega do lado, e reclamar que o seu codigo gera um NullPointerException sem dizer o que esta acontecendo, por favor, desista de programar agora, antes que você fique realmente frustrado, ou se for muito insistente, coloque o seu amigo na cadeira de um psicólogo achando que trabalha com retardados ![]()
Este stack é até bem fácil, e serve para demonstrar o que eu quero …
Para ler um Stack trace, comece a ler de traz para frente, ou seja, leia normalmente de cima para baixo, e pare de ler na primeira linha em que o nome da classe pertencer ao seu projeto.
Neste caso, isto ocorre na linha 3 do stack trace: utils.urubatan.StackTraceReadingExample.readConfigurationFromFileName(StackTraceReadingExample.java:29)
Onde podemos ver que o erro esta sendo gerado no método “readConfigurationFromFileName”, da classe “StackTraceReadingExample”, na linha 29 do arquivo “StackTraceReadingExample.java”, ou seja, para corrigir o problema vamos para esta linha ver o que acontece lá, segue o código do exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | package utils.urubatan; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Properties; public class StackTraceReadingExample { public static void main(String[] args) throws IOException { StackTraceReadingExample ex = new StackTraceReadingExample(); ex.connectAndExecuteQuery(); } private String fileName; private Properties configuration; private void connectAndExecuteQuery() throws IOException { verifyConfiguration(); } private void verifyConfiguration() throws IOException { readConfiguration(); } private void readConfiguration() throws IOException { readConfigurationFromFileName(fileName); } private void readConfigurationFromFileName(String theFileName) throws IOException { FileReader fr = new FileReader(new File(theFileName)); createEmptyConfigurationIfNeeded(); configuration.load(fr); fr.close(); } private void createEmptyConfigurationIfNeeded() { if (configuration == null) { configuration = new Properties(); } } } |
Na linha informada, a única variável que esta sendo utilizada é o nome do arquivo, que se formos ler o código, realmente nunca foi inicializado, para resolver este problema, basta que alteremos a linha 13 para inicializar a variável para algum nome de arquivo, vou adicionar: = “teste.config” e vamos ver o que acontece.
Depois desta alteração continuamos com um erro, e este stack continua bastante simples, mas é um pouco mais complicado que o anterior:
Exception in thread "main" java.io.FileNotFoundException: teste.config (The system cannot find the file specified) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.(FileInputStream.java:106) at java.io.FileReader. (FileReader.java:55) at utils.urubatan.StackTraceReadingExample.readConfigurationFromFileName(StackTraceReadingExample.java:29) at utils.urubatan.StackTraceReadingExample.readConfiguration(StackTraceReadingExample.java:25) at utils.urubatan.StackTraceReadingExample.verifyConfiguration(StackTraceReadingExample.java:21) at utils.urubatan.StackTraceReadingExample.connectAndExecuteQuery(StackTraceReadingExample.java:17) at utils.urubatan.StackTraceReadingExample.main(StackTraceReadingExample.java:11)
Agora o erro esta na 5a linha do stack, que é a primeira linha com código fonte da aplicação …
Esta é a técnica básica para ler stack traces:
Com estes passos, os stack traces vão te ajudar bastante, algumas IDEs como o Eclipse por exemplo, imprimem os stack clicaveis no console, ou seja, você clica em uma linha do stack trace, e o eclipse abre o arquivo, na linha em que o erro ocorreu.
Estes passos servem também para builds ANT, para programas escritos em action script (Flash ou Flex), para programas escritos em Ruby, incluindo o Rails.
E com pequenas adaptações, funciona também para C++, C, qualquer outra linguagem que gere algo parecido com um stack trace.
Agora uma perguntinha, só pra não perder o costume, você que leu até aqui, acha que valeu a pena a leitura? tem algum colega que você gostaria de poder obrigar a ler isto? ou tem algum exemplo que não se enquadra no que eu escrevi?
Eu tenho alguns amigos que eu gostaria de obrigar a ler isto, ou então abrir a cabeça e jogar isto para dentro, mas infelizmente eu não posso fazer isto.
Se você acha que o texto ficou bom, indique a leitura, se acha que precisa melhorar alguma coisa, deixe nos comentários que eu incorporo a melhoria no texto do post
PS.: este versionamento de posts do WP até que é legal, apaguei tudo sem querer, e acho que consegui recuperar legal com ele
Tags: lprodjava
Uma das melhores idéias do Flex, e o que o torna bastante produtivo na minha opinião é a existencia de uma “linguagem” para layout de telas, é o tal de MXML.
Claro que eu sei que é apenas XML, mas é XML com acesso direto as classes existentes e recem criadas, e uma mão na roda para separar o código do layout, facilitando bastante a escrita de código MVC compliant.
O maior problema da arquitetura básica do Flex é não ser “óbvio” como escrever o código de tratamento dos eventos gerados sem poluir o MXML com muitas tags “mx:Script” e muito código ActionScript.
Claro que existem alguns frameworks para o desenvolvimento de aplicações Flex como o Cairngorm e o PureMVC, mas algumas vezes estes frameworks mais complicam do que ajudam, e mesmo utilizando um deles, esta dica que vou apresentar agora de como simular o “code behind” do “.NET” em flex pode ser utilizada sem maiores problemas …
A idéia principal é separa o código ActionScript do código XML, como se fosse uma “partial class” do “.NET”, o Flex não suporta Partial Classes, mas suporta herança, e podemos tirar proveito disto …
Vou mostrar um exemplo bastante simplista aqui, apenas para que vocês peguem a idéia, vejam o código da tela abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <?xml version="1.0" encoding="utf-8"?> <mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%"> <mx:Script> <![CDATA[ import mx.controls.DataGrid; import mx.events.ListEvent; [Bindable] private var current : Object = new Object(); [Bindable] private var all : Array = []; private function saveCurrent(nome : String, idade : Number) : void { var obj : Object = {nome : nome, idade : idade, id : all.length + 1}; var temp : Array = all.slice(0,all.length); temp.push(obj); all = temp; current = obj; } private function updateCurrent(nome : String, idade : Number) : void { current.nome = nome; current.idade = idade; } private function newCurrent() : void { current = new Object(); } private function selectionChange(evt : ListEvent) : void { current = (evt.target as DataGrid).selectedItem; } ]]> </mx:Script> <mx:Label fontSize="24" width="100%" textAlign="center" text="Cadastro de Pessoas"/> <mx:HBox width="100%"> <mx:Label text="Nome:" width="100"/> <mx:TextInput id="currentNome" text="{current.nome}"/> </mx:HBox> <mx:HBox width="100%"> <mx:Label text="Idade:" width="100"/> <mx:NumericStepper id="currentIdade" value="{current.idade}" minimum="5" maximum="150"/> </mx:HBox> <mx:HBox width="100%" horizontalAlign="center"> <mx:Button label="Salvar" click="saveCurrent(currentNome.text,currentIdade.value)" enabled="{!current.id}"/> <mx:Button label="Novo" click="newCurrent()" enabled="{current.id}"/> <mx:Button label="Atualizar" click="updateCurrent(currentNome.text,currentIdade.value)" enabled="{current.id}"/> </mx:HBox> <mx:DataGrid width="100%" dataProvider="{all}" change="selectionChange(event)"> <mx:columns> <mx:DataGridColumn headerText="Id" dataField="id"/> <mx:DataGridColumn headerText="Nome" dataField="nome"/> <mx:DataGridColumn headerText="Idade" dataField="idade"/> </mx:columns> </mx:DataGrid> </mx:VBox> |
Apenas para este bastatne simples, já temos quase metade do arquivo contendo ActionScript e metade contendo MXML.
Em um caso simples destes isto não chega a incomodar, mas quando o arquivo começa a crescer, isto atrapalha a leitura do código fonte, o que é bastante ruim. Então a minha sugestão, ou “dica” de como resolver isto, é separar o código ActionScript em um arquivo .as e manter apenas o layout no arquivo MXML, como pode ser visto no seguinte exemplo (considerando que o nome do arquivo mostrado acima seja telaexemplo.mxml)
Criar a classe “exemplo.TelaExemploBase” no diretório correspondente com o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package exemplo { import mx.containers.VBox; import mx.controls.DataGrid; import mx.events.ListEvent; public class TelaExemploBase extends VBox { [Bindable] protected var current : Object = new Object(); [Bindable] protected var all : Array = []; public function TelaExemploBase() { super(); } protected function saveCurrent(nome : String, idade : Number) : void { var obj : Object = {nome : nome, idade : idade, id : all.length + 1}; var temp : Array = all.slice(0,all.length); temp.push(obj); all = temp; current = obj; } protected function updateCurrent(nome : String, idade : Number) : void { current.nome = nome; current.idade = idade; } protected function newCurrent() : void { current = new Object(); } protected function selectionChange(evt : ListEvent) : void { current = (evt.target as DataGrid).selectedItem; } } } |
Alterar o arquivo MXML para o seguinte código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?xml version="1.0" encoding="utf-8"?> <TelaExemploBase xmlns="exemplo.*" xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" > <mx:Label fontSize="24" width="100%" textAlign="center" text="Cadastro de Pessoas"/> <mx:HBox width="100%"> <mx:Label text="Nome:" width="100"/> <mx:TextInput id="currentNome" text="{current.nome}"/> </mx:HBox> <mx:HBox width="100%"> <mx:Label text="Idade:" width="100"/> <mx:NumericStepper id="currentIdade" value="{current.idade}" minimum="5" maximum="150"/> </mx:HBox> <mx:HBox width="100%" horizontalAlign="center"> <mx:Button label="Salvar" click="saveCurrent(currentNome.text,currentIdade.value)" enabled="{!current.id}"/> <mx:Button label="Novo" click="newCurrent()" enabled="{current.id}"/> <mx:Button label="Atualizar" click="updateCurrent(currentNome.text,currentIdade.value)" enabled="{current.id}"/> </mx:HBox> <mx:DataGrid width="100%" dataProvider="{all}" change="selectionChange(event)"> <mx:columns> <mx:DataGridColumn headerText="Id" dataField="id"/> <mx:DataGridColumn headerText="Nome" dataField="nome"/> <mx:DataGridColumn headerText="Idade" dataField="idade"/> </mx:columns> </mx:DataGrid> </TelaExemploBase> |
A idéia básica é utilizar o MXML para extender a classe ActionScript que contem o código, a diferença é que tudo o que deve ser acessado do MXML na classe criada não pode ser privado, tem que ser no mínimo protected (o que foi utilizado no exemplo).
Outro truque é definir o “xmlns” para o pacote da classe que vai ser extendida como pode ser visto na linha 2.
E para testar isto é necessária uma “aplicação flex”, eu utilizei apenas o código abaixo para o projeto de testes:
1 2 3 4 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*"> <local:telaexemplo width="100%" height="100%"/> </mx:Application> |
Mas claro que você pode fazer algo mais elaborado
Espero que esta dica ajude alguem, ja que eu tive bastante trabalho reorganizando código depois que descobri que isto era muito melhor do que colocar tudo no MXML logo que comecei a trabalhar com Flex.
Uma forma possível de se iterar pelo conteúdo de um array em Flex é:
1 2 3 4 5 | private function iterarSobreArray(arr : Array) : void { for(var i : int = 0; i < arr.length; i++){ fazerAlgumaCoisaCom(arr[i]); } } |
Mas esta forma vai causar problemas caso o array seja nulo, para evitar isto basta utilizar a forma abaixo.
1 2 3 4 5 | private function iterarSobreArray(arr : Array) : void { for each(var o : Object in arr){ fazerAlgumaCoisaCom(o); } } |
Desta forma temos menos variáveis declaradas, e não corremos risco de tentar ler o tamanho de um “null” na linha 2 do primeiro exemplo …