Arquivo

Archive for the ‘Flex’ Category

Acrescentando quebra de linha em um campo CLOB

Esse método realiza a transformação de um campo CLOB do banco ORACLE e retorna um campo CLOB com quebra de linha.


public static function parserClob(texto: String): String 
{			  
	var tipoTexto: String = "N";
	  
	while (texto.indexOf("\t") > -1) 
	{
		tipoTexto = "S";
		break;
	}			  
	if (tipoTexto == "S")
	{		 
		while (texto.indexOf("\t") > -1) {
			texto = texto.replace("\t", "\r");
		}			  
	}else{
		 while (texto.indexOf("\r") > -1) {
			texto = texto.replace("\r", "\t");
		 }
	}
	return texto;
}
Categorias:Flex Tags:,

Calcular idade completa com Flex

Bueno, Essa função recebe como parâmetro uma data de nascimento e retorna uma String com o ano, mes e dia. A função foi feita validando o resultado no site http://www.timeanddate.com


public static function calcularIdadeCompleta(niver:Date, hoje:Date = null):String
{
	if (!hoje)
	{
		hoje = new Date();
	}

	var idade:String;

	var dias:Number;
	var meses:Number;
	var anos:Number;

	// Já fez aniversário
	if (hoje.getMonth() > niver.getMonth())
	{
		anos = hoje.getFullYear() - niver.getFullYear();

		if (hoje.getDate() < niver.getDate())
		{
			/* remove 1 mês, porque no mês corrente ainda
			 não ultrapassou o dia da data de aniversário */
			meses = hoje.getMonth() - niver.getMonth() - 1;

			// a soma dos dias ultrapassados após o dia da data de aniversário
			dias = hoje.getDate() + (31 - niver.getDate());
		}
		else
		{
			meses = hoje.getMonth() - niver.getMonth();
			dias = hoje.getDate() - niver.getDate();
		}
	}
	else if (hoje.getMonth() < niver.getMonth())
	{
		// remove 1 ano porque ainda não fez aniversário
		anos = hoje.getFullYear() - niver.getFullYear() - 1;

		if (hoje.getDate() < niver.getDate())
		{
			meses = hoje.getMonth();

			// a soma dos dias ultrapassados após o dia da data de aniversário
			dias = hoje.getDate() + (31 - niver.getDate());
		}
		else
		{
			// adiciona 1 mês porque já passou do dia da data de aniversário
			meses = hoje.getMonth() + 1;
			dias = hoje.getDate() - niver.getDate();
		}
	}
	else if (hoje.getMonth() == niver.getMonth())
	{
		if (hoje.getDate() < niver.getDate())
		{
			// remove 1 ano porque ainda não fez aniversário
			anos = hoje.getFullYear() - niver.getFullYear() - 1;
			meses = hoje.getMonth() + 1;
			// a soma dos dias ultrapassados após o dia da data de aniversário
			dias = hoje.getDate() + (31 - niver.getDate());
		}
		else
		{
			anos = hoje.getFullYear() - niver.getFullYear();
			meses = hoje.getMonth() - niver.getMonth();
			dias = hoje.getDate() - niver.getDate();
		}
	}
	idade = anos + "a " + meses + "m " + dias + "d ";
	return idade;
}


Abraço.

Categorias:Flex Tags:, ,

Transformando RGB para Decimal

Conforme solicitado por e-mail segue a baixo outro exemplo de “cast” de RGB mas agora transformandoo em Decimal, no post anterior tem o exemplo para transformar RGB para Hexadecimal.


public static function rgbDecimal(cp:ColorPicker):String
{
	var input:String = rgbHexaDecimal(cp);
	input = input.substring(input.length - 6, input.length);
	var rgbDecimal:String = "";
	var r:int;
	var g:int;
	var b:int;

	for(var i:int = 0; i < input.length; i++)
	{
		r = parseInt(input.charAt(i), 16);
		i++;
		g = parseInt(input.charAt(i), 16)
		b = (r * 16) + (g * 1);
		rgbDecimal += new String(b) + ",";
	}
	rgbDecimal = rgbDecimal.substring(0, rgbDecimal.length - 1);

	return rgbDecimal;
}

Abraços.

Categorias:Flex Tags:, , , ,

Transformando RGB para Hexadecimal

Bueno, para salvar uma cor no banco normalmente se utiliza uma string no formato RGB, e na aplicação é necessário que essa informação esteja em formato Hexadecimal para ser utilizada, portanto fiz essa função que recebe como parâmetro uma string com o código em RGB e transforma em Hexadecimal.
Exemplo: Formato RGB = “r255g255b255” transforma em Hexadecinal “#ffffff”.


public static function rgbToHex(str:String):String
{
	if (str == null)
	{
		return "";
	}
	var r:Number, g:Number, b:Number = 0;
	var regExp:RegExp = /[rgb]/g;
	var match:String;
	while((match = regExp.exec(str)) != null)
	{
		var s:String = "";
		for (var i:Number = regExp.lastIndex; i  -1)
                {
			var char:String = str.charAt(i);
                        if (char.search("[0-9]") > -1){
				s += char;
			} else {
				break;
			}
		}
		if (match == "r")
		{
			r = new Number(s);
		} else if (match == "g")
		{
			g = new Number(s);
		} else
		{
			b = new Number(s);
		}
	}
	return "#" + toHex(r) + toHex(g) + toHex(b);
}

Flw.

Categorias:Flex Tags:, , , ,

Componentes básicos do Flex

Mas tchêêê…

Pessoal, quando tiverem duvidas de como usar alguns dos componentes Flex ai vai um link que contém exemplos básicos.

http://examples.adobe.com/flex3/componentexplorer/explorer.html

Caso não acharem nada que estão procurando ai é só pedir para o pai Google ou me mandar email.
Abraço galeraa.

Categorias:Flex Tags:

Benchmark de Desempenho Flex / ActionScript 3

Arrays e ArrayCollections

Utilizar [ ] ao invés de new na criação de Arrays


// versão lenta: 126ms
var a:Array = new Array();

// versao otimizada: 56ms (125% mais rápido)
var a:Array = [];

Maneira mais rápida para copiar um Array


var copy:Array = array.concat();

Evitar operações em de inserção e remoção em ArrayCollections quando for possível utilizar Array


// versão lenta: 28117ms
var a:ArrayCollection = new ArrayCollection();
for (var i:int = 0; i < 10; i++)
{
    a.addItem(1);
}
                
var l:int = a.length;
for (i = 0; i < l; i++)
{
    a.removeItemAt(l - 1 - i);
}

// versão otimizada: 374ms (7418% mais rápido)
var a:Array = [];
for (var i:int = 0; i < 10; i++)
{
    a.push(1);
}
                
var l:int = a.length;
for (i = 0; i < l; i++)
{
    a.pop();
}

Utilizar a propriedade //source// do ArrayCollection no lugar do método //toArray()// quando não for necessária uma cópia do conteúdo


// versão lenta: 234ms
var a:Array = arrayCollection.toArray();

// versão rápida: 116ms (102% mais rápido)
 var a:Array = arrayCollection.source;

Loops

Salvar o tamanho do array/collection antes de iterar


// Com Array

// versão lenta: 435ms
for (var i:int = 0; i < array.length; i++)
{
    var a:int = array[i];
    var b:int = a;
}

// versão mediana: 304ms (44% mais rápido)
var l:int = array.length;
for (var i:int = 0; i < l; i++)
{
    var a:int = array[i];
    var b:int = a;
}

// versão otimizada: 254ms (72% mais rápido)
for each (var a:int in array)
{
    var b:int = a;
}

// com ArrayCollection

// versão lenta: 10094ms
for each (var a:int in arrayCollection)
{
    var b:int = a;
}

// versão mediana: 9000ms (13% mais rápido)
for (var i:int = 0; i < arrayCollection.length; i++)
{
    var a:int = int(arrayCollection.getItemAt(i));
    var b:int = a;
}

// versão otimizada: 6530ms (56% mais rápido)
var l:int = arrayCollection.length;
for (var i:int = 0; i < l; i++)
{
    var a:int = int(arrayCollection.getItemAt(i));
    var b:int = a;
}

Não fazer calculos repetidos em loops


// versão lenta: 536ms
for (var i:int = 0; i < 50; i++)
{
    var a:Number = 100 * 180 / Math.PI;
}
                
// versão otimizada: 339ms (58% mais rápido)
var toRad:Number = 180 / Math.PI;
for (var i:int = 0; i < 50; i++)
{
    var a:Number = 100 * toRad;
}


Não fazer acesso a propriedados ou constantes em loops


// versão lenta: 654ms
for (var i:int = 0; i < 100; i++)
{
    var a:int = i + myInt;
}

// versão otimizada: 613ms (7% mais rápido)
var localInt:int = myInt;
for (var i:int = 0; i < 100; i++)
{
    var a:int = i + localInt;
}

Condicionais

Utilizar //if/else// no lugar de //try/catch//


// versão lenta: 1207ms
var s:String = null;
                
try
{
    s = nullBean.myName2;
}
catch (e:Error)
{
    s = "default";
}

// versão rápida: 35ms (3349% mais rápido)
var s:String = null;
                
if (nullBean != null)
{
    s = nullBean.myName2;
}
else
{
    s = "default";
}

Para comparação de inteiros utilizar switch/case no lugar de if/else


// versão lenta: 54ms
var s:int = 0;
                
if (s == 1)
{
}
else if (s == 2)
{
}
else if (s == 3)
{
}
else
{
    var i:int = 0;
}

// versão rápida: 49ms (10% mais rápido)
var s:int = 0;
switch (s)
{
    case 1:
    break;
                    
    case 2:
    break;
                    
    case 3:
    break;
                    
    default:
        var i:int = 0;
    break;
}

UI

Evitar Repeaters

Evitar chamadas ao setStyle()

Usar o mínimo de containers possível

Utilizar posicionamento e dimensionamento absoluto sempre que possível

Utilizar //visible=false// no lugar de //alpha = 0//

Outros

Não usar new para criar Object


// versão lenta: 63ms
var o:Object = new Object();

// versão otimizada: 55ms (15% mais rápido)
var o:Object = {};

Criar método de reflexao próprio


// versão lenta: 164ms
var c:Class = Class(getDefinitionByName(getQualifiedClassName(myBean)));

// versão otimizada: 45ms (264% mais rápido)
public class MyBean {
  public function getClass():Class {
    return MyBean;
  }
}
...
var c:Class = myBean.getClass();

Utilizar atributos públicos no lugar de get/set nos VOs


// versão lenta: 64ms
public class MyBean {
  private var _myName:String;

  public function get myName():String {
    return _myName;
  }

  public function set myName(value:String):void
  {
    _myName = value;
  }
}
...
myBean.myName = "Alison";
var a:String =  myBean.myName;

// versão otimizada: 32ms (100% mais rápido)
public class MyBean {
  public var myName:String;
}
...
myBean.myName = "Alison";
var a:String =  myBean.myName;

Utilizar objetos tipados ao invés de Object (ou classes dynamic) quando for necessário acessar métodos ou atributos, visto que o Object tem que procurar se a propriedade/método existe.


// versão lenta: 63ms
var o:Object = array;
var l:int = o.lenght;

//versão rápida: 61ms (4% mais rápido)
var o:Array = array;
var l:int = o.lenght;


Referências

http://www.insideria.com/2009/04/51-actionscript-30-and-flex-op.html

http://www.rozengain.com/blog/2007/05/01/some-actionscript-30-optimizations/

http://www.lostinactionscript.com/blog/index.php/2008/09/28/tips-on-how-to-write-efficient-as3/

http://www.danielhai.com/blog/?p=55

http://www.adobe.com/livedocs/flashlite/2/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000089.html

Categorias:Desempenho, Flex Tags:,

Usando o método addEventListener()

public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void

Parâmetros
type:String — O tipo de evento.

listener:Function — É a funçaõ que vai escutar o evento. Esta função deve aceitar um objeto event como seu único parâmetro e não deve retornar nada, como mostra este exemplo:

private function teste(event:Event):void
A função pode ter qualquer nome.

useCapture:Boolean (default = false) — Determina se o ouvinte trabalha na fase de captura ou nas fases de destino e bubbling. Se useCapture for definido como true, o ouvinte processará o evento apenas durante a fase de captura e não na fase de destino nem de bubbling. Se useCapture for false, o ouvinte processará o evento apenas durante a fase de destino ou de bubbling. Para ouvir o evento em todas as três fases, chame o addEventListener() duas vezes, uma vez com o useCapture definido como true, e novamente, com o useCapture definido como false.

priority:int (default = 0) — O nível de prioridade do ouvinte de evento. Prioridades são designadas por um número inteiro de 32 bits. Quanto mais alto o número, maior a prioridade. Todos os ouvintes com prioridade n são processados antes dos ouvintes com prioridade n-1. Se dois ou mais ouvintes compartilham a mesma prioridade, eles são processados pela ordem segundo a qual foram adicionados. A prioridade padrão é 0.

useWeakReference:Boolean (default = false) — Determina se a referência ao ouvinte é forte ou fraca. Uma referência forte (a padrão) impede que o ouvinte seja coletado como lixo. Uma referência fraca não impede.

Funções de membro de nível de classe não estão sujeitas à coleta de lixo, portanto, você pode definir useWeakReference como true para funções de membro de nível de classe sem sujeitá-las à coleta de lixo. Se você definir useWeakReference como true para um ouvinte que seja uma função interna aninhada, a função será sujeita à coleta de lixo e não mais será persistente. Se você cria referências à função interna (salve-a em outra variável), então ela não é sujeita à coleta de lixo e permanece persistente.

Fonte: http://help.adobe.com/pt_BR/AS3LCR/Flash_10.0/flash/events/IEventDispatcher.html

Bueno tchê, vou voltar para a aula de ética agora, flw pessoal.

Categorias:Flex Tags: