quantidade de digitos antes da virgula

Delphi

12/04/2018

Boa tarde a todos!

Tenho um problema a resolver e não estou dando conta mesmo.
seguinte:
tenho um campo na tabela que é decimal (7,4), porem se o usuário digitar uma sequencia maior q a quantidade de 8 números sem digitar a vírgula apresenta esta mensagem: Number is out of range.
Sei que é por ter ultrapassado a quantidade de 7 casas antes da vírgula, porem como faço para apresentar uma mensagem amigável? tentei no onvalidate do tfield e não consegui capturar este erro, alguém pode me ajudar, ou se tiver alguma ideia.
no displayformat estou usando ###.##0,000
Obrigado
Marcos

Marcos

Curtidas 0

Melhor post

Willian Silva

Willian Silva

13/04/2018

Bom dia, Marcos poderia está tentando usa um try catch não sei se tem essa forma de tratamento de exceção mais vale a pena da uma pesquisada.
GOSTEI 1

Mais Respostas

Luiz Vichiatto

Luiz Vichiatto

12/04/2018

Marcos,
Você pode utilizar o onKeyPress do componente para contar o número de itens, já fiz este tipo de tratamento, porém limitei o tamanho da entrada do campo, não contando virgulas.
Se estiver utilizando algum componente do tipo DataControl, experimente setar o MaxValue (caso tenha) ou MaxLength
Também pode tratar com try ... exception... end;

GOSTEI 0
Marcos

Marcos

12/04/2018

Bom dia, Marcos poderia está tentando usa um try catch não sei se tem essa forma de tratamento de exceção mais vale a pena da uma pesquisada.

WSilva, obrigado por estar me ajudando, o problema é que não funciona, estou usando direto no DBEDIT, e o que faz esta validação é o onvalidate do tfield, preciso saber como tratar o onvalidate. ex:

procedure TDATA_empresa.CDS_produtoPesoValidate(Sender: TField);
begin
if Sender.AsFloat > 50 then
raise Exception.Create('Não permitido peso maior que 50');
end;

mas não quero testar o valor em si, mas o número de dígitos permitidos, no caso os 7 dígitos antes da vírgula, o delphi mostra uma tela de erro, quero que apresente algo em português.
GOSTEI 0
Marcos

Marcos

12/04/2018

Marcos,
Você pode utilizar o onKeyPress do componente para contar o número de itens, já fiz este tipo de tratamento, porém limitei o tamanho da entrada do campo, não contando virgulas.
Se estiver utilizando algum componente do tipo DataControl, experimente setar o MaxValue (caso tenha) ou MaxLength
Também pode tratar com try ... exception... end;

boa tarde Luiz, obrigado por ajudar, o try não funciona pois esta dentro de uma validação do TField, o Maxvalue, também não deu, ele acusa que passou do valor x, mas quando há excesso de dígitos apresenta o erro, agora a ideia do onkeypress ainda não testei, tem como me passar um exemplo por favor?
GOSTEI 0
Raimundo Pereira

Raimundo Pereira

12/04/2018

Boa tarde.
Veja se ajuda na sua validação:
uses StrUtils;

Function Extrair_Antes_Virgula(Origem:string):string;
var
a, b : integer;
begin
a := length(Origem);
b := pos(',', Origem);
Result := Trim(copy(Origem, 1, b - 1));
end;

Function Valida_Quantidade_Prefixo(Origem:string; Max:integer):Boolean;
begin
   if Length(Origem)<8 then
   begin
   Result:=true;
   end
   else
   begin
   Result:=false;
end;
end;




procedure TForm1.Button1Click(Sender: TObject);
begin

if Valida_Quantidade_Prefixo(Extrair_Antes_Virgula(Edit1.Text),7)=true then
begin
ShowMessage('OK - Possui exatamente '+IntToStr(Length(Extrair_Antes_Virgula(Edit1.Text)))+' Dig');
end
else
begin
ShowMessage('ops - Possui exatamente '+IntToStr(Length(Extrair_Antes_Virgula(Edit1.Text)))+' Dig');
end;


end;
GOSTEI 0
Raimundo Pereira

Raimundo Pereira

12/04/2018

Function Valida_Quantidade_Prefixo(Origem:string; Max:integer):Boolean;
begin
   if Length(Origem)<Max+1 then
   begin
   Result:=true;
   end
   else
   begin
   Result:=false;
end;
GOSTEI 0
Marcos

Marcos

12/04/2018

Boa tarde novamente.

A solução foi usar o ApplicationEvents, e no Events, Exception

if (Screen.ActiveControl = DBEdit9) then // DBEdit9 é o nome do campo que recebe 7,4
begin
ShowMessage('Informe um valor válido!');
DBEdit9.Clear;
DBEdit9.SetFocus;
end;

lembrando que usei no Tfiel
DisplayFormat : ###,##0.000
MaxValue 99999,999

obrigado a todos
GOSTEI 0
POSTAR