Formatar edit como float na mão. ajudem

Delphi

01/05/2004

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


Angela

Angela

Curtidas 0

Respostas

Carlosrm

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


GOSTEI 0
Fabio.hc

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.

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

Angela

01/05/2004

Pessoal muito obrigada!!!!


Funcionou direitinho...


GOSTEI 0
POSTAR