Iniciando com O.O, problemas com métodos e a Classe JOptionpane!

23 respostas
manolo

Bom dia pessoal. Galera é o seguinte, estou começando agora ver alguns conceitos relacionados á O.O. Comecei a usar minha primeira classe gráfica (JOptionpane), e pessoal estou quebrando a cabeça para construir um exercício proposto pelo professor.

O problema é basicamente o seguinte, tenho que armazenar o telefone de uma pessoa, e o valor de sua conta. Sendo que depois de informado eu possa informar mais algum valor para o mesmo telefone apenas somando e mostrando no final.

Segue abaixo o código:

import javax.swing.JOptionPane;

public class TesteTelefone {

	public static void main(String[] args) {
		
		String num = JOptionPane.showInputDialog(null, " Informe o Telefone ", " Telefone ", JOptionPane.QUESTION_MESSAGE);
		int telnum = Integer.parseInt(num);
		
		String val = JOptionPane.showInputDialog(null, " Informe a conta ", " Conta ", JOptionPane.QUESTION_MESSAGE);
		double valorConta = Double.parseDouble(val);
		
		if ( telnum == 3 || valorConta == 3){
			JOptionPane.showInputDialog(null, " Obrigado ");
			
		}else{
		
		boolean continua = true;
		
		
		
		Telefone joao = new Telefone(telnum, valorConta);
		
		while(continua){
			
			int x =	JOptionPane.showConfirmDialog(null, " Deseja informar mais algum valor? ", " Valor conta ", JOptionPane.YES_NO_CANCEL_OPTION );
			
			if (x == 1){
				continua = false;
			}else{
				JOptionPane.showInputDialog(" Informe o valor ");
				
			}
		}
		JOptionPane.showMessageDialog(null," O telefone é: " + joao.getNumero() + " A conta será de: " + joao.getValorConta(),
				"Dados Teste", JOptionPane.INFORMATION_MESSAGE);
		}
		
	}

}
public class Telefone {
	
	private int numero;
	private double valorConta;
	
	public Telefone(int infNumero, double infConta){
		numero = infNumero;
		valorConta = infConta;
	}
	
	public int getNumero(){
		return numero;
	}
	
	public double getValorConta(){
		return valorConta;
	}

}

Minha maior dúvida no momento e relacionada logo no inicio do código, pois quando aparece a caixa de dialogo tenho duas opções. "ok", e "cancel", só que quando eu aperto o "cancel", não mostra a mensagem de obrigado e o código não e finalizado!

E minha outra duvida, é de como eu posso criar um método no qual vai somar os valores informados referentes a valor da conta e mostrar a soma no final!

Pessoal espero ter sido claro. Estou tendo muita dificuldade, mesmo dando uma olhada na classe e tudo mais, espero a compreensão de vocês!

E qualquer coisa peço desculpas.

Obrigado. :lol:

23 Respostas

marcelo.bellissimo

Dê uma olhada no console… com certeza está gerando alguma exceção… e com certeza é um NumberFormatException… porquê ocorre isso? Veja:

String num = JOptionPane.showInputDialog(null, " Informe o Telefone ", " Telefone ",JOptionPane.QUESTION_MESSAGE); int telnum = Integer.parseInt(num); // <- aqui ! ops...
Quando você clica no “Cancelar” você recebe um valor null do JOptionPane… ou seja, você está tentando fazer um parseInt(null), e isso vai dar pau… numberFormatException…

M3g4d3th

marcelo.bellissimo:
Dê uma olhada no console… com certeza está gerando alguma exceção… e com certeza é um NumberFormatException… porquê ocorre isso? Veja:

String num = JOptionPane.showInputDialog(null, " Informe o Telefone ", " Telefone ",JOptionPane.QUESTION_MESSAGE); int telnum = Integer.parseInt(num); // <- aqui ! ops...
Quando você clica no “Cancelar” você recebe um valor null do JOptionPane… ou seja, você está tentando fazer um parseInt(null), e isso vai dar pau… numberFormatException…

Tava aprendendo isso ontem na aula aliás!

Será possível a utilização da ferramenta Try/Catch nesse exemplo?

Abraço.

manolo

[b]Legal Marcelo, esta ocorrendo esse problema mesmo. Só não entendi uma coisa, o JOptionpane.QUESTION_MESSAGE retorna 3 e logo ao lado está [0x3]. Qual o significado? Estava achando que 3 se referia a “ok”, e 0 a “cancel”. E como faço para tratar isso?

Abraço.[/b]

manolo

Será que so consigo fazer esse tratamento com o try{}cath?
não teria outra forma? Nem mesmo mudando a logica?

marcelo.bellissimo
manolo:
Será que so consigo fazer esse tratamento com o try{}cath? não teria outra forma? Nem mesmo mudando a logica?

O try/catch pode ser usado, mas geralmente é usado para tratar erros, geralmente, imprevisíveis.

No seu caso, como agora já se sabe que é possível que aquela variável que você está tentando recuperar pelo JOptionPane pode vir nula, ou voce altera a lógica e usa alguns if's pra testar a variável, ou usa o try/catch pra tratar o erro... a escolha é sua, faça o que mais te agrada, ou o que é mais simples pra voce, segundo a sua lógica... não é "obrigatório" usar um ou outro... voce escolhe...

Voce poderia, por exemplo, fazer um loop e verificar sempre se o usuário entrou algum valor válido, caso seja inválido você força o usuário á entrar com o valor novamente, até entrar com um valor válido... algo assim:
String num = null;
		// enquanto a variavel for nula, ou em branco
		while (num == null || num.trim().equals("")){
			try {
				num = JOptionPane.showInputDialog(null, " Informe o Telefone ", " Telefone ",JOptionPane.QUESTION_MESSAGE);
				int telnum = Integer.parseInt(num);
				System.out.println("Conversão realizada com sucesso! Valor: " + telnum);
			} catch (NumberFormatException e) {
				// deu erro na conversao, volta!
				System.out.println("Erro ao converter o numero.");
				num = null;
			} catch (Exception e) {
				// algum outro erro, volta tambem!
				System.out.println(e.getMessage());
				num = null;
			}
		}
		
		System.exit(0);
manolo

[b]Ahhh saquei cara, o problema é que estou tentando fazer sem utilizar o try{}cath, e ta complicado pra caramba. Eu até consegui implementar os métodos que faltavam, mas não consigo tratar quando o usuário aperta o “cancel”, ou o “no”.

Alguém pode me dar uma sugestão?[/b]

Obrigado.

marcelo.bellissimo

Nos JOptionDialog com QuestionMessage, o retorno do Cancel é null
Já no último, que aparece “YES / NO / CANCEL”, o retorno é:
YES=0
NO=1
CANCEL=2

Basta tratar esses valores…

manolo

Legal Marcelo, consegui arrumar as ultimas opções. O problema e o null cara, não faço ideia como posso tratar isso!
Mal consigo colocar ele dentro de um if!

Abraço.

OBS: Cara, valeu pela a ajuda to aprendendo bastante!

M3g4d3th

Cara to tentando solucionar aqui também, mas não gostaria de usar try/catch.

Consegui realmente entender o erro de NumberFormatException

String num = JOptionPane.showInputDialog(null, " Informe o Telefone ",
				" Telefone ", JOptionPane.QUESTION_MESSAGE);
		int telnum = Integer.parseInt(num);

Só não consegui encontrar uma maneira de corrigir direto, e fiz uns testes também inserindo valores com ‘hiféns’ e realmente da erro.

Essa correção com o while é interessante, mas não tem algum substituto para a linha abaixo?

int telnum = Integer.parseInt(num);

Pelo o que eu entendi é nela que está o erro, ou seja, estou tentando transformar uma STRING em INT, e o ‘hifén’ não tem como ser transformado por não ser um número inteiro, correto?

Valeu galera!

marcelo.bellissimo

M3g4d3th:
Cara to tentando solucionar aqui também, mas não gostaria de usar try/catch.

Consegui realmente entender o erro de NumberFormatException

String num = JOptionPane.showInputDialog(null, " Informe o Telefone ",
				" Telefone ", JOptionPane.QUESTION_MESSAGE);
		int telnum = Integer.parseInt(num);

Só não consegui encontrar uma maneira de corrigir direto, e fiz uns testes também inserindo valores com ‘hiféns’ e realmente da erro.

Essa correção com o while é interessante, mas não tem algum substituto para a linha abaixo?

int telnum = Integer.parseInt(num);

Pelo o que eu entendi é nela que está o erro, ou seja, estou tentando transformar uma STRING em INT, e o ‘hifén’ não tem como ser transformado por não ser um número inteiro, correto?

Valeu galera!

Correto… só irá aceitar números inteiros, se fosse um double até aceitaria números com vírgula (ou ponto, dependendo do locale/região da máquina)… pra corrigir isso:

  • ou fazemos um try/catch pra capturar o erro, e retornar uma mensagem pro usuário informando o erro;
  • ou simplesmente não se faz esse parse… aceite o valor do jeito como ele vier…

Não existe um “método” ou alguma outra coisa que resolva o problema… é questão de lógica… você quer transformar a String em número? Então digite um número, senão dá erro… como tratar o erro, é opção sua…

M3g4d3th

marcelo.bellissimo:
M3g4d3th:
Cara to tentando solucionar aqui também, mas não gostaria de usar try/catch.

Consegui realmente entender o erro de NumberFormatException

String num = JOptionPane.showInputDialog(null, " Informe o Telefone ",
				" Telefone ", JOptionPane.QUESTION_MESSAGE);
		int telnum = Integer.parseInt(num);

Só não consegui encontrar uma maneira de corrigir direto, e fiz uns testes também inserindo valores com ‘hiféns’ e realmente da erro.

Essa correção com o while é interessante, mas não tem algum substituto para a linha abaixo?

int telnum = Integer.parseInt(num);

Pelo o que eu entendi é nela que está o erro, ou seja, estou tentando transformar uma STRING em INT, e o ‘hifén’ não tem como ser transformado por não ser um número inteiro, correto?

Valeu galera!

Correto… só irá aceitar números inteiros, se fosse um double até aceitaria números com vírgula (ou ponto, dependendo do locale/região da máquina)… pra corrigir isso:

  • ou fazemos um try/catch pra capturar o erro, e retornar uma mensagem pro usuário informando o erro;
  • ou simplesmente não se faz esse parse… aceite o valor do jeito como ele vier…

Não existe um “método” ou alguma outra coisa que resolva o problema… é questão de lógica… você quer transformar a String em número? Então digite um número, senão dá erro… como tratar o erro, é opção sua…

Entendi, acho que a idéia de while é inteligente, estava ontem fazendo uma tela para logar usuário e tive uma idéia parecida.

Enquanto não for um número válido ele informa, “digite um número válido entre x e xxxx” e a tela limpa e começa de novo. Acho que essa é uma opção interessante.

Valeu

M3g4d3th

Outra coisa,

Eu não entendi essa parte

while (num == null || num.trim().equals("")){

Depois do || tem esse método trim(), não saquei de onde ele veio. Dei uma olhada no JAVADOC e eu ACHO que esse trim() retorna uma cópia da String num, é isso?

marcelo.bellissimo

M3g4d3th:
Outra coisa,

Eu não entendi essa parte

while (num == null || num.trim().equals("")){

Depois do || tem esse método trim(), não saquei de onde ele veio. Dei uma olhada no JAVADOC e eu ACHO que esse trim() retorna uma cópia da String num, é isso?

A variável num é do tipo String… e todo objeto String possui o método trim(), que “corta” as arestas, quer dizer, elimina qualquer espaço em branco nas pontas da String… ou seja, essa instrução serve pra verificar se o usuário entrou acidentalmente (ou deu uma de bobo mesmo… :smiley: ) e encheu o campo de espaços… lógicamente, se você tentar transformar um “espaço” em número, o que vai acontecer? :mrgreen:

Por isso essa verificação…

M3g4d3th

marcelo.bellissimo:
M3g4d3th:
Outra coisa,

Eu não entendi essa parte

while (num == null || num.trim().equals("")){

Depois do || tem esse método trim(), não saquei de onde ele veio. Dei uma olhada no JAVADOC e eu ACHO que esse trim() retorna uma cópia da String num, é isso?

A variável num é do tipo String… e todo objeto String possui o método trim(), que “corta” as arestas, quer dizer, elimina qualquer espaço em branco nas pontas da String… ou seja, essa instrução serve pra verificar se o usuário entrou acidentalmente (ou deu uma de bobo mesmo… :smiley: ) e encheu o campo de espaços… lógicamente, se você tentar transformar um “espaço” em número, o que vai acontecer? :mrgreen:

Por isso essa verificação…

Rs:

Resposta: NumberFormatException

…/

Da hora! Valeu, to aqui quebrando a cabeça.

M3g4d3th

Vamos mais um pouco? rs

import javax.swing.JOptionPane;

public class TesteTelefone {

	public static void main(String[] args) {
		// variáveis
		String num, val, nVal;
		int telnum = 0;
		double valorConta = 0.0;
		double novoVal = 0.0;

		// Adicina número telefone
		try {
			num = JOptionPane.showInputDialog(null,
					" Informe o Telefone - Apenas números ", " Telefone ",
					JOptionPane.QUESTION_MESSAGE);
			telnum = Integer.parseInt(num);
		} catch (NumberFormatException e) {
			JOptionPane.showMessageDialog(null, "Favor digitar apenas números");
			num = null;

		}

		// Adiciona um valor
		try {
			val = JOptionPane.showInputDialog(null,
					" Informe o valor da conta ", " Valor da Conta ",
					JOptionPane.QUESTION_MESSAGE);
			valorConta = Double.parseDouble(val);

		} catch (NumberFormatException e) {
			JOptionPane.showMessageDialog(null, "Digite apenas números");
			val = null;
		}

		// Cancela
		if (telnum == 2 || valorConta == 2 || novoVal == 2) {
			JOptionPane.showMessageDialog(null, " Obrigado ");
			
			// ou
		} else {

			// Variavel local
			boolean continua = true;
			// Cria o objeto tel
			Telefone tel = new Telefone(telnum, valorConta, novoVal);

			while (continua) {
				// Painel questiona se continua a inserir valores
				int x = JOptionPane.showConfirmDialog(null,
						" Deseja informar mais algum valor? ", " Valor conta ",
						JOptionPane.YES_NO_CANCEL_OPTION);
				// Se opçao NO
				if (x == 1) {
					continua = false;
					// Ou se for YES
				} else {

					// Adiciona novo valor
					try {
						nVal = JOptionPane.showInputDialog(null,
								" Informe o novo valor ", "Novo Valor",
								JOptionPane.OK_OPTION);
						novoVal = Double.parseDouble(nVal);
					} catch (NumberFormatException e) {
						JOptionPane.showMessageDialog(null,
								"Digite apenas números");
						val = null;

					}

				}

			}

			// impressão de valores finais
			JOptionPane.showMessageDialog(null, " O telefone é: "
					+ tel.getNumero() + " A conta será de: "
					+ tel.getValorConta() + ", e o novo valor "
					+ tel.getNovoValor(), "Dados Teste",
					JOptionPane.INFORMATION_MESSAGE);
		}

	}
}

Ta ai o seguinte código, to tendo o seguinte problema e eu acho que tem alguma coisa relacionada a hierarquia que to viajando.
Fiz um JOptionPane para adicionar um novo valor, e tem outro JOptionPane que mostra os valores.

// impressão de valores finais
			JOptionPane.showMessageDialog(null, " O telefone é: "
					+ tel.getNumero() + " A conta será de: "
					+ tel.getValorConta() + ", e o novo valor "
					+ tel.getNovoValor(), "Dados Teste",
					JOptionPane.INFORMATION_MESSAGE);

1 - Ele simplesmente não imprime o tel.getNovoValor(); Eu não saquei o porque.

2 - Assim que eu adiciono um novo valor e aperto ok ele volta pra tela perguntando se eu quero adicionar outro valor de novo. Esse problema eu acho que pode ser resolvido com Arrays, adicionando um certo número de informações e depois imprimindo todas elas, estou certo? Tem como dizer ao JPanel de novo valor para simplesmente não voltar a essa tela?

Ae, parece meio confuso, acho que é porque eu comecei com Swing ontem.

Abraço e valeu mesmo.

marcelo.bellissimo
1 - Nesse trecho:
try  {  
                        nVal = JOptionPane.showInputDialog(null,  
                                " Informe o novo valor ", "Novo Valor",  
                                JOptionPane.OK_OPTION);  
                        novoVal = Double.parseDouble(nVal);  // pra onde vai essa variavel ?
                    } catch (NumberFormatException e) {  
                        JOptionPane.showMessageDialog(null,  
                                "Digite apenas números");  
                        val = null;  
  
                    }
Você leu o novo valor mas não armazenou...

2 -Não é esse o comportamento esperado? Do jeito que está escrito o seu código, ele vai realizar isso sempre que a variável continua for true ...

M3g4d3th

Cara, consegui resolver o problema de resolver valor, e claro, se criou muito mais dúvidas, chegou a hora de melhorar o código.

Então, estava conversando com meu professor sobre try/catch e mostrei pra ele esse código, ele me falou que o problema de usar try/catch é que a performance do programa baixa muito.

Ele me passou a seguinte solução, apenas em palavras: “Expressão regular”.

Comecei a pesquisar um monte de coisa de expressão regular, mas sinceramente não entendi como implementar no meu código.

vejam:

//REGEX
		Pattern padrao = Pattern.compile("[0-9]");
		

		// Adicina número telefone
		while(numContinua) {
			
			num = JOptionPane.showInputDialog(null," Informe o Telefone - Apenas números ", " Telefone ",
					JOptionPane.QUESTION_MESSAGE);
			telnum = Integer.parseInt(num);
			
			//Matcher
			Matcher testeNum = padrao.matcher(num);

Ai travei nessa parte, eu cheguei a fazer um -> if (testeNum.find()) {}
Mas pra falar a verdade não tenho idéia do que fazer depois disso.

No caso no //REGEX eu coloquei fora do while pois é um padrão que vou usar para alguns JOptionPane.

Alguém pode dar um auxílio? Valeu!

M3g4d3th

Já consegui.

while (numContinua) {

			num = JOptionPane.showInputDialog(null,
					" Informe o Telefone - Apenas números ", " Telefone ",
					JOptionPane.QUESTION_MESSAGE);

			// Matcher

			Matcher testeNum = padrao.matcher(num);

			if (!testeNum.find()) {
				JOptionPane.showMessageDialog(null,
						"Favor digitar apenas números");
				num = null;
			} else {
				telnum = Integer.parseInt(num);
				numContinua = false; 
			}

		}
M3g4d3th

Só tem um problema!

Esse .find() do matcher localiza, eu gostaria de restringir.

Tem alguma maneira?

Eu tentei usar o .matches() mas nem os números ele está aceitando.

Abraço.

M3g4d3th

Rs, consegui a resposta também.

troquei

Pattern padrao = Pattern.compile("[0-9]");

//por

Pattern padrao = Pattern.compile("\d*");
M3g4d3th

Ae agora sim.

Terminei rs…

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;

public class TesteTelefone {

	public static void main(String[] args) {

		// variáveis
		String num, val, nVal;
		int telnum = 0;
		double valorConta = 0.0;
		double novoVal = 0;
		boolean numContinua = true;
		boolean valContinua = true;
		boolean novoValContinua = true;

		// REGEX
		Pattern padrao = Pattern.compile("\d*");

		// Adicina número telefone
		while (numContinua) {

			num = JOptionPane.showInputDialog(null,
					" Informe o Telefone - Apenas números ", " Telefone ",
					JOptionPane.QUESTION_MESSAGE);

			// Matcher num
			Matcher testeNum = padrao.matcher(num);

			if (!testeNum.matches()) {
				JOptionPane.showMessageDialog(null,
						"Favor digitar apenas números");
				num = null;
			} else {
				telnum = Integer.parseInt(num);
				numContinua = false;
			}

		}

		// Adiciona um valor
		while (valContinua) {
			val = JOptionPane.showInputDialog(null,
					" Informe o valor da conta ", " Valor da Conta ",
					JOptionPane.QUESTION_MESSAGE);

			// Matcher val
			Matcher testeVal = padrao.matcher(val);

			if (!testeVal.find()) {
				JOptionPane.showMessageDialog(null, "Digite apenas números");
				val = null;
			} else {
				valorConta = Double.parseDouble(val);
				valContinua = false;
			}

		}

		// Cancela
		if (telnum == 2 || valorConta == 2 || novoVal == 2) {
			JOptionPane.showMessageDialog(null, " Obrigado ");

			// ou
		} else {

			// Variavel local
			boolean continua = true;

			// Cria o objeto tel
			Telefone tel = new Telefone(telnum, valorConta, novoVal);

			while (continua) {

				// Painel questiona se continua a inserir valores
				int x = JOptionPane.showConfirmDialog(null,
						" Deseja informar mais algum valor? ", " Valor conta ",
						JOptionPane.YES_NO_CANCEL_OPTION);

				// Se opçao NO
				if (x == 1) {
					continua = false;

					// Ou se for YES
				} else {
					while (novoValContinua) {
					nVal = JOptionPane.showInputDialog(null,
							" Informe o novo valor ", "Novo Valor",
							JOptionPane.QUESTION_MESSAGE);

					// Matcher nVal
					Matcher testeNovoValor = padrao.matcher(nVal);

					// Adiciona novo valor
					
						if (!testeNovoValor.matches()) {
							JOptionPane.showMessageDialog(null,
									"Digite apenas números");
							nVal = null;
						} else {
							tel.setNovoValor(Double.parseDouble(nVal));
							continua = false;
							novoValContinua = false;
						}
					}
				}

			}

			// impressão de valores finais
			JOptionPane.showMessageDialog(null, " O telefone é: "
					+ tel.getNumero() + " A conta será de: "
					+ tel.getValorConta() + ", e o novo valor "
					+ tel.getNovoValor(), "Dados Teste",
					JOptionPane.INFORMATION_MESSAGE);
		}

	}
}

e

public class Telefone {
	
	
	//Variaveis
	private int numero;
	private double valorConta, novoValor;
	

	
	//Construtor
	public Telefone(int infNumero, double infConta, double infNovoValor) {
		numero = infNumero;
		valorConta = infConta;
		novoValor = infNovoValor;
	}
	
	
	//Metodos Getters
	public int getNumero() {
		return numero;
	}

	public double getValorConta() {
		return valorConta;
	}
	
	public double getNovoValor() {
		return novoValor;
	}


	public void setNovoValor(double novoValor) {
		this.novoValor = novoValor;
	}

}

Ufa, que ralação. Valeu.

manolo

[b]Caraca M3g4d3th.

Muito bom cara. Não tive tempo para entrar aqui no forúm, mas parece que fico bala o código! :smiley:

Cara, eu so não entendi o lance do REGEX, e o MATCHER! Qual a sua verdadeira finalidade?

Obrigado pela ajuda galera!

Abraços. [/b]

M3g4d3th

manolo:
[b]Caraca M3g4d3th.

Muito bom cara. Não tive tempo para entrar aqui no forúm, mas parece que fico bala o código! :smiley:

Cara, eu so não entendi o lance do REGEX, e o MATCHER! Qual a sua verdadeira finalidade?

Obrigado pela ajuda galera!

Abraços. [/b]

Esse lance do REGEX eu usei para ‘EXPRESSÃO REGULAR’.

Nós estavamos usando o try/catch para tratar a Exception NumberFormatException lembra?
Esse método de try/catch para coisas pequenas diminui a performance da JVM, então procurei outras soluções para o código.

A solução utilizada foi a ‘EXPRESSÃO REGULAR’.
O que eu fiz é tirar os try/catch e definir que apenas números entre 0 e 9 que podem ser inseridos nos campos. Veja aonde eu fiz isso.

// Aqui eu defini com o \d* que só se aceita números. Esse \d* se não me engano é uma convenção de expressão regular, significa qualquer número de 0 a 9.

		Pattern padrao = Pattern.compile("\d*");

//Como usei a expressão regular desde try/catch.

while (numContinua) {

                       //Aqui está o painel.
			num = JOptionPane.showInputDialog(null,
					" Informe o Telefone - Apenas números ", " Telefone ",
					JOptionPane.QUESTION_MESSAGE);

			// Aqui que eu implemento o Pattern que nomiei como padrao. É bom analisar com cuidado essa classe.
			Matcher testeNum = padrao.matcher(num);

                        //Aqui eu verifico com um if se só foi declarado números ou se tem algum caracter diferente de Pattern padrao. 
                        //Foi exatamente aqui que eu acabei com os try/catch rs
			if (!testeNum.matches()) {
				JOptionPane.showMessageDialog(null,
						"Favor digitar apenas números");
				num = null;
			} else {
				telnum = Integer.parseInt(num);
				numContinua = false;
			}

		}

Então, eu não encontrei melhor solução para esse problema, a expressão regular sem dúvida é bem melhor em performance, se alguém souber outra melhor ainda é só falar que eu vou testar.

Valeu.

Criado 13 de abril de 2010
Ultima resposta 15 de abr. de 2010
Respostas 23
Participantes 3