Formatar edit como float na mão. ajudem
Pessoal,
Estou tentando fazer um Edit se comportar igual a um Dbedit com máscara.
simulação da entrada do teclado:
0,00 ->estado inicial
1,00 ->1º a entrar
15,00 ->2º a entrar
150,00 ->3º a entrar
1.500,00->4º a entrar (o ponto da máscara entra e o cursor anda 1 pos esquerda)
Aí está o problema. O cursor deveria ficar sempre colado do lado esquerdo da vírgula e quando fosse digitado a vírgula, ai sim ele passaria para o lado direito dela. Não consegui fazer de deito nenhum. Por favor me ajudem , uma luz....
A seguir estão os eventos que fiz para a formatação:
procedure TFVenda.EditsKeyPress(Sender: TObject; var Key: Char);
begin
if pos(Key,´0123456789,.´) = 0 then
key := #0;
if Key=13 then
begin
Key:=0;
perform(WM_NEXTDLGCTL,0,0);
end;
//teste para capturar a vírgula
if Key=44 then
EditMessageDlg(´,´,mterror,[mbok],0);
end;
procedure TFVenda.Edit5Change(Sender: TObject);
var
Num : integer;
begin
try
Num := Edit5.SelStart;
Edit5.Text := FormatFloat(´#,,,0.00´,StrToFloat(Edit5.Text));
Edit5.SelStart := Num;
except
end
end;
Obrigada
Estou tentando fazer um Edit se comportar igual a um Dbedit com máscara.
simulação da entrada do teclado:
0,00 ->estado inicial
1,00 ->1º a entrar
15,00 ->2º a entrar
150,00 ->3º a entrar
1.500,00->4º a entrar (o ponto da máscara entra e o cursor anda 1 pos esquerda)
Aí está o problema. O cursor deveria ficar sempre colado do lado esquerdo da vírgula e quando fosse digitado a vírgula, ai sim ele passaria para o lado direito dela. Não consegui fazer de deito nenhum. Por favor me ajudem , uma luz....
A seguir estão os eventos que fiz para a formatação:
procedure TFVenda.EditsKeyPress(Sender: TObject; var Key: Char);
begin
if pos(Key,´0123456789,.´) = 0 then
key := #0;
if Key=13 then
begin
Key:=0;
perform(WM_NEXTDLGCTL,0,0);
end;
//teste para capturar a vírgula
if Key=44 then
EditMessageDlg(´,´,mterror,[mbok],0);
end;
procedure TFVenda.Edit5Change(Sender: TObject);
var
Num : integer;
begin
try
Num := Edit5.SelStart;
Edit5.Text := FormatFloat(´#,,,0.00´,StrToFloat(Edit5.Text));
Edit5.SelStart := Num;
except
end
end;
Obrigada
Angela
Curtidas 0
Respostas
Carlosrm
01/05/2004
Angela,
rapidamente, e sem nenhum compromisso com a elegância e nem com a a fina arte da programação, sugiro:
coloque dois edits no form. O primeiro edit vai armazenar somente a parte inteira do valor. O segundo edit receberá a parte fracionária.
procedure Form1.Edit1KeyPress(...);
if not (key in [´0´..´9´,#8,13]) then
key := 0;
end;
O edit2 deve estar logo após o edit1, na ordem de tabulação.
Assim que for pressionado Tab (ou Enter, se vc especificou assim) no edit1, o foco salta para o edit2.
No edit2 será digitado o valor decimal. Por default pode ser ´00´.
E na saída do edit2 (OnExit) você usa alguma forma de conversão dos
dois edits para montar o número. Por exemplo:
num := strtoint(edit1.text) + (strtofloat(edit2.text) / 100);
Observe que se estiver usando casas decimais, o tipo da variável não
pode ser inteiro. Use, por exemplo, double.
E nenhum dos dois edits pode aceitar vírgula e/ou ponto decimal.
E o número máximo de dígitos no edit1 é 10, ou não converterá para inteiro (dará uma mensagem de erro).
E no evento OnExit do edit2 digite:
procedure TForm1.Edit2Exit(...);
var
num : double;
begin
if (edit2.text < ´00´) then
edit2.text := ´0´;
num := strtoint(edit1.text) + (strtofloat(edit2.text) / 100);
showmessage(formatflot(´#,0.00´,(num));
end;
Desculpe as marretadas. A Receita Federal costumava trabalhar assim: campos separados para a parte inteira e para a parte decimal.
Eu executei e rodou. Se tiver problermas, te mando a unit.
Espero ter ajudado. carlosrm
rapidamente, e sem nenhum compromisso com a elegância e nem com a a fina arte da programação, sugiro:
coloque dois edits no form. O primeiro edit vai armazenar somente a parte inteira do valor. O segundo edit receberá a parte fracionária.
procedure Form1.Edit1KeyPress(...);
if not (key in [´0´..´9´,#8,13]) then
key := 0;
end;
O edit2 deve estar logo após o edit1, na ordem de tabulação.
Assim que for pressionado Tab (ou Enter, se vc especificou assim) no edit1, o foco salta para o edit2.
No edit2 será digitado o valor decimal. Por default pode ser ´00´.
E na saída do edit2 (OnExit) você usa alguma forma de conversão dos
dois edits para montar o número. Por exemplo:
num := strtoint(edit1.text) + (strtofloat(edit2.text) / 100);
Observe que se estiver usando casas decimais, o tipo da variável não
pode ser inteiro. Use, por exemplo, double.
E nenhum dos dois edits pode aceitar vírgula e/ou ponto decimal.
E o número máximo de dígitos no edit1 é 10, ou não converterá para inteiro (dará uma mensagem de erro).
E no evento OnExit do edit2 digite:
procedure TForm1.Edit2Exit(...);
var
num : double;
begin
if (edit2.text < ´00´) then
edit2.text := ´0´;
num := strtoint(edit1.text) + (strtofloat(edit2.text) / 100);
showmessage(formatflot(´#,0.00´,(num));
end;
Desculpe as marretadas. A Receita Federal costumava trabalhar assim: campos separados para a parte inteira e para a parte decimal.
Eu executei e rodou. Se tiver problermas, te mando a unit.
Espero ter ajudado. carlosrm
GOSTEI 0
Fabio.hc
01/05/2004
Tente assim:
- Eu criei uma variavel para armazenar o q esta sendo digitado.
- Uma função para contar os ´.´ da mascara no momento da digitação.
- Codifiquei também o backspace.
- Eu criei uma variavel para armazenar o q esta sendo digitado.
- Uma função para contar os ´.´ da mascara no momento da digitação.
- Codifiquei também o backspace.
var Form1: TForm1; Edt : string; procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char); var indLen:integer; begin if key in [´0´..´9´,´,´] then Edt:=Edt+(key); if Key=13 then perform(WM_NEXTDLGCTL,0,0); if (key=8) then begin indlen:=length(Trim(edt)); edt:=copy(edt,1,indlen-1); end; end; procedure TForm1.Edit5Change(Sender: TObject); begin Edit5.Text := FormatFloat(´,,,0.00´,StrToFloat(edt)); Edit5.SelStart := length(edt)+OccurPos(´.´,Edit5.Text); end; Function OccurPos (T, S : ShortString) : Byte; Var P : Byte; Begin Result := 0; P := Pos (T, S); while P > 0 do begin Inc (Result); S := Copy (S, P + Length (T), 255); P := Pos (T, S); end; end;
GOSTEI 0
Angela
01/05/2004
Pessoal muito obrigada!!!!
Funcionou direitinho...
Funcionou direitinho...
GOSTEI 0