<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TSW - That Should Work Blog &#187; handle</title>
	<atom:link href="http://blog.msdevstudio.net/tag/handle/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.msdevstudio.net</link>
	<description>Flash, Flex, Web e Aplicações Ricas para Internet!</description>
	<lastBuildDate>Tue, 07 Feb 2012 18:30:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Flex/AS3 &#8211; Truques e Dicas #8 &#8211; Re-use o código!</title>
		<link>http://blog.msdevstudio.net/2009/04/09/flexas3-truques-dicas-8-re-use-o-codigo/</link>
		<comments>http://blog.msdevstudio.net/2009/04/09/flexas3-truques-dicas-8-re-use-o-codigo/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 13:33:01 +0000</pubDate>
		<dc:creator>Mário Santos</dc:creator>
				<category><![CDATA[Action Script & MXML]]></category>
		<category><![CDATA[Air]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Certificaçao Flex]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[RIA's Geral]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[action script 3]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[boas praticas]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[handle]]></category>
		<category><![CDATA[optimização]]></category>
		<category><![CDATA[re-uso]]></category>

		<guid isPermaLink="false">http://msdevstudio.com/blog/?p=967</guid>
		<description><![CDATA[Outro dos bons exemplos que se podem fazer ao criar uma aplicação usando actionscript 3 é a utilização do código, num dos simples exemplos vou mostrar como podemos usar apenas uma função para lidar com 4 ou mais eventos&#8230;e de tipos diferentes! Na minha aplicação, tinha a necessidade de adicionar alguns eventos (inicialmente do rato) [...]]]></description>
			<content:encoded><![CDATA[<p>Outro dos bons exemplos que se podem fazer ao criar uma aplicação usando actionscript 3 é a utilização do código, num dos simples exemplos vou mostrar como podemos usar apenas uma função para lidar com 4 ou mais eventos&#8230;e de tipos diferentes!</p>
<p>Na minha aplicação, tinha a necessidade de adicionar alguns eventos (inicialmente do rato) a um elemento e lidar com os mesmos, muita gente faria, por exemplo ao lidar com 4 eventos do rato numa dataGrid:</p>
<p>[coolcode]<br />
dg.addEventListener(MouseEvent.CLICK, onClick);<br />
dg.addEventListener(MouseEvent.MOUSE_WHEEL onMouseWheel);<br />
dg.addEventListener(MouseEvent.ROLL_OVER, onRollOver);<br />
dg.addEventListener(MouseEvent.ROLL_OUT, onRollOut);<br />
[/coolcode]</p>
<p>O que neste caso teriamos que usar 4 funções diferentes: <strong>onClick</strong>, <strong>onDoubleClick</strong>, <strong>onRollOver</strong>, <strong>onRollOut</strong> do estilo:<br />
[coolcode]<br />
private function onClick(evt:MouseEvent):void { }<br />
private function onMouseWheel(evt:MouseEvent):void { }<br />
private function onRollOver(evt:MouseEvent):void { }<br />
private function onRollOut(evt:MouseEvent):void { }<br />
[/coolcode]</p>
<p>É facil compreender que muita gente use esta forma (eu já usei), mas existe uma forma mais pratica, uma vez que todos os eventos são MouseEvent, podemos fazer apenas uma função:<br />
[coolcode]<br />
dg.addEventListener(MouseEvent.CLICK, onDGMouse);<br />
dg.addEventListener(MouseEvent.MOUSE_WHEEL, onDGMouse);<br />
dg.addEventListener(MouseEvent.ROLL_OVER, onDGMouse);<br />
dg.addEventListener(MouseEvent.ROLL_OUT, onDGMouse);<br />
[/coolcode]<br />
<span id="more-967"></span><br />
e construir apenas uma função em vez de 4, fazend o uso de comparação do tipo de evento:<br />
[coolcode]<br />
private function onDGMouse(evt:MouseEvent):void {<br />
		  switch(evt.type) {<br />
				case MouseEvent.CLICK:<br />
				trace(&#8220;Evento click: &#8220;+evt.type);<br />
				break;</p>
<p>				case MouseEvent.MOUSE_WHEEL:<br />
				trace(&#8220;Evento roda do rato: &#8220;+evt.type);<br />
				break;</p>
<p>				case MouseEvent.ROLL_OVER:<br />
				trace(&#8220;Evento Roll Over: &#8220;+evt.type);<br />
				break;</p>
<p>				case MouseEvent.ROLL_OUT:<br />
				trace(&#8220;Evento Roll Out: &#8220;+evt.type);<br />
				break;</p>
<p>				default:<br />
				Alert.show(&#8220;Evento detectado, nenhuma função associada!: &#8220;+evt.type);<br />
				break;<br />
		   }</p>
<p>		}<br />
[/coolcode]</p>
<p>Como podem ver simplificamos o trabalho e ficamos com o código mais organizado, mas ainda podemos alargar esta função a mais eventos, aliás, a todos os eventos do rato, mas não só&#8230; se mudarmos a declaração da função de<br />
[coolcode]<br />
private function onDGMouse(evt:MouseEvent)<br />
[/coolcode]<br />
para<br />
[coolcode]<br />
private function onDGMouse(evt:*)<br />
[/coolcode]<br />
A nossa função passa a poder receber qualquer tipo de evento, se bem que nem todos os programadores são de acordo em usar este tipo de função &#8220;handler&#8221; de multi-eventos, a verdade é que muitas vezes reduzimos o código em dezenas de linhas e o colocamos bem mais legil, ora vejam como além dos eventos do rato, a mesma função passa a poder receber e lidar com DragEvent&#8217;s ou DataGridEvent&#8217;s:<br />
[coolcode]<br />
private function onDGMouse(evt:*):void {<br />
		  switch(evt.type) {<br />
				case MouseEvent.CLICK:<br />
				trace(&#8220;Evento click: &#8220;+evt.type);<br />
				break;</p>
<p>				case MouseEvent.MOUSE_WHEEL:<br />
				trace(&#8220;Evento roda do rato: &#8220;+evt.type);<br />
				break;</p>
<p>				case MouseEvent.ROLL_OVER:<br />
				trace(&#8220;Evento Roll Over: &#8220;+evt.type);<br />
				break;</p>
<p>				case MouseEvent.ROLL_OUT:<br />
				trace(&#8220;Evento Roll Out: &#8220;+evt.type);<br />
				break;</p>
<p>				case DataGridEvent.COLUMN_STRETCH:<br />
				trace(&#8220;Evento DG :&#8221;+evt.type);<br />
				break;</p>
<p>				case DragEvent.DRAG_ENTER:<br />
				trace(&#8220;Evento DRAG :&#8221;+evt.type);<br />
				break;</p>
<p>				default:<br />
				Alert.show(&#8220;Evento &#8220;+evt.type+&#8221;detectado, nenhuma instrução associada!: &#8220;);<br />
				break;<br />
		   }</p>
<p>		}<br />
[/coolcode]<br />
Neste momento podemos dizer que esta função é valida para lidar com quase qualquer evento, vejam 3 eventos completamente diferentes a usarem a mesma função de &#8220;event handle&#8221;:<br />
[coolcode]<br />
dg.addEventListener(MouseEvent.CLICK, onDGMouse);<br />
dg.addEventListener(DataGridEvent.COLUMN_STRETCH, onDGMouse);<br />
dg.addEventListener(DragEvent.DRAG_ENTER, onDGMouse);<br />
[/coolcode]</p>
<p>Como devem imaginar, pode ser, e é, muito util!!</p>
<p>Abraço.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.msdevstudio.net/2009/04/09/flexas3-truques-dicas-8-re-use-o-codigo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Flex/AS3 &#8211; Truques e Dicas #2 &#8211; Try, Catch &amp; Finally</title>
		<link>http://blog.msdevstudio.net/2009/03/27/flexas3-truques-dicas-2-try-catch-finally/</link>
		<comments>http://blog.msdevstudio.net/2009/03/27/flexas3-truques-dicas-2-try-catch-finally/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 10:41:51 +0000</pubDate>
		<dc:creator>Mário Santos</dc:creator>
				<category><![CDATA[Action Script & MXML]]></category>
		<category><![CDATA[Air]]></category>
		<category><![CDATA[Certificaçao Flex]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[RIA's Geral]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[boas praticas]]></category>
		<category><![CDATA[catch]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[finally]]></category>
		<category><![CDATA[handle]]></category>
		<category><![CDATA[prevenção]]></category>
		<category><![CDATA[try]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://msdevstudio.com/blog/?p=884</guid>
		<description><![CDATA[Esta é mais uma das reliqueas do as3, principalmente para dar consistencia e fiabilidade à nossa aplicação e evitar que sejam disparados erros que o utilizador final possa ver. Ou seja o objectivo do #2 &#8211; Try, Catch &#38; Finally É precisamente prevenir as malditas janelas de erro (quando o utilizador têm o flash player [...]]]></description>
			<content:encoded><![CDATA[<p>Esta é mais uma das reliqueas do as3, principalmente para dar consistencia e fiabilidade à nossa aplicação e evitar que sejam disparados erros que o utilizador final possa ver. Ou seja o objectivo do</p>
<h3><strong>#2 &#8211; Try, Catch &amp; Finally</strong></h3>
<p><strong><br />
</strong></p>
<p>É precisamente prevenir as malditas janelas de erro (quando o utilizador têm o flash player debug) e disparar acções quando esse erro acontecer, impedindo assim uma falha na aplicação. Este uso é muito util, embora pessoalmente não o use sempre (iria expandir em muito as linhas de código da aplicação) mas uso sempre que exista uma grande possibilidade de erro, no meu exemplo a seguir verão que é muito util.</p>
<p> </p>
<p>O que eu necessitava na minha aplicação, era que quando o utilizador fizer logout (apresentasse o ecra de login de novo) da aplicação todas os meus popup&#8217;s adicionados via PopUpManager (podem ser até 20 paineis em popup) sejam removidos. </p>
<p>Como eu não queria ter a necessidade de estar a controlar individualmente se um painel está aberto ou não (poderia fazer isso atravez de um array de estados) apenas percorro todos os child&#8217;s do systemManger na minha aplicação (um popUpManager.addItem() adiciona o popUp à display list do sistemManager, como se tratasse de uma janela) e tento remove-los com o popUpManager. Claro que se a minha aplicação tiver um elemento que não tenha sido colocado pelo PopUpManager iria acontecer um erro ao tentar remover esse componente, e aí sim a necessidade deste try, catch, finally torna-se muito fiavel.</p>
<p> </p>
<p>O seu funcionamento é bem simples, o try encarrega-se de &#8220;tentar&#8221; executar a acção, enquanto que o catch se ocupa de &#8220;captar&#8221; todos os possiveis erros que aconteçam ao executar a acção e o finally encarrega-se de executar uma acção no final de tudo, quer exista erro ou não. Este finally é opcional e quanto ao catch podemos usar quantos quisermos, para cada tipo de erro especifico ou erros em geral. Seguindo com um exemplo&#8230; <span id="more-884"></span></p>
<p>Vejam o código:<br />
[coolcode]<br />
var pops:int=systemManager.numChildren;<br />
var x:int=1;</p>
<p> while(pops &gt; x){<br />
  try {<br />
   PopUpManager.removePopUp((systemManager.getChildAt(x) as IFlexDisplayObject));<br />
   pops=systemManager.numChildren;<br />
  }<br />
  catch(e:Error) {<br />
   trace(&#8220;Error: &#8220;+e.message);<br />
   pops=systemManager.numChildren;<br />
   x++;<br />
  }<br />
  finally {<br />
   trace(&#8220;Child encontrado : &#8220;+systemManager.getChildAt(x).name);<br />
  }<br />
}<br />
[/coolcode] </p>
<p>Como vos disse, o finally não é necessário, mas podemos coloca-lo como mostra em cima. Aproveitei para vos fornecer este código porque é muito util, no meu caso a minha aplicação apenas trabalha com popUpWindows, que juntamente com o &#8220;stage&#8221; principal são as unicas adicionadas como childs ao systemManager, logo a display list do system manager é composta por:</p>
<blockquote><p>[0] -&gt; Stage</p>
<p>[1]-&gt; popUpXXX0</p>
<p>[2]-&gt; popUpXXX1</p></blockquote>
<p>Por isso eu ter indicado <strong>while(systemManager.numChildren &gt; x) onde o x=1 </strong>, visto que se indicasse com o &#8230;systemManager.getChildAt(<strong>x</strong>)  <strong>onde o x fosse 0</strong>  ele não conseguiria tratar esse child (stage) como iFlexDisplayObject (ou seja, não é um popUp) logo o PopUpManager não o iria remover<strong> mas estranhamente também não disparava qualquer erro </strong>, logo o <strong>systemManager.numChildren</strong> é sempre superior a <strong>0</strong>  que faria com que o while fosse executado eternamente resultando num crash  do flash.</p>
<p>Este código apenas funciona com popUps (IFlexDisplayObject) pelo que devem ter em especial atençao a utilização do mesmo que como indiquei em cima resulta num crash do flash no caso de tentarem remover o que não devem&#8230;se existir um erro ao remover algo que não devem, ele simplesmente assume que o child que existe não pode ser removido, incrementado então o x visto que se não o fizer o ciclo será executado eternamente.</p>
<p> </p>
<p>Este try, catch, finally é muito util principalmente para lidar com os erros, prevendo assim eventuais falhas na aplicação. O try pode ainda suportar varios tipos de catch como disse en cima, por exemplo:</p>
<p>[coolcode]<br />
var meuLoader:URLLoader;<br />
 try{<br />
  meuLoader= new URLLoader(new URLRequest(&#8220;meuFicheiro.txt&#8221;));<br />
 }<br />
 catch(erro:IOError) {<br />
    trace(&#8220;ERRO I/O&#8221;+erro.message);<br />
}<br />
 catch(erro:SecurityError) {<br />
  trace(&#8220;ERRO DE SEGURANCA&#8221;+erro.message);<br />
}<br />
finally{<br />
  trace(&#8216;Erros do loader tratados&#8217;);<br />
}<br />
[/coolcode]<br />
 </p>
<p>Simples não?</p>
<p>Espero que seja util.</p>
<p>Cumprimentos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.msdevstudio.net/2009/03/27/flexas3-truques-dicas-2-try-catch-finally/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

