Tenho observado que vários colegas tem problemas na formatação de campos no estilo moeda. Esta rotina mostra como o campo Edit funciona como nos caixas eletrônicos, ou seja, a digitação vem da direita para a esquerda.
Para isso, insira no seu form um edit e no evento OnKeyPress inclua o seguinte código:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if NOT (Key in ['0'..'9', #8, #9]) then
key := #0;
//Função para posicionar o cursor sempre na direita
Edit1.selstart := Length(Edit1.text);
end;
No evento onChange insira o seguinte código
procedure TForm1.Edit1Change(Sender: TObject);
var
s : string;
v : double;
I : integer;
begin
//1º Passo : se o edit estiver vazio, nada pode ser feito.
If (edit1.Text = emptystr) then
Edit1.Text := '0,00';
//2º Passo : obter o texto do edit, SEM a virgula e SEM o ponto decimal:
s := '';
for I := 1 to length(edit1.Text) do
if (edit1.text[I] in ['0'..'9']) then
s := s + edit1.text[I];
//3º Passo : fazer com que o conteúdo do edit apresente 2 casas decimais:
v := strtofloat(s);
v := (v /100); // para criar 2 casa decimais
//4º Passo : Formata o valor de (V) para aceitar valores do tipo 0,10.
edit1.text := FormatFloat('###,##0.00',v);
edit1.SelStart := 0;
Para isso, insira no seu form um edit e no evento OnKeyPress inclua o seguinte código:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if NOT (Key in ['0'..'9', #8, #9]) then
key := #0;
//Função para posicionar o cursor sempre na direita
Edit1.selstart := Length(Edit1.text);
end;
No evento onChange insira o seguinte código
procedure TForm1.Edit1Change(Sender: TObject);
var
s : string;
v : double;
I : integer;
begin
//1º Passo : se o edit estiver vazio, nada pode ser feito.
If (edit1.Text = emptystr) then
Edit1.Text := '0,00';
//2º Passo : obter o texto do edit, SEM a virgula e SEM o ponto decimal:
s := '';
for I := 1 to length(edit1.Text) do
if (edit1.text[I] in ['0'..'9']) then
s := s + edit1.text[I];
//3º Passo : fazer com que o conteúdo do edit apresente 2 casas decimais:
v := strtofloat(s);
v := (v /100); // para criar 2 casa decimais
//4º Passo : Formata o valor de (V) para aceitar valores do tipo 0,10.
edit1.text := FormatFloat('###,##0.00',v);
edit1.SelStart := 0;
end;
Parabéns, muito bom o seu post, foi difícil achar alguma função que realizasse isso certinho...
ResponderExcluirAinda indico para melhorar o código alterar a propriedade BiDiMode do edit para 'bdRightToLeft' e na ultima linha do seu código onde você faz: edit1.SelStart := 0; troque por edit1.SelStart := Length(Edit1.text);