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…e de tipos diferentes!
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:
dg.addEventListener(MouseEvent.MOUSE_WHEEL onMouseWheel);
dg.addEventListener(MouseEvent.ROLL_OVER, onRollOver);
dg.addEventListener(MouseEvent.ROLL_OUT, onRollOut);
O que neste caso teriamos que usar 4 funções diferentes: onClick, onDoubleClick, onRollOver, onRollOut do estilo:
private function onMouseWheel(evt:MouseEvent):void { }
private function onRollOver(evt:MouseEvent):void { }
private function onRollOut(evt:MouseEvent):void { }
É 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:
dg.addEventListener(MouseEvent.MOUSE_WHEEL, onDGMouse);
dg.addEventListener(MouseEvent.ROLL_OVER, onDGMouse);
dg.addEventListener(MouseEvent.ROLL_OUT, onDGMouse);
e construir apenas uma função em vez de 4, fazend o uso de comparação do tipo de evento:
switch(evt.type) {
case MouseEvent.CLICK:
trace("Evento click: "+evt.type);
break;
case MouseEvent.MOUSE_WHEEL:
trace("Evento roda do rato: "+evt.type);
break;
case MouseEvent.ROLL_OVER:
trace("Evento Roll Over: "+evt.type);
break;
case MouseEvent.ROLL_OUT:
trace("Evento Roll Out: "+evt.type);
break;
default:
Alert.show("Evento detectado, nenhuma função associada!: "+evt.type);
break;
}
}
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ó… se mudarmos a declaração da função de
para
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 “handler” 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’s ou DataGridEvent’s:
switch(evt.type) {
case MouseEvent.CLICK:
trace("Evento click: "+evt.type);
break;
case MouseEvent.MOUSE_WHEEL:
trace("Evento roda do rato: "+evt.type);
break;
case MouseEvent.ROLL_OVER:
trace("Evento Roll Over: "+evt.type);
break;
case MouseEvent.ROLL_OUT:
trace("Evento Roll Out: "+evt.type);
break;
case DataGridEvent.COLUMN_STRETCH:
trace("Evento DG :"+evt.type);
break;
case DragEvent.DRAG_ENTER:
trace("Evento DRAG :"+evt.type);
break;
default:
Alert.show("Evento "+evt.type+"detectado, nenhuma instrução associada!: ");
break;
}
}
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 “event handle”:
dg.addEventListener(DataGridEvent.COLUMN_STRETCH, onDGMouse);
dg.addEventListener(DragEvent.DRAG_ENTER, onDGMouse);
Como devem imaginar, pode ser, e é, muito util!!
Abraço.




3 Comentários
o seria do flex se não fosse santos como você, Obrigado por mais essa dica, a partir de hoje sempre vou fazer assim.
parabens , obrigado
Ótimo artigo.
Porém, podemos prover uma assinatura padrão para eventos utilizando a classe genérica para eventos flash.events.Event ao invés de “*”.
O que torna um método fortemente tipado, reduzindo a utilização de closures.