Fórum mascara de dinheiro.... estilo caixa eletrônico... #262364
16/12/2004
0
alguém sabe como faço uma mascará para quando o usuário vai digitando o valor o mesmo vai sendo automaticamente formatado, estilo os de caixas eletrônicos.
desde já, obrigado.
Balceiro
Curtir tópico
+ 1Post mais votado
21/12/2004
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); var Texto, Texto2: string; i: byte; begin if (Key in [´0´..´9´,chr(vk_back)]) then begin // limito a 23 caracteres senão haverá um erro na função StrToInt64() if (key in [´0´..´9´]) and (Length(Trim(TEdit(Sender).Text))>23) then key := 0; // pego somente os caracteres de 0 a 9, ignorando a pontuação Texto2 := ´0´; Texto := Trim(TEdit(Sender).Text)+Key; for i := 1 to Length(Texto) do if Texto[i] in [´0´..´9´] then Texto2 := Texto2 + Texto[i]; // se foi pressionado BACKSPACE (única tecla válida, fora os números) // apago o último caractere da string if key = chr(vk_back) then Delete(Texto2,Length(Texto2),1); // formato o texto que depois será colocado no Edit Texto2 := FormatFloat(´#,0.00´,StrToInt64(Texto2)/100); // preencho os espaços à esquerda, de modo a deixar o texto // alinhado à direita (gambiarra) repeat Texto2 := ´ ´+Texto2 until Canvas.TextWidth(Texto2) >= TEdit(Sender).Width; // atribuo a string à propriedade Text do Edit TEdit(Sender).Text := Texto2; // posiciono o cursor no fim do texto TEdit(Sender).SelStart := Length(Texto2); end; Key := 0; end; procedure TForm1.Edit1Click(Sender: TObject); begin // retorno o cursor para o final do texto, caso tenha sido utilizado // o mouse para mover o cursor dentro do Edit TEdit(Sender).SelStart := Length(TEdit(Sender).Text); end;
talvez os colegas possam melhorar esse código, mas em princípio creio que atenda à sua necessidade.
Emerson Nascimento
Gostei + 2
Mais Posts
16/12/2004
Jc_analista
Gostei + 0
16/12/2004
Balceiro
Gostei + 0
21/12/2004
Balceiro
Gostei + 0
21/12/2004
Fer_nanda
FormatFloat(´R$ ,0.00´,edit.text);
Até
Gostei + 0
21/12/2004
Balceiro
Gostei + 0
21/12/2004
Renato_sp
15.762,00
como ia ficando? Assim fica mais facil para tentar montar uma function para vc... Valeu
Renato / SP
Gostei + 0
22/12/2004
Balceiro
se eu digitar 1 o edit é preenchido com 0,01
se eu digitar o próximo caracter 5 o edit é preenchido com 0,15
se eu digitar o próximo caracter 5 o edit é preenchido com 1,58
se eu digitar o próximo caracter 7 o edit é preenchido com 15,87
e assim por diante....
Gostei + 0
22/12/2004
Renato_sp
var Form1: TForm1; v1, v2:String; // PRIMEIRO DECLARE ESSAS DUAS VARIAVEIS GLOBAIS // AGORA ESTA A FUNCTION DE FORMATACAO Function FormatarBanco(Valor:String; Quant:Integer):String; begin case Length(Valor) of 0:result:=´´; 1:result:=´0,0´+Valor; 2:result:=´0,´+Valor; 3:result:=FormatMaskText(´0,00;0´, Valor); 4:result:=FormatMaskText(´00,00;0´, Valor); 5:result:=FormatMaskText(´000,00;0´, Valor); 6:result:=FormatMaskText(´0.000,00;0´, Valor); 7:result:=FormatMaskText(´00.000,00;0´, Valor); 8:result:=FormatMaskText(´000.000,00;0´, Valor); end; end; Fiz com somente ate 8 digitos mas a ai é so colocar mais no case, 9, 10 etc e jogar sua mascara como nos anteriores // Aqui no evento Change ( ou seja quando tar escrevendo ) chamo a function que declarei em cima.. vc vai perceber que tem uma variavel sendo dado o valor de outra, isso é para quando digitar o proximo numero, a virgula e o ponto nao dobre ficando um numero inexistente.. algo como 0,,,,15 procedure TForm1.Edit1Change(Sender: TObject); begin v2:=v1; Edit1.text:=FormatarBanco(v2, Length(v2)); end; // Caso é apertado o delete é apagado tudo para que seja refeito o valor procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key=vk_delete then Begin Edit1.clear; v1:=´´; end; end; // Aqui eu atribuo o valor a variavel v1 para que seja jogado depois para o v2 para fazer a formatacao procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin v1:= v1 + key; end;
Embora o codigo possa parecer meio confuso foi uma alternativa para fazer o que vc quer... Qualquer duvida sobre ele me avise que assim que possivel retornarei
Espero ter ajudado
Renato / SP
Gostei + 0
22/12/2004
Paulo_amorim
Fiz uma função para fazer isso, acho que atende:
function Mascara(Texto: String): String;
var
sAux: String;
i, iPos: Integer;
begin
{ Deixa só com os números }
for i := 1 to Length(Texto) do
begin
if not (Texto[i] in [´0´..´9´]) then
Delete(Texto,i,1);
end;
{ Completar com ´0´ para deixar tamanho correto }
sAux := StringOfChar(´0´,11 - Length(Texto)) + Texto;
sAux := FormatMaskText(´000.000.000,00;0´,sAux);
{ Mostrar somente a parte relevante }
iPos := 1;
for i := 1 to Length(sAux) do
begin
if sAux[i] = ´,´ then
begin
iPos := i -1;
Break;
end;
if not (sAux[i] in [´0´,´.´]) then
begin
iPos := i;
Break;
end;
end;
Result := Copy(sAux,iPos,Length(sAux) );
end;Coloque esse código no OnChange do seu Edit...
Para deixar mais dinâmico, inclua a linha
Edit.SelStart := Length(Edit);
Espero que ajude
Até+
Gostei + 0
22/12/2004
Tinorj
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (Key in [´0´..´9´, 8]) then Key := 0; end; procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); function StrTran(pVariavel, pVelho, pNovo: String): String; var NovoTexto, Texto: String; PosIni, TamTexto, TamVelho: Integer; begin Texto := pVariavel; while Pos(pVelho, Texto) > 0 do begin PosIni := Pos(pVelho, Texto); TamTexto := Length(Texto); TamVelho := Length(pVelho); if PosIni = 1 then NovoTexto := pNovo+Copy(Texto, PosIni+TamVelho, TamTexto-TamVelho) else if PosIni = TamTexto then NovoTexto := Copy(Texto, 1, TamTexto-TamVelho)+pNovo else NovoTexto := Copy(Texto, 1, PosIni-1)+pNovo+Copy(Texto, PosIni+TamVelho, TamTexto-PosIni+TamVelho-1); Texto := NovoTexto; end; Result := Texto; end; var Valor: Currency; Apoio: String; begin Valor := 0.00; if TEdit(Sender).Text <> ´´ then try Apoio := TEdit(Sender).Text; Apoio := StrTran(Apoio, CurrencyString, ´´); Apoio := StrTran(Apoio, ThousandSeparator, ´´); Apoio := StrTran(Apoio, DecimalSeparator, ´´); Apoio := StrTran(Apoio, ´ ´, ´´); Valor := StrToCurr(Apoio) / 100; except Valor := 0.00; end; TEdit(Sender).Text := FormatCurr(CurrencyString + ´ #,0.00´, Valor); if TEdit(Sender).SelLength = 0 then TEdit(Sender).SelStart := Length(TEdit(Sender).Text); end;
Gostei + 0
22/12/2004
Balceiro
na verdade eu e o emerson.en quebramos a cabeça e fizemos (quer dizer) alteramos um componete para que ele fizesse isso... e funcionou perfeitamente, se quiser me mande um e-mail ou entre em contato pelo msn quilezi@hotmail.com que eu envio o componente.
até mais.
Gostei + 0
23/12/2004
Aldus
Caso tenham alguma sugestão, postem aqui, pois pela quantidade de visitas, deu pra notar que é um tópico muito interessate e esclarecedor.
Um grande abraço
Mario
Gostei + 0
28/06/2005
Dpinho
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); var Texto, Texto2: string; i: byte; begin if (Key in [´0´..´9´,chr(vk_back)]) then begin // limito a 23 caracteres senão haverá um erro na função StrToInt64() if (key in [´0´..´9´]) and (Length(Trim(TEdit(Sender).Text))>23) then key := 0; // pego somente os caracteres de 0 a 9, ignorando a pontuação Texto2 := ´0´; Texto := Trim(TEdit(Sender).Text)+Key; for i := 1 to Length(Texto) do if Texto[i] in [´0´..´9´] then Texto2 := Texto2 + Texto[i]; // se foi pressionado BACKSPACE (única tecla válida, fora os números) // apago o último caractere da string if key = chr(vk_back) then Delete(Texto2,Length(Texto2),1); // formato o texto que depois será colocado no Edit Texto2 := FormatFloat(´#,0.00´,StrToInt64(Texto2)/100); // preencho os espaços à esquerda, de modo a deixar o texto // alinhado à direita (gambiarra) repeat Texto2 := ´ ´+Texto2 until Canvas.TextWidth(Texto2) >= TEdit(Sender).Width; // atribuo a string à propriedade Text do Edit TEdit(Sender).Text := Texto2; // posiciono o cursor no fim do texto TEdit(Sender).SelStart := Length(Texto2); end; Key := 0; end; procedure TForm1.Edit1Click(Sender: TObject); begin // retorno o cursor para o final do texto, caso tenha sido utilizado // o mouse para mover o cursor dentro do Edit TEdit(Sender).SelStart := Length(TEdit(Sender).Text); end;
Amigos, Estou precisando utilizar esta rotina em um DBEdit, e preciso que quando for precionado a tecla enter ou tab salte pra o proximo DBedit
Alguem poderia ajudar
Gostei + 0
28/06/2005
Emerson Nascimento
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); var Texto, Texto2: string; i: byte; begin if (Key in [´0´..´9´,chr(vk_back)]) then begin // limito a 23 caracteres senão haverá um erro na função StrToInt64() if (key in [´0´..´9´]) and (Length(Trim(TEdit(Sender).Text))>23) then key := 0; // pego somente os caracteres de 0 a 9, ignorando a pontuação Texto2 := ´0´; Texto := Trim(TEdit(Sender).Text)+Key; for i := 1 to Length(Texto) do if Texto[i] in [´0´..´9´] then Texto2 := Texto2 + Texto[i]; // se foi pressionado BACKSPACE (única tecla válida, fora os números) // apago o último caractere da string if key = chr(vk_back) then Delete(Texto2,Length(Texto2),1); // formato o texto que depois será colocado no Edit Texto2 := FormatFloat(´#,0.00´,StrToInt64(Texto2)/100); // preencho os espaços à esquerda, de modo a deixar o texto // alinhado à direita (gambiarra) repeat Texto2 := ´ ´+Texto2 until Canvas.TextWidth(Texto2) >= TEdit(Sender).Width; // atribuo a string à propriedade Text do Edit TEdit(Sender).Text := Texto2; // posiciono o cursor no fim do texto TEdit(Sender).SelStart := Length(Texto2); end else if ord(key) <> VK_RETURN then Key := 0; end; procedure TForm1.Edit1Click(Sender: TObject); begin // retorno o cursor para o final do texto, caso tenha sido utilizado // o mouse para mover o cursor dentro do Edit TEdit(Sender).SelStart := Length(TEdit(Sender).Text); end;
Gostei + 0
15/07/2005
Anderson_blumenau
function Mascara(Texto: String): String;
var
sAux: String;
i, iPos: Integer;
begin
{ Deixa só com os números }
for i := 1 to Length(Texto) do
begin
if not (Texto[i] in [´0´..´9´]) then
Delete(Texto,i,1);
end;
{ Completar com ´0´ para deixar tamanho correto }
sAux := StringOfChar(´0´,11 - Length(Texto)) + Texto;
sAux := FormatMaskText(´000.000.000,00;0´,sAux);
{ Mostrar somente a parte relevante }
iPos := 1;
for i := 1 to Length(sAux) do
begin
if sAux[i] = ´,´ then
begin
iPos := i -1;
Break;
end;
if not (sAux[i] in [´0´,´.´]) then
begin
iPos := i;
Break;
end;
end;
Result := Copy(sAux,iPos,Length(sAux) );
end;Edit.SelStart := Length(Edit);
eh preciso alguma biblioteca extra?
FormatMaskText aparece indeficador nao declarado
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)