<?xml version="1.0"?><rss version="2.0"><channel><title>RiaPT AUG &gt; Blog</title><link>http://groups.adobe.com/resources/af6b87c1fa</link><description>a great conversation starts with a great topic</description><language>en-us</language><copyright>Copyright 2006, HiveLive Inc.</copyright><pubDate>Mon, 12 Oct 2009 11:19:07 +0000</pubDate><lastBuildDate>Mon, 12 Oct 2009 11:19:07 +0000</lastBuildDate><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Flex Tooltips</title><link>http://groups.adobe.com/posts/a3adfce005</link><description>&lt;p&gt;&lt;em&gt;Entry by &lt;a href=&quot;http://groups.adobe.com/people/c2e63c09fe&quot;&gt;Mauro Alexandre Martins&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Entry&lt;/h3&gt;&lt;div class=&quot;ugc-html&quot;&gt;&lt;p&gt;Depois de ter visto o site do &lt;a title=&quot;Adobe Air on Tour&quot; href=&quot;http://onair.adobe.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Adobe Air on Tour&lt;/a&gt; gostei muito da forma como eram mostradas as ToolTips.&lt;/p&gt;
&lt;p&gt;Sendo assim, tentei verificar como se conseguia a &quot;setinha&quot; que aparece junto da ToolTips...&lt;/p&gt;
&lt;/div&gt;&lt;h3&gt;Image&lt;/h3&gt;&lt;div class=&quot;ft-image&quot;&gt;&lt;img src=&quot;http://groups.adobe.com/files/9bc64b1920/errorTipBorderStyles.png&quot; alt=&quot;&quot; width=&quot;365&quot; height=&quot;93&quot;  class =&quot;dynImage maxSize_365x93&quot; /&gt;&lt;/div&gt;&lt;h3&gt;More&lt;/h3&gt;&lt;div class=&quot;ugc-html&quot;&gt;&lt;p&gt;Depois de ter visto o site do &lt;a title=&quot;Adobe Air on Tour&quot; href=&quot;http://onair.adobe.com/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Adobe Air on Tour&lt;/a&gt; gostei muito da forma como eram mostradas as ToolTips.&lt;/p&gt;
&lt;p&gt;Sendo assim, tentei verificar como se conseguia a &quot;setinha&quot; que aparece junto da ToolTips...&lt;/p&gt;
&lt;p&gt;Descobri então que há um parâmetro que passamos no método para criar um objecto deste tipo que faz com que possamos escolher se a &quot;seta&quot; aparece, e se sim, onde.&lt;/p&gt;
&lt;p&gt;Claro que até pode não ser a melhor maneira de fazer este processo, uma vez que perdemos a noção de erro nas tooltips, e podemos criar o mesmo efeito através de &lt;em&gt;styling&lt;/em&gt; através de CSS (confesso que não sei se é possível adicionar a seta...) mas esta deve ser, certamente, a forma mais rápida e mais fácil.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;createToolTip(textoToolTip_str, coordX_num, coordY_num, &lt;strong&gt;estiloErro_str&lt;/strong&gt;, contexto);&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Segue o código explicado com um exemplo em que não utilizamos a errorTip e outros três em que modificados a propriedade do estilo do erro para que apareça em zonas diferentes:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Código:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;br /&gt;
&amp;lt;mx:Application xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; layout=&quot;vertical&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:Script&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; import mx.managers.ToolTipManager;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; import mx.controls.ToolTip;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Variáveis utilizadas no código&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var myTip : ToolTip;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var et_txt : String;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var tipX : Number;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var tipY : Number;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var tt_txt : String;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * createBigTip&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param e - Objecto com a referência ao que foi clicado&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private function createBigTip( e : Object ) : void&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Referência ao nome do botão&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tt_txt = String( e.target.name );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch ( tt_txt )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Atribuição dos parâmetros&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * et_txt - String que nos diz se a &quot;seta&quot; aparece e onde;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * tt_txt - Texto que é passado para a caixa de texto;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * tipX - Coordenada da tooltip no eixo X;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * tipT - Coordenada da tooltip no eixo Y;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &quot;button1&quot; :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; et_txt = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tt_txt = &quot;et_txt = null&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tipX = e.currentTarget.x + e.currentTarget.width + 10;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tipY = e.currentTarget.y;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &quot;button2&quot; :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; et_txt = &quot;errorTipRight&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tt_txt = &quot;et_txt = errorTipRight&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tipX = e.currentTarget.x + e.currentTarget.width + 10;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tipY = e.currentTarget.y;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &quot;button3&quot; :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; et_txt = &quot;errorTipAbove&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tt_txt = &quot;et_txt = errorTipAbove&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tipX = e.currentTarget.x;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tipY = e.currentTarget.y - e.currentTarget.height - 25;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case &quot;button4&quot; :&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; et_txt = &quot;errorTipBelow&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tt_txt = &quot;et_txt = errorTipBelow&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tipX = e.currentTarget.x;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tipY = e.currentTarget.y + e.currentTarget.height + 10;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Criação da ToolTip com os valores referidos acima&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myTip = ToolTipManager.createToolTip( tt_txt, tipX, tipY, et_txt )as ToolTip;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * destroyBigTip&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * @param e - Objecto com referência ao que foi clicado&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private function destroyBigTip( e : Object ) : void&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ToolTipManager.destroyToolTip( myTip );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Botões --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:Button id=&quot;button1&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; label=&quot;Show right&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rollOver=&quot;createBigTip(event)&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rollOut=&quot;destroyBigTip(event)&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:Button id=&quot;button2&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; label=&quot;Show right&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rollOver=&quot;createBigTip(event)&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rollOut=&quot;destroyBigTip(event)&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:Button id=&quot;button3&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; label=&quot;Show above&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rollOver=&quot;createBigTip(event)&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rollOut=&quot;destroyBigTip(event)&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:Button id=&quot;button4&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; label=&quot;Show bellow&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rollOver=&quot;createBigTip(event)&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rollOut=&quot;destroyBigTip(event)&quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/mx:Application&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Se quiserem ver o exemplo &quot;live&quot;: &lt;a title=&quot;tooltips&quot; href=&quot;http://www.imauro.com/tutoriais/toolTips/Tooltips.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Exemplo&lt;/a&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Se quiserem descarregar o projecto: &lt;a title=&quot;ToolTips&quot; href=&quot;http://www.imauro.com/tutoriais/toolTips/Tooltips.zip&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;ToolTips.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Se quiserem saber mais sobre ToolTips..&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;Flex Help Resource Center&quot; href=&quot;http://livedocs.adobe.com/flex/3/html/help.html?content=tooltips_1.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Flex Help Resource Center&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;Adobe Developer Connection&quot; href=&quot;http://www.adobe.com/devnet/flex/quickstart/using_tooltips/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Adobe Developer Connection&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Abraço e até daqui a uns dias!&lt;/p&gt;
&lt;/div&gt;&lt;h3&gt;Keywords&lt;/h3&gt;&lt;div class=&quot;ft-text&quot;&gt;flash, flex, tooltips&lt;/div&gt;&lt;h3&gt;File&lt;/h3&gt;&lt;div class=&quot;ft-file&quot;&gt;&lt;img class=&quot;img-link-icon&quot; src=&quot;http://groups.adobe.com/common/icons/files/file.gif&quot; alt=&quot;&quot;/&gt;&lt;a href=&quot;http://groups.adobe.com/files/beef396ee2/Tooltips.zip&quot; target=&quot;_file&quot;&gt;Tooltips.zip&lt;/a&gt; &lt;span class=&quot;count&quot;&gt;(14KB)&lt;/span&gt;&lt;/div&gt;</description><guid isPermaLink="true">http://groups.adobe.com/posts/a3adfce005</guid><pubDate>Mon, 12 Oct 2009 11:12:27 +0000</pubDate></item><item><title>Tutorial parte I - Flex Air &amp; SQLite</title><link>http://groups.adobe.com/posts/8fd81ed7c5</link><description>&lt;p&gt;&lt;em&gt;Entry by &lt;a href=&quot;http://groups.adobe.com/people/c2e63c09fe&quot;&gt;Mauro Alexandre Martins&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Entry&lt;/h3&gt;&lt;div class=&quot;ugc-html&quot;&gt;&lt;p&gt;Esta é a primeira parte de uma série de três tutoriais que vou colocar sobre a integração de Flex com AIR e SQLite. A primeira (esta) vai centrar-se em uma breve introdução ao AIR com SQLite e vamos criar uma aplicação onde vamos adicionar uma base de dados local, inserir vários tipos de dados e depois coloca-los directamente em uma datagrid em Flex.&lt;/p&gt;
&lt;p&gt;A parte dois que será colocada mais tarde (estou a trabalhar nela) será centrada em criar uma form para adicionar dinamicamente informação à base de dados e em colocar várias tabelas a interagirem entre si em que a primeira tem dados e a segunda possui várias informações relativas aos items anteriores.&lt;/p&gt;
&lt;p&gt;A terceira será depois a integração das chamadas da base de dados com itemClasses e também ValueObjects.&lt;/p&gt;
&lt;p&gt;Espero que gostem! Mauro.&lt;/p&gt;
&lt;/div&gt;&lt;h3&gt;Image&lt;/h3&gt;&lt;div class=&quot;ft-image&quot;&gt;&lt;img src=&quot;http://groups.adobe.com/files/9c9ceed20f/adobe-air.jpg&quot; alt=&quot;&quot; width=&quot;450&quot; height=&quot;397&quot;  class =&quot;dynImage maxSize_450x397&quot; /&gt;&lt;/div&gt;&lt;h3&gt;More&lt;/h3&gt;&lt;div class=&quot;ugc-html&quot;&gt;&lt;p&gt;Sem dúvida que se há uma coisa que o Adobe AIR tem de interessante é a &lt;span style=&quot;background-color:#ffffff;&quot;&gt;capacidade&lt;/span&gt; de &lt;span style=&quot;background-color:#ffffff;&quot;&gt;ser possível&lt;/span&gt; criar base de dados locais sem a necessidade de nenhum servidor local como o wamp ou semelhante e com extrema facilidade.&lt;br /&gt;
&lt;br /&gt;
Ter a possibilidade de inserir, actualizar e retirar informação de uma estrutura de base de dados é sem dúvida mais fácil de gerir do que, por exemplo, a utilização de ficheiros de texto ou então ficheiros com estruturas em XML como por vezes acontece.&lt;br /&gt;
&lt;br /&gt;
Este tipo de interactividade entre o Flex ou Flash com estas estruturas permitem-nos fazer relações entre várias tabelas&lt;span style=&quot;background-color:#ffffff;&quot;&gt;,&lt;/span&gt; podendo assim associar facilmente dados que poderão estar organizados nas famosas sequências “one-to-many” (uma entrada na tabela TAB_1 tem várias entradas associadas na tabela TAB_2)&lt;span style=&quot;background-color:#ffffff;&quot;&gt;. Isto&lt;/span&gt; torna a injecção de dados em componentes de Flex ou Flash numa acção simples e quase directa.&lt;br /&gt;
&lt;br /&gt;
Para começar a utilizar este tipo de estrutura e para podermos ter qualquer interacção com uma base de dados em SQLite através do AIR, são precisos ,no mínimo, três elementos: um ficheiro (base de dados), uma conexão e uma declaração (query).&lt;br /&gt;
&lt;br /&gt;
Este tutorial vai ser constituído por três partes sendo a primeira mais simples, com criação, adição e preenchimento de uma dataGrid em Flex. A segunda parte do tutorial terá também relação entre mais que uma tabela na mesma base de dados (realções on-to-many) e mais tarde, vamos utilizar itemClasses para termos um mapeamento perfeito e mais correcto da nossa aplicação.&lt;br /&gt;
&lt;br /&gt;
Passando ao código...&lt;br /&gt;
&lt;br /&gt;
// Criamos uma variável que vai guardar a referencia ao nosso ficheiro de base de dados&lt;br /&gt;
private var dbFile:File;&lt;br /&gt;
&lt;br /&gt;
// Criamos uma nova conexão e abrimos o ficheiro que contem a base de dados&lt;br /&gt;
private var conn:SQLConnection;&lt;br /&gt;
&lt;br /&gt;
// Método init para iniciar as nossas variáveis e associar-lhes valores&lt;br /&gt;
private function init () : void {&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;dbFile = File.applicationStorageDirectory.resolvePath(&quot;employees.db&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;conn = new SQLConnection();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;conn.open(dbFile);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;createDataBase();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;insertDataBase();&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;selectDataBase();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Primeiro criamos a nossa base de dados local&lt;br /&gt;
private function createDataBase() : void&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Criamos a variável que vai executar a nossa query, atribuimos a nossa conexão, e criamos a query para depois executar&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;var statement : SQLStatement = new SQLStatement();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; statement.sqlConnection = conn;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; statement.text = &quot;CREATE TABLE employees (empId INTEGER PRIMARY KEY AUTOINCREMENT, empName VARCHAR(255))&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; statement.execute();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Da mesma forma que é fácil criar uma base de dados, também é fácil adicionarmos conteúdo à mesma bastanto quase copiar o código anterior mudando apenas a nossa query.&lt;br /&gt;
&lt;br /&gt;
private function insertDataBase():void&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var dbStatement:SQLStatement = new SQLStatement();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.sqlConnection = conn;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.text = &quot;INSERT INTO employees (empName) VALUES (:empName)&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.parameters[ &quot;:empName&quot; ] = &quot;António&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;dbStatement.execute();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Agora que já temos conteúdo, podemos ir buscá-lo através de um SELECT à base de dados&lt;br /&gt;
&lt;br /&gt;
private function selectDataBase():void&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var dbStatement:SQLStatement = new SQLStatement();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.sqlConnection = conn;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.text = &quot;SELECT * FROM employees&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.execute();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Se quiserem ver o resultado da vossa query...&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;var ac:ArrayCollection = new ArrayCollection(dbStatement.getResult().data);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var acLength : Number = ac.length;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;for ( var i:uint; i &amp;lt; acLength; i++ )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;trace( ac[i].empId + &quot; - &quot; + ac[i].empName );&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Já temos aqui uma primeira base mas ainda nos falta controlar várias acções, nomeadamente controlar a execução dos eventos e ter a certeza que estes ocorrem correctamente e só acedemos aos dados quando estes são recebidos / inseridos na nossa aplicação.&lt;br /&gt;
&lt;br /&gt;
Passando para um exemplo mais concreto, temos, nesta parte I deste tutorial, uma lista de trabalhadores de uma empresa que está guardada em uma base de dados SQLite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt;&lt;br /&gt;
&amp;lt;mx:WindowedApplication xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; layout=&quot;absolute&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; creationComplete=&quot;init()&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:Script&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![CDATA[&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; import mx.collections.ArrayCollection;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Variável que vai ter a informação para o array e que bind para a nossa datagrid&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Bindable]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var empArray : ArrayCollection;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Variáveis de conexão&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var dbFile : File;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var conn : SQLConnection;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var dbStatement : SQLStatement;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Variáveis para controlar as nossas queries&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var empNames : Array = new Array( &quot;António Amaro&quot;, &quot;Marco Silva&quot;, &quot;Luis Ribeiro&quot;, &quot;Salvador Mesquita&quot;, &quot;Lourenço Pinto&quot;, &quot;João Guimarães&quot; );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var empLoc : Array = new Array( &quot;Financeira&quot;, &quot;Desenvolvimento&quot;, &quot;Recursos Humanos&quot;, &quot;Transportes&quot;, &quot;Desenvolvimento&quot;, &quot;Vendas&quot; );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var empTel : Array = new Array( &quot;351&quot;, &quot;456&quot;, &quot;745&quot;, &quot;860&quot;, &quot;254&quot;, &quot;555&quot; );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private var empPos : Number = 0;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * INIT&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private function init() : void&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Criamos a referência para o nosso ficheiro&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbFile = File.applicationStorageDirectory.resolvePath( &quot;employees.db&quot; );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Criamos uma nova conexão que nos vai ligar à base de dados&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn = new SQLConnection();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Se a base de dados existe abrimos, senão criamos uma nova&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Dependendo da acção atribuimos diferentes listeners para invocarmos diferentes métodos&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( !dbFile.exists )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.addEventListener( SQLEvent.OPEN, connOpen );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.addEventListener( SQLEvent.OPEN, selectDataBase );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Abrimos a base de dados&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.open( dbFile );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * connOpen&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private function connOpen( e : SQLEvent ) : void&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // abriu a conexão, vai então criar a base de dados&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; createDataBase();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * createDataBase&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private function createDataBase() : void&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Criamos a variável que vai executar a nossa query, atribuimos a nossa conexão, e criamos a query para depois executar&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement = new SQLStatement();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.sqlConnection = conn;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.addEventListener( SQLEvent.RESULT, insertEmpNames, false, 0, true );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.text = &quot;CREATE TABLE employees (empId INTEGER PRIMARY KEY AUTOINCREMENT, empName VARCHAR(255), empLoc VARCHAR(255), empTel INTEGER)&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.execute();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * insertEmpNames&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private function insertEmpNames( e : SQLEvent ) : void&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Depois de criada a base de dados vamos preencher informação&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insertDataBase();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * insertDataBase&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private function insertDataBase() : void&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement = new SQLStatement();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.sqlConnection = conn;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Vamos inserindo novos elementos à base de dados até percorrermos todo o nosso array&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( empPos &amp;lt; empNames.length - 1 )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.addEventListener( SQLEvent.RESULT, insertEmpNames, false, 0, true );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.addEventListener( SQLEvent.RESULT, selectDataBase, false, 0, true );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Agora vamos adicionar para cada campo, um objecto com o valor que queremos inserir na tabela&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.text = &quot;INSERT INTO employees (empName, empLoc, empTel) VALUES (:empName, :empLoc, :empTel)&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.parameters[ &quot;:empName&quot; ] = empNames[ empPos ];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.parameters[ &quot;:empLoc&quot; ] = empLoc[ empPos ];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.parameters[ &quot;:empTel&quot; ] = empTel[ empPos ];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; empPos++;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.execute();&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * selectDataBase&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private function selectDataBase( e : SQLEvent ) : void&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement = new SQLStatement();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.sqlConnection = conn;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.addEventListener( SQLEvent.RESULT, attribDataGrid, false, 0, true );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Depois de inseridos todos os registos vamos seleccionar tudo que está na base de dados&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.text = &quot;SELECT * FROM employees&quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbStatement.execute();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private function attribDataGrid( e : SQLEvent ) : void&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Vamos buscar o valor retornado pela base de dados e colocar directo num array collection&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; empArray = new ArrayCollection( dbStatement.getResult().data );&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]]&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:Panel width=&quot;100%&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; paddingTop=&quot;10&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; paddingBottom=&quot;10&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; paddingLeft=&quot;10&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; paddingRight=&quot;10&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; title=&quot;TRABALHADORES DA SOFT S.A.&quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:DataGrid width=&quot;100%&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataProvider=&quot;{empArray}&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:columns&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:DataGridColumn headerText=&quot;Nome&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataField=&quot;empName&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:DataGridColumn headerText=&quot;Departamento&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataField=&quot;empLoc&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;mx:DataGridColumn headerText=&quot;Telefone&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataField=&quot;empTel&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/mx:Panel&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/mx:WindowedApplication&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como podem ver, é bem simples criamos um sistema de base de dados que a cria, adiciona e mostra os resultados para uma datagrid. Como disse mais a cima, na parte dois do tutorial vamos avançar para relações entre várias tabelas na mesma base de dados para podermos associar a um só item de uma tabela, várias informações de outra.&lt;/p&gt;
&lt;p&gt;NOTA: Se quiserem ir testando a criação dos ficheiros de base de dados e não conseguem porque a base de dados já está criada podem apagar &quot;à mão&quot; os ficheiros que ficam guardados no vosso computador.&lt;/p&gt;
&lt;p&gt;WINDOWS: C:\Users\&amp;lt;user&amp;gt;\AppData\Roaming&lt;/p&gt;
&lt;p&gt;MAC: &amp;lt;user&amp;gt;\Libraries\&lt;/p&gt;
&lt;p&gt;Podem descarregar o projecto que está associado a este post.&lt;/p&gt;
&lt;p&gt;Para mais informações sobre SQLite no AIR:&lt;br /&gt;
&lt;a href=&quot;http://coenraets.org/blog/2008/02/sqlite-admin-for-air-10/&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://coenraets.org/blog/2008/02/sqlite-admin-for-air-10/&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://livedocs.adobe.com/flex/3/langref/localDatabaseSQLSupport.html&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;http://livedocs.adobe.com/flex/3/langref/localDatabaseSQLSupport.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Uma ferramenta muito boa para poderem ver o que vai acontecendo e a estrutura da vossa base de dados, eu aconselhava a instalarem o &lt;a href=&quot;http://www.dehats.com/drupal/?q=node/58&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;Lita&lt;/a&gt; que foi referenciado num anterior post meu sobre &lt;a href=&quot;http://imauro.com/blog/?p=25&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;As melhores aplicações AIR para Designers e Developer&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Até à próxima e espero que tenham gostado!&lt;br /&gt;
&lt;br /&gt;
Mauro Martins.&lt;/p&gt;
&lt;/div&gt;&lt;h3&gt;Keywords&lt;/h3&gt;&lt;div class=&quot;ft-text&quot;&gt;adobe air, flex, sqlite, mauro martins, sqlconnection, database AIR, sqlresult, sqlstatement&lt;/div&gt;&lt;h3&gt;File&lt;/h3&gt;&lt;div class=&quot;ft-file&quot;&gt;&lt;img class=&quot;img-link-icon&quot; src=&quot;http://groups.adobe.com/common/icons/files/file.gif&quot; alt=&quot;&quot;/&gt;&lt;a href=&quot;http://groups.adobe.com/files/43f4246de2/DatabaseTutorial.zip&quot; target=&quot;_file&quot;&gt;DatabaseTutorial.zip&lt;/a&gt; &lt;span class=&quot;count&quot;&gt;(5KB)&lt;/span&gt;&lt;/div&gt;</description><guid isPermaLink="true">http://groups.adobe.com/posts/8fd81ed7c5</guid><pubDate>Thu, 01 Oct 2009 07:52:25 +0000</pubDate></item><item><title>Slides da apresentação &quot;Flash&amp;Arduino - uma ligação com sentimento&quot;</title><link>http://groups.adobe.com/posts/537ecded5d</link><description>&lt;p&gt;&lt;em&gt;Entry by &lt;a href=&quot;http://groups.adobe.com/people/a8e89c55f7&quot;&gt;Flash Grettir&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Entry&lt;/h3&gt;&lt;div class=&quot;ugc-html&quot;&gt;&lt;p&gt;Ontem realizei uma apresentação na monthly-meeting do nosso UserGroup...aqui estão os slides (o video deverá de estar disponivel em breve)&lt;/p&gt;
&lt;/div&gt;&lt;h3&gt;Keywords&lt;/h3&gt;&lt;div class=&quot;ft-text&quot;&gt;Flash, Arduino&lt;/div&gt;&lt;h3&gt;File&lt;/h3&gt;&lt;div class=&quot;ft-file&quot;&gt;&lt;img class=&quot;img-link-icon&quot; src=&quot;http://groups.adobe.com/common/icons/files/file.gif&quot; alt=&quot;&quot;/&gt;&lt;a href=&quot;http://groups.adobe.com/files/7c1277c0fc/Flash_%26_Arduino_-_Uma_ligacao_com_sentimento.swf&quot; target=&quot;_file&quot;&gt;Flash &amp; Arduino - Uma ligacao com sentimento.swf&lt;/a&gt; &lt;span class=&quot;count&quot;&gt;(1.6MB)&lt;/span&gt;&lt;/div&gt;</description><guid isPermaLink="true">http://groups.adobe.com/posts/537ecded5d</guid><pubDate>Fri, 25 Sep 2009 12:17:39 +0000</pubDate></item><item><title>Slides da apresentação “Rich Internet Applications – Uma Visão Geral” no CTIC 2009</title><link>http://groups.adobe.com/posts/8d09baea0d</link><description>&lt;p&gt;&lt;em&gt;Entry by &lt;a href=&quot;http://groups.adobe.com/people/f4ca9387c8&quot;&gt;João Saleiro&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;div class=&quot;ugc-html&quot;&gt;&lt;p&gt;Deixo aqui o &lt;a href=&quot;http://www.riapt.org/2009/07/02/slides-da-apresentacao-rich-internet-applications-uma-visao-geral-no-ctic-2009/&quot; rel=&quot;nofollow&quot;&gt;link&lt;/a&gt; para os slides da minha apresentação “Rich Internet Applications – Uma visão geral” no CTIC 2009 em Viseu a 13 de Maio. Esta apresentação é útil para quem está a entrar nesta coisa das RIAs e quer perceber exactamente o que são, e quais as diferenças e vantagens face às aplicações Desktop e Web. Espero que vos seja útil.&lt;/p&gt;
&lt;/div&gt;</description><guid isPermaLink="true">http://groups.adobe.com/posts/8d09baea0d</guid><pubDate>Thu, 02 Jul 2009 15:15:18 +0000</pubDate></item><item><title>Slides da apresentação “Enterprise RIAs” no FlashCamp</title><link>http://groups.adobe.com/posts/68c02f1057</link><description>&lt;p&gt;&lt;em&gt;Entry by &lt;a href=&quot;http://groups.adobe.com/people/f4ca9387c8&quot;&gt;João Saleiro&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Entry&lt;/h3&gt;&lt;div class=&quot;ugc-html&quot;&gt;&lt;p&gt;Tal como prometido, &lt;a href=&quot;http://www.riapt.org/wp-content/uploads/2009/06/enterprise-rias-this-is-how-we-do-it.pdf&quot; rel=&quot;nofollow&quot;&gt;aqui&lt;/a&gt; estão os slides da apresentação “&lt;a href=&quot;http://www.riapt.org/wp-content/uploads/2009/06/enterprise-rias-this-is-how-we-do-it.pdf&quot; rel=&quot;nofollow&quot;&gt;Enterprise RIAs - This is how we do it&lt;/a&gt;“. Espero que tenham gostado e que a apresentação vos tenha sido útil.&lt;/p&gt;
&lt;/div&gt;&lt;h3&gt;Keywords&lt;/h3&gt;&lt;div class=&quot;ft-text&quot;&gt;best practices, scrum, maven, sonar, subversion, trac, mylyn, hudson, frameworks, design patterns&lt;/div&gt;</description><guid isPermaLink="true">http://groups.adobe.com/posts/68c02f1057</guid><pubDate>Sat, 27 Jun 2009 12:20:59 +0000</pubDate></item><item><title>Passar VO(Value Objects) com uma Class Event (1 Comment)</title><link>http://groups.adobe.com/posts/dac3b25338</link><description>&lt;p&gt;&lt;em&gt;Entry by &lt;a href=&quot;http://groups.adobe.com/people/2beabfd9f0&quot;&gt;joaoGoncalves&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Entry&lt;/h3&gt;&lt;div class=&quot;ugc-html&quot;&gt;&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Durante as minhas aulas de &lt;strong&gt;Actionscript&lt;/strong&gt; em ambiente de &lt;strong&gt;FLASH&lt;/strong&gt;, por norma verifico que os formandos têm alguma dificuldade em utilizar algumas das &quot;best practices&quot; mais comuns nomeadamente em relação á criação de Eventos personalizados, no entanto, e assim que conseguem ultrapassar essa barreira, a primeira questão que me colocam é sempre a mesma:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;“então e se eu quiser enviar dados pelo meu Event Object, por forma a ……”&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Eis que surge então a necessidade de passar o conceito de &lt;strong&gt;VO (Value Object)&lt;/strong&gt; e criação de &lt;strong&gt;Classes de Eventos&lt;/strong&gt; personalizadas.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Como tive hoje que criar alguns ficheiros para exemplificação do Conceito de Classe de Evento Personalizada para envio de dados de uma instância para outra, resolvi partilhar convosco neste Blog os mesmos Ficheiros na esperança que venha ainda a ser útil para alguns dos meus leitores, ou ainda servir de ponto de consulta e esclarecimento de dúvidas para aqueles que durante as aulas não perceberam o conceito.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Sendo Assim vamos começar por analisar o pequeno problema que se coloca, e que servirá de “&lt;strong&gt;Case Study&lt;/strong&gt;” para a criação de uma Class de Evento personalizada e do conceito de VO.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;strong&gt;PROBLEMA&lt;/strong&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Temos um form onde a pessoa regista o seu nome, idade e situação laboral, e ao clicar num botão registar, pretende-se acrescentar a uma lista (Texto) os dados da pessoa.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;strong&gt;RESOLUÇÃO&lt;/strong&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Criar uma Class &lt;strong&gt;PessoaVO&lt;/strong&gt;, que irá servir para armazenar os dados da pessoa que forem inseridos no Form&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Criar uma Class &lt;strong&gt;PessoaEvent&lt;/strong&gt;, que será uma subclass da Class Event, e que servirá para enviar um “&lt;strong&gt;Event Object&lt;/strong&gt;” que incluirá uma instância da Class PessoaVO, com os dados anteriormente adquiridos no Form.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;A Aplicação principal estará á “escuta” da ocorrência do Evento PessoaEvent, e quando este for detectado, receberá pelo “Event Object” uma instância de PessoaVO com os dados da pessoa.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;A Aplicação após receber os dados da pessoa insere e actualiza a TextArea com os registos das pessoas.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Mãos á obra, vamos começar por criar um ficheiro em &lt;strong&gt;FLASH&lt;/strong&gt;, com um form com duas instâncias de TextInputs, para o nome e idade, uma instância de CheckBox para o estado laboral e um botão de registo, ao lado criar uma Textarea para ir acrescentando os Registos, ou seja, qualquer coisa deste género(desculpem mas a designer estava de folga, lol):&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;img class =&quot;aligncenter size-full wp-image-406 dynImage&quot; title=&quot;registo2&quot; src=&quot;http://www.joaogoncalves.net/blog/wp-content/uploads/2009/04/registo2.png&quot; alt=&quot;registo2&quot; width = &apos;470&apos; height = &apos;285&apos; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Passo seguinte vamos criar a Class PessoaVO, que será uma classe Value Object, e por esse motivo terá somente propriedades, propriedades estas que servirão para guardar os dados do form de registo:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;package {&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;&amp;nbsp; public class PessoaVO {&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; public var nome:String;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; public var idade:int;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp; public var empregado:Boolean;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;&amp;nbsp; }&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Depois de criar a Class responsável pelo armazenamento e transporte dos dados do formulário vamos criar a Class PessoaEvent, que irá ser uma SubClass da Class Event:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;package {&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;import flash.events.Event;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;import PessoaVO;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;public class PessoaEvent extends Event {&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;public static const PESSOA:String = &quot;pessoa&quot;;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;public var dadosPessoa:PessoaVO;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;public function PessoaEvent(type:String, voPessoa:PessoaVO) {&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;super(type);&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;this.dadosPessoa = voPessoa;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;public override function clone():Event {&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;return new PessoaEvent(type, dadosPessoa);&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Esta Class começa por fazer o &quot;extends&quot; da Class Event, na &lt;strong&gt;linha 9&lt;/strong&gt;, criamos uma constante do tipo de String que irá identificar o &quot;&lt;strong&gt;type&lt;/strong&gt;&quot; do nosso evento para usar depois como por exemplo usamos o CLICK num MouseEvent, na &lt;strong&gt;linha 10&lt;/strong&gt; criamos uma instância de &lt;strong&gt;PessoaVO&lt;/strong&gt;, para guardar os dados do form e posteriormente enviar os mesmos pela instância de evento criada. O constructor da Class é bastante simples e terá como parâmetros o &quot;&lt;strong&gt;tipo&lt;/strong&gt; &quot; de evento criado, e a instância, neste caso, de &lt;strong&gt;PessoaVO&lt;/strong&gt;. na &lt;strong&gt;linha seguinte (13),&lt;/strong&gt; chamamos o constructor da Class &quot;Pai&quot; para passar o tipo de evento criado, aqui não se passa qualquer parâmetro extra pois a Class &quot;Event&quot; não contêm parâmetros adicionais. Na &lt;strong&gt;linha 14&lt;/strong&gt; atribuímos á instância da class &quot;&lt;strong&gt;dadosPessoa&lt;/strong&gt;&quot; os valores recebidos no parâmetro &lt;strong&gt;voPessoa&lt;/strong&gt;&lt;strong&gt;Constructor&lt;/strong&gt; da Class. Por fim é necessário efectuar o &lt;strong&gt;overrride do método clone&lt;/strong&gt; da class Event, de forma a que esta instância de evento tenha um comportamentos normal de um evento como o &quot;Bubbling&quot; por exemplo, nesta definição retornamos o event criando a instância do novo evento e passando os dados armazenados na instância da PessoaVO.&lt;/span&gt; do &lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Por fim criamos a Document Class do nosso ficheiro:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;package {&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;import flash.display.MovieClip;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;import flash.events.MouseEvent;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;public class MainEventPessoa extends MovieClip {&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;public var pessoa:PessoaVO;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;public function MainEventPessoa() {&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;pessoa = new PessoaVO;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;registarBtn.addEventListener(MouseEvent.CLICK, registar);&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;this.addEventListener(PessoaEvent.PESSOA, receberPessoa);&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;private function receberPessoa(e:PessoaEvent):void {&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;registosTa.appendText(&quot;\n------------------\n&quot;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;+ &quot;Nome: &quot; + String(e.dadosPessoa.nome) +&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;&quot;\n&quot; + &quot;Idade: &quot; + String(e.dadosPessoa.idade) + &quot;\n&quot; +&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;&quot;Nome: &quot; + String(e.dadosPessoa.empregado) + &quot;\n&quot;);&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;private function registar(e:MouseEvent):void {&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;pessoa.nome = nomeTi.text;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;pessoa.idade = int(idadeTi.text);&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;pessoa.empregado = empregadoCb.selected;&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;dispatchEvent(new PessoaEvent(&quot;pessoa&quot;, pessoa));&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;&lt;code&gt;}&lt;/code&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;Nesta Document Class, começamos por criar uma instância de PessoaVO, onde iremos atribuir os valores dos dados que irão ser preenchidos no FORM, &lt;strong&gt;na linha 13&lt;/strong&gt;, definimos o evento click no botão registar que irá inicializar toda a sequência do script. o Listener do clicar em Registar vai associar os dados dos campos do form ás propriedades da instância de PEssoaVO (pessoa) &lt;strong&gt;linhas 26 a 28&lt;/strong&gt;, na &lt;strong&gt;linha 30&lt;/strong&gt; &quot;criamos&quot; um evento do tipo PessoaEvent, onde iremos incluir nos parâmetros do constructor, o nosso PessoaVO com o nome &quot;pessoa&quot;. Na &lt;strong&gt;linha 14&lt;/strong&gt; a nossa Aplicação recebe o evento &lt;strong&gt;&quot;PessoaEvent.PESSOA&lt;/strong&gt;&quot;, e chama o listener das &lt;strong&gt;linhas 18 a 22&lt;/strong&gt; que irá acrescentar(para os mais esquecidos deverão sempre usar o método appendText da Class TextField, e não o operador &quot; += &quot; para concatenar strings) á TextArea os dados que recebeu no &quot;Evento Object&quot; e que acedemos na propriedade &quot;dadosPessoa&quot; deste.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family:&apos;trebuchet ms&apos;, geneva;&quot;&gt;espero que este Post seja esclarecedor para muitos de vós, não hesitem em colocar questões ou sugestões para explicações futuras, deixo aqui tb &lt;a title=&quot;CustomEvent&quot; href=&quot;https://share.acrobat.com/adc/document.do?docid=b3928b5c-5115-4528-bbdc-9c694c2ca443&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;um ficheiro zip com os ficheiros&lt;/a&gt; exemplificando o mini-tutorial.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;h3&gt;Keywords&lt;/h3&gt;&lt;div class=&quot;ft-text&quot;&gt;Actionscript,Best Practice, FLASH&lt;/div&gt;</description><guid isPermaLink="true">http://groups.adobe.com/posts/dac3b25338</guid><pubDate>Fri, 03 Apr 2009 02:01:05 +0000</pubDate></item><item><title>Simular o ambiente de produção usando Virtual Hosts no Apache</title><link>http://groups.adobe.com/posts/41854d116d</link><description>&lt;p&gt;&lt;em&gt;Entry by &lt;a href=&quot;http://groups.adobe.com/people/f4ca9387c8&quot;&gt;João Saleiro&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;div class=&quot;ugc-html&quot;&gt;&lt;p&gt;Quando se constroem aplicações web, é normalmente uma boa prática configurar-se o ambiente de desenvolvimento de forma a que seja o mais semelhante possível ao ambiente de produção.&lt;br /&gt;
Uma das configurações que se faz antes de se iniciar o desenvolvimento do projecto, é a criação de um virtual host cuja configuração seja o mais idêntica possível à configuração do servidor onde o projecto estiver alojado.&lt;/p&gt;
&lt;p&gt;Entre outras configurações, a mais importante é a estrutura de directorias, que em desenvolvimento é diferente da estrutura em produção.&lt;/p&gt;
&lt;p&gt;Regra geral, quando se trata de uma aplicação com backend e um backoffice nós costumamos organizar o nosso ambiente de desenvolvimento desta forma:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;\webfuel\projecto&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;\webfuel\projecto\frontend&lt;br /&gt;
\webfuel\projecto\frontend\bin-debug (binários da aplicação)&lt;br /&gt;
\webfuel\projecto\frontend\src&lt;br /&gt;
\webfuel\projecto\frontend\[...]&lt;/p&gt;
&lt;p&gt;\webfuel\projecto\backoffice&lt;br /&gt;
\webfuel\projecto\backoffice\bin-debug (binários do backoffice)&lt;br /&gt;
\webfuel\projecto\backoffice\src&lt;/p&gt;
&lt;p&gt;\webfuel\projecto\backend (backend, por exemplo em php)&lt;br /&gt;
\webfuel\projecto\mm (imagens, e outros recursos multimédia)&lt;/p&gt;
&lt;p&gt;Quando corremos a aplicação localmente, sem os virtual hosts, vamos obter algo como http://localhost/projecto/bin-debug/index.swf .&lt;/p&gt;
&lt;p&gt;Para que a aplicação possa comunicar com o backend, o path para o gateway será por exemplo algo como ../../backend/gateway.php .&lt;/p&gt;
&lt;p&gt;Para que a aplicação possa aceder aos recursos multimédia (imagens, etc) o caminho será algo como ../../mm/imagem1.jpg .&lt;/p&gt;
&lt;p&gt;Estes caminhos não batem certo com os caminhos na versão de produção:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;www.projecto.pt (binários da aplicação)&lt;br /&gt;
www.projecto.pt/backoffice (binários do backoffice)&lt;br /&gt;
www.projecto.pt/backend (backend, por exemplo em php)&lt;br /&gt;
www.projecto.pt/mm (imagens e recursos multimédia)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Vemos que na versão de produção a aplicação para aceder ao backend vai fazer o caminho backend/gateway.php - enquanto que na versão de desenvolvimento, fazia o caminho ../../backend/gateway.php . O mesmo se aplica para as restantes directorias.&lt;/p&gt;
&lt;p&gt;Há muita gente que trabalha com a estrutura de directorias e caminhos do ambiente de desenvolvimento, e quando chega a altura de alojar o projecto, mudam os caminhos no source code (ou num ficheiro de configuração) e recompilam - má prática.&lt;/p&gt;
&lt;p&gt;Solução: criar um virtual host&lt;/p&gt;
&lt;p&gt;O Apache permite que se associe um ambiente com configurações específicas a um determinado domínio. Ou seja, se o Apache receber um pedido de acesso ao dominio www.projecto.dev , e houver um virtual host para esse dominio, podemos configurá-lo para devolver a nossa própria estrutura de directorias (e não só).&lt;/p&gt;
&lt;p&gt;O que gostariamos era de escrever no browser www.projecto.dev , e ser-nos exposto o nosso projecto com a estrutura de directorias igual à estrutura que vamos obter no servidor.&lt;/p&gt;
&lt;p&gt;Vamos começar por configurar o apache editando o ficheiro httpd.conf na directoria conf do apache. No final do ficheiro, basta adicionar as seguintes linhas:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;NameVirtualHost 127.0.0.1&lt;br /&gt;
Include conf/vhosts/*.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A primeira linha permite que o apache possa associar os nomes dos domínios pedidos aos virtual hosts que vamos configurar (mais info &lt;a href=&quot;http://httpd.apache.org/docs/1.3/mod/core.html#namevirtualhost&quot; rel=&quot;nofollow&quot;&gt;aqui&lt;img id=&quot;snap_com_shot_link_icon&quot; class =&quot;snap_preview_icon dynImage&quot; style=&quot;border:0pt none;margin:0pt;padding:1px 0pt 0pt;font-style:normal;font-weight:normal;font-family:&apos;trebuchet ms&apos;, arial, helvetica, sans-serif;float:none;line-height:normal;background-image:url(http://i.ixnp.com/images/v3.60/theme/green/palette.gif);background-color:transparent;width:14px;height:12px;background-position:-855px 0pt;background-repeat:no-repeat;text-decoration:none;vertical-align:top;&quot; src=&quot;http://i.ixnp.com/images/v3.60/t.gif&quot; alt=&quot;&quot;  width=&quot;200&quot;/&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;A segunda linha indica ao Apache para carregar e executar todos os ficheiros de configuração com a extensão .conf na directoria vhosts. Isto fará com que criar um novo virtual host seja algo como criar um novo ficheiro .conf na directoria vhosts.&lt;/p&gt;
&lt;p&gt;Vamos agora à directoria vhosts, e vamos criar um ficheiro chamado projecto.conf .&lt;/p&gt;
&lt;p&gt;Nesse ficheiro, vamos colocar o seguinte:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;VirtualHost 127.0.0.1:80&amp;gt;&lt;br /&gt;
DocumentRoot &quot;D:\OsMeusProjectos\projecto\frontend\bin-debug&quot;&lt;br /&gt;
ServerName www.projecto.dev&lt;br /&gt;
&amp;lt;Directory &quot;D:\OsMeusProjectos\projecto\frontend\bin-debug&quot;&amp;gt;&lt;br /&gt;
Options Indexes FollowSymLinks Includes ExecCGI&lt;br /&gt;
AllowOverride All&lt;br /&gt;
Order allow,deny&lt;br /&gt;
Allow from all&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Alias /backend &quot;D:\OsMeusProjectos\projecto\backend&quot;&lt;br /&gt;
Alias /backoffice &quot;D:\OsMeusProjectos\projecto\backoffice\bin-debug&quot;&lt;br /&gt;
Alias /mm &quot;D:\OsMeusProjectos\projecto\mm&quot;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;/p&gt;
&lt;p&gt;Isto vai indicar ao Apache que os pedidos recebidos na porta 80, máquina 127.0.0.1 relativos ao domínio www.projecto.dev irão ter a directoria bin-debug do frontend como a directoria de raíz do projecto. Os Aliases permitem que o Apache exponha o backend, backoffice e mm em directorias específicas, resultando assim num ambiente igual ao de produção.&lt;br /&gt;
Depois de feita a alteração acima, é preciso reiniciar o Apache.&lt;/p&gt;
&lt;p&gt;Falta conseguirmos fazer com que pedidos para www.projecto.dev vão parar ao Apache. Para isso, vamos mexer no ficheiro &quot;hosts&quot; do Windows para forçarmos o redireccionamento de pedidos para www.projecto.dev para a nossa máquina local.&lt;br /&gt;
Basta para isso editar o ficheiro hosts (mais info no &lt;a href=&quot;http://en.wikipedia.org/wiki/Hosts_file&quot; rel=&quot;nofollow&quot;&gt;wikipedia&lt;img class =&quot;snap_preview_icon dynImage&quot; style=&quot;border:0pt none;margin:0pt;padding:1px 0pt 0pt;font-style:normal;font-weight:normal;font-family:&apos;trebuchet ms&apos;, arial, helvetica, sans-serif;float:none;line-height:normal;background-image:url(http://i.ixnp.com/images/v3.60/theme/green/palette.gif);background-color:transparent;width:14px;height:12px;background-position:-827px 0pt;background-repeat:no-repeat;text-decoration:none;vertical-align:top;&quot; src=&quot;http://i.ixnp.com/images/v3.60/t.gif&quot; alt=&quot;&quot;  width=&quot;200&quot;/&gt;&lt;/a&gt;), na directoria c:\windows\system32\drivers\etc . Recordo que no Windows Vista, será preciso abrir um editor de texto com permissões de administrador, e depois fazer o File &amp;gt; Open e procurar o ficheiro no disco - caso contrário não será possível editá-lo.&lt;/p&gt;
&lt;p&gt;Neste ficheiro, bastará colocar o seguinte:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;127.0.0.1 www.projecto.dev&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A linha acima vai indicar o sistema operativo que todos os pedidos feitos para o domínio www.projecto.dev vão ser reencaminhados para 127.0.0.1 - a nossa máquina local. Como estamos a fazer os pedidos dentro de um web-browser, a porta por defeito será a 80. O resto é fácil de adivinhar: pedidos para a nossa máquina local na porta 80 vão ser entregues a quem? Ao nosso amigo Apache! Que ao receber um pedido destinado ao domínio www.projecto.dev, vai procurar o Virtual Host respectivo e expô-lo com a estrutura que definimos.&lt;/p&gt;
&lt;p&gt;Obviamente, isto abre-nos as portas para fazer configurações mais radicais (i.e. configurar o Apache para que o Virtual Host seja igualzinho ao do servidor final).&lt;/p&gt;
&lt;/div&gt;</description><guid isPermaLink="true">http://groups.adobe.com/posts/41854d116d</guid><pubDate>Sat, 13 Dec 2008 14:37:14 +0000</pubDate></item><item><title>Aumentar a velocidade no carregamento de PNG&apos;s convertendo-os para SWF</title><link>http://groups.adobe.com/posts/0effe0c672</link><description>&lt;p&gt;&lt;em&gt;Entry by &lt;a href=&quot;http://groups.adobe.com/people/f4ca9387c8&quot;&gt;João Saleiro&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;div class=&quot;ugc-html&quot;&gt;&lt;p&gt;Fizemos na Webfuel um projecto há uns meses para um dos principais criadores de joias nacionais. Um dos requisitos do cliente era que na secção de showroom, cada joia pudesse ser apresentada dentro de uma ferramenta de zoom que permitisse ver a joia em detalhe - implicando que as fotos das joias tivessem resoluções superiores a 700x700 pixeis. Outro dos requisitos, era que as imagens das joias não tivessem fundo para que pudessem encaixar correctamente no layout do site - implicando que teria que ser escolhido um formato que suportasse transparência, neste caso PNG. Para terminar, era imperativo que o cliente, sem quaiquer conhecimentos de informática, pudesse adicionar e actualizar as fotos das joias através do backoffice - implicando que cada foto fosse um PNG colocado no servidor pelo cliente através das funcionalidades do backoffice.&lt;br /&gt;
&lt;br /&gt;
Estas pré-condições implicaram o recurso ao formato PNG - o único que permitiria resolver o problema, visto a norma JPEG2000 não ser suportada pelo Flash Player. Porém, adoptar o formato PNG para as fotos das joias com as dimensões acima referidas resultou em ficheiros de cerca de 500KB. Isto, num site com cerca de 200 a 300 jóias, com várias fotos cada.&lt;br /&gt;
&lt;br /&gt;
Depois do deployment do site constatou-se o esperado: em ligações rápidas, os 500KB de cada foto não representavam grandes problems, mas em ligações lentas podia ser desesperante esperar de 10 a 20 segundos para a foto carregar. E com o disseminar recente das ligações 3,5G (kangurus, vodafone e tmn connect box, etc), tornou-se problemático pelo que tivemos que procurar por uma solução.&lt;br /&gt;
&lt;br /&gt;
Encontrámos uma extensão chamada PNG2SWF pertencente ao pacote SWFTools que permitia converter um PNG para um SWF. Como é sabido, um PNG embebido em SWF pode levar compressão sendo mantida a transparência, pelo que decidimos fazer algumas experiências. Após alguns testes, tivemos resultados impressionantes: imagens de 500 Kb passaram para 60 Kb sem serem perdidos os canais alpha. Exactamente o que precisávamos!&lt;br /&gt;
&lt;br /&gt;
O problema que surgiu de seguida consistia em saber como integrar o PNG2SWF com o site / backoffice sem afectar a experiência do utilizador. Era importante que o cliente continuasse a utilizar o backoffice como sempre, sem trabalho adicional.&lt;br /&gt;
&lt;br /&gt;
Fizemos então um script simples, que vos ofereço adiante, e que consiste num género de proxy para carregar PNGs, só que devolve o PNG convertido para SWF, e escalado para dimensões arbitrárias escolhidas pelo programador.&lt;br /&gt;
&lt;br /&gt;
O download do script pode ser feito aqui: pngoptimize . O source code pode ser visto abaixo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // 31-10-2008&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // pngOptimize.php by João Saleiro - Webfuel ( joao.saleiro@webfuel.pt)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Todo:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // - receive quality from $_GET vars&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // - set default values for quality, w and h&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $image = $_GET[&apos;url&apos;];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $w = $_GET[&apos;w&apos;];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $h = $_GET[&apos;h&apos;];&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $date = filemtime($image);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Generate SWF filename&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $swf = $image . $w . $h .&apos;_&apos;. $date .&apos;.swf&apos;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Generate SWF if it doesn&apos;t exist&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!file_exists($swf))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Calculate dimensions&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list($width, $height) = getimagesize($image);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $proportion = 1;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($width &amp;gt; $height)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $proportion = $w/$width;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $proportion = $h/$height;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Load image and preserver transparency&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $im = @imageCreateFromPNG ($image);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagealphablending($im, false);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imageinterlace ( $im, 0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagesavealpha($im, true);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create new Image&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $im_dest = imagecreatetruecolor ($width*$proportion,&amp;nbsp; $height*$proportion);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Set transparency&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $background = imagecolortransparent($im);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagecolortransparent($im_dest, $background);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagealphablending($im_dest, false);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagesavealpha($im_dest, true);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Resize old image to new image&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagecopyresampled($im_dest, $im, 0, 0, 0, 0, $width*$proportion, $height*$proportion, $width, $height);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Save new image&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $tempName=$image.&apos;temp.png&apos;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagepng($im_dest, $tempName);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Clean memory&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagedestroy($im);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagedestroy($im_dest);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Convert new image to SWF&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; shell_exec(&quot;./png2swf -j 85 -o $swf $tempName&quot;);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Remove temp file&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unlink($tempName);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // If we get here, and there&apos;s no file, we don&apos;t return nothing&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!file_exists($swf))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit(0);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; // Return generated SWF&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; header(&quot;Content-type: application/x-shockwave-flash&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $fp = fopen($swf,&quot;rb&quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fpassthru($fp);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fclose($fp);&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O algoritmo é relativamente simples:&lt;br /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;O script recebe por GET os parâmetros: url, w e h, que correspondem ao endereço relativo do PNG, e as dimensões que queremos para o nosso SWF resultante;&lt;/li&gt;
&lt;li&gt;O script vai então gerar um nome de ficheiro único para aquele url, com aquelas dimensões, e para a data do PNG (i.e. se o PNG for actualizado pelo cliente o script detecta que há um PNG novo, o que implica gerar um novo SWF com novo nome);&lt;/li&gt;
&lt;li&gt;É verificado se já existe algum SWF com aquele nome único (i.e. uma versão em cache daquele PNG já convertido para SWF com aquelas dimensões). Se existir, o SWF é aberto e lido, e feito um fpassthru do ficheiro (i.e. é devolvido o conteúdo do ficheiro SWF), depois de definido o header application/x-shockwave-flash para que o Flash possa interpretar o resultado do ficheiro PHP como sendo um SWF;&lt;/li&gt;
&lt;li&gt;Se não existir nenhum SWF, o script vai abrir o PNG referido no URL, e criar um novo PNG temporário com as dimensões referidas, mantendo a transparência;&lt;/li&gt;
&lt;li&gt;É então feita a conversão desse PNG temporário para SWF através de um shell_exec que executa o png2swf com os parâmetros necessários para a conversão, sendo gerado um SWF com o nome de ficheiro referido acima, e devolvido com o fpassthru.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;
Para utilizar este script é necessário:&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Colocar no servidor, na mesma directoria do pngConvert.php, o png2swf (linux) ou png2swf.exe (windows);&lt;/li&gt;
&lt;li&gt;Permissões de execução do png2swf nessa directoria;&lt;/li&gt;
&lt;li&gt;Permissões do php para a chamada de comandos externos (shell_exec);&lt;/li&gt;
&lt;li&gt;Permissões de escrita nas directorias onde estão os ficheiros PNG para serem lá colocados os ficheiros SWF;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
Do lado do cliente, o código necessário para carregar um PNG convertido para SWF através do pngConvert é:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; MXML:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mx:Image source=&quot;pngConvert.php?url=imagem.png&amp;amp;w=100&amp;amp;h=100&quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Actionscript 3 (i.e. Flash)&lt;br /&gt;
&lt;br /&gt;
var l:Loader=new Loader();&lt;br /&gt;
&lt;br /&gt;
l.load(new URLRequest(&apos;pngConvert.php?url=imagem.png&amp;amp;w=100&amp;amp;h=100&apos;));&lt;br /&gt;
&lt;br /&gt;
addChild(l);&lt;br /&gt;
&lt;br /&gt;
O script ainda pode levar algumas melhorias, nomeadamente:&lt;br /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a qualidade da imagem também ser passada por GET;&lt;/li&gt;
&lt;li&gt;se os parâmetros w e h não estiverem definidos, o SWF gerado é da mesma dimensão que o PNG original.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
Não implementei essas melhorias porque não precisei na altura, mas se alguém quiser melhorar, é bem vindo - publicarei depois aqui a versão melhorada, com devidos créditos.&lt;/p&gt;
&lt;p&gt;Espero que esta informação e script vos sejam úteis. O script pode ser utilizado livremente e só pedimos que seja colocado um comentário neste post com o endereço do site onde o estão a usar, para alegrarem o nosso dia.&lt;/p&gt;
&lt;/div&gt;</description><guid isPermaLink="true">http://groups.adobe.com/posts/0effe0c672</guid><pubDate>Thu, 04 Dec 2008 15:15:59 +0000</pubDate></item><item><title>Client &amp; Cloud</title><link>http://groups.adobe.com/posts/f017cfa6b7</link><description>&lt;p&gt;&lt;em&gt;Entry by &lt;a href=&quot;http://groups.adobe.com/people/ee1f2582f2&quot;&gt;Rui Silva&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Entry&lt;/h3&gt;&lt;div class=&quot;ugc-html&quot;&gt;&lt;p&gt;Ainda de &quot;ressaca&quot; da MAX, pareceu-me interessante apresentar um conceito que foi avançado pelo Kevin Lynch na keynote de abertura da MAX e que me parece vai determinar em larga medida a forma como se vai desenvolver software nos próximos tempos.&lt;/p&gt;
&lt;p&gt;O conceito em si não é nada de novo e, como acontece na maioria dos casos, inúmeras aplicações no mercado já o utilizam. No entanto, a formalização com um nome específico dá-lhe um ar oficial que o coloca ao nível de conceitos como &quot;cliente-servidor&quot; e &quot;web application&quot;.&lt;/p&gt;
&lt;p&gt;Este conceito diz respeito à forma como as aplicações cada vez mais tendem a comunicar com origens de dados. De um paradigma em que a grande maioria das aplicações possuem uma origem de dados bem definida (normalmente associada apenas com essa aplicação), passa-se para a conexão com diversas origens de dados diferentes que podem ser disponibilizadas por terceiros em qualquer parte do mundo dando corpo ao conceito de &quot;cloud computing&quot;.&lt;/p&gt;
&lt;p&gt;O que tornou isto possível foi a disponibilização de dados e até mesmo lógica através da publicação de web services que estão disponíveis para conexão utilizando protocolos standard bem definidos e que podem ser consumidos por uma infinidade de tecnologias tanto de cliente como de servidor.&lt;/p&gt;
&lt;p&gt;Um exemplo clássico deste tipo de aplicações são os famosos mashups (quem ainda não fez um mashup?). O que esta apresentação do Kevin traz de especial é que ela foi inserida no seio de uma keynote que pretendia ser &quot;séria&quot; e que avançava a visão da Adobe para a evolução da programação. Não foi uma qualquer sessão de show-off em que pretendia apresentar as potencialidades de uma qualquer tecnologia ou plataforma. E eu acredito que realmente as coisas vão começar a ser feitas desse modo. A regra de ouro &quot;se alguém na empresa já escreveu código para fazer isso, porque deverei eu escrevê-lo de novo?&quot; passará a ser &quot;se alguém na internet já escreveu e publicou um serviço para fazer isso....&quot;.&lt;/p&gt;
&lt;p&gt;Será que, mais uma vez, a Adobe cunhou um conceito que vai &quot;pegar&quot; (tal como a Macromedia fez com o conceito RIA)? Será que este tipo de aplicações vão sair do âmbito das aplicações sociais e de entertenimento e vão invadir o mercado empresarial? Acho que só o futuro poderá responder a estas perguntas. O que é que vocês acham?&lt;/p&gt;
&lt;/div&gt;&lt;h3&gt;Keywords&lt;/h3&gt;&lt;div class=&quot;ft-text&quot;&gt;Cloud computing, RIA, Client &amp;amp; Cloud&lt;/div&gt;</description><guid isPermaLink="true">http://groups.adobe.com/posts/f017cfa6b7</guid><pubDate>Thu, 27 Nov 2008 00:50:53 +0000</pubDate></item><item><title>MAX 2008 NA</title><link>http://groups.adobe.com/posts/9e0d19e593</link><description>&lt;p&gt;&lt;em&gt;Entry by &lt;a href=&quot;http://groups.adobe.com/people/ee1f2582f2&quot;&gt;Rui Silva&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;h3&gt;Entry&lt;/h3&gt;&lt;div class=&quot;ugc-html&quot;&gt;Olá,&lt;br /&gt;
&lt;br /&gt;
Este ano tive a felicidade de ir à MAX em S. Francisco. Não foi a minha primeira participação numa MAX mas foi a primeira vez que fui à sua versão norte americana.&lt;br /&gt;
&lt;br /&gt;
De um modo geral, o evento foi tudo aquilo que se esperava dele e a possibilidade de estabelecer contactos efectivos com pessoas que, de outro modo, poderíamos nem sequer ter a oportunidade de conhecer é uma enorme mais valia resultante da participação nestes eventos.&lt;br /&gt;
&lt;br /&gt;
Em termos de sessões, verificou-se que, este ano, a Adobe centrou-se ainda mais nas suas tecnologias de desenvolvimento de RIAs que, de facto, dominaram a grande maioria das sessões técnicas e foram um aspecto muito importante nas comunicações gerais. Coldfusion, LiveCycle e BlazeDS encontraram, também, um espaço bastante significativo o que permitiu a quem esteve presentente perceber de que forma se podem construir experiências web considerando todos os aspectos envolvidos (à excepção de uma solução de base de dados).&lt;br /&gt;
&lt;br /&gt;
Um outro vector abordado que tem vindo a ganhar uma crescente notoriedade por parte da Adobe é o dos serviços como é o caso do Cocomo, uma plataforma construida sobre o Acrobat Connect que permite o desenvolvimento de aplicações em Flex com recurso a partilha em tempo real de dados, audio e vídeo.&lt;br /&gt;
&lt;br /&gt;
Relativamente às sessões gerais, entre as participações do costume (O Shantanu e o Kevin Lynch fizeram as comunicações mais formais sobre a empresa e as tecnologias em desenvolvimento), houve uma que despertou bastante interesse quer pela forma como foi apresentada, quer pelo conteúdo apresentado. De facto, ver o Ben Forta e o Tim Buntel vestidos de &quot;agentes especiais&quot; à procura de uma solução para a criatividade foi um momento gratificante que deu origem a conversas entre os dois que pouco ficaram a dever a um qualquer filme de comédia do tipo &quot;Get Smart&quot;. Os temas abordados nesta apresentação correram as tecnologias e ferramentas essenciais da Adobe para a criação de experiências de utilização ricas na internet tendo partido do design, passado pelo desenvolvimento e, finalmente, acabando na disponibilização das mesmas.&lt;br /&gt;
&lt;br /&gt;
Os sneaks deste ano, apesar de bastante bons, deixaram um pouco a desejar relativamente ao de anos anteriores (também não é fácil rivalizar com o anúncio de um novo Flash player). Algumas tecnologias na área da imagem e vídeo foram apresentadas ao lado de plugins e plataformas que permitem o desenvolvimento mais fácil de aplicações web e desktop com recurso a diversos mecanismos automáticos e a conceitos largamente distribuídos por outras empresas e tecnologias como é o caso, por exemplo, dos widgets.&lt;br /&gt;
&lt;br /&gt;
Resta-me apenas dizer que a cidade de S. Francisco é fantástica e que me senti perfeitamente em casa já que dizem que é das cidades americanas a que mais se assemelha a uma cidade europeia.&lt;br /&gt;
&lt;br /&gt;
Quero finalizar esta entrada no blog agradecendo à Sumi Lim que é a Developer relations manager para EMEA e que, portanto, serve de interlocutora entre o nosso grupo e a Adobe. O carinho com que nos recebeu e o esforço que realizou no sentido de nos levar a conhecer e a manter contactos com o maior número de pessoas possível foi um dos aspectos mais importantes desta participação.&lt;/div&gt;&lt;h3&gt;Keywords&lt;/h3&gt;&lt;div class=&quot;ft-text&quot;&gt;MAX 2008, eventos&lt;/div&gt;</description><guid isPermaLink="true">http://groups.adobe.com/posts/9e0d19e593</guid><pubDate>Tue, 25 Nov 2008 01:33:39 +0000</pubDate></item></channel></rss>