Limitar entrada de decimais

Delphi

08/04/2008

Estou trabalhando com Firebird 1.5, Delphi 7 e componentes IBX.
Em algumas telas com componentes DataControls (TDBEdit, por exemplo), quero restringir a entrada a 4 casas decimais no maximo. Meu campo na tabela é do tipo Double Precision, mas nao gostaria de trocar para Numeric(12,4) nesse momento, pois tem telas com tratamentos diferentes. Tentei no validate do campo (ClientDataSet) o seguinte codigo:

if (Frac(Sender.AsFloat * 10000) > 0) then
abort;

mas ele não funciona sempre, sendo que as vezes aparece um valor estranho (fracao) depois da funcao FRAC. O que estou fazendo de errado? É um bug do Delphi?
Valeu.


Drf

Drf

Curtidas 0

Respostas

Webjoel

Webjoel

08/04/2008

Olá!

A solução para seu problema é simples e rápida, mas também já tive este problema.

Use as seguintes formatções na propriedade DisplayFormat do ClientDataSet:

* 4 Casas Decimais:

#,0.0000


* 2 Casas Decimais:

,0.00


E dá-lhe F9![/code]


GOSTEI 0
Drf

Drf

08/04/2008

webjoel, obrigado pela ajuda, mas essa configuração ja tenho no meu dataset, mas nao soluciona meu problema, na verdade, é apenas a mascara!
Se a mascara for ´#,0.0000´ e eu entrar com ´0,00001´ ele vai mostrar ´0,0000´ mas internamente estará gravando ´0,00001´ e justamente isso que nao quero, pois quero restringir a gravação e não o modo que é mostrado.
Tem mais alguma dica?
Obrigado.


GOSTEI 0
Ffabiop

Ffabiop

08/04/2008

Dá para forçar o descarte de casas decimais assim:

Valor := Int(valor*10000)/10000;


No caso, vamos deslocar a vírgula 4 casas a direita e descartar o restantes da decimais (int) e depois deslocar a vígula para seu lugar original. Pode fazer isso no onExit do campo ou no beforePost da tabela.


GOSTEI 0
Drf

Drf

08/04/2008

Agradeco a vc tb ffabiop, mas ainda nao é esse o meu problema. É que nao estou conseguindo ser claro.
Esse procedimento ignora as casas ´a mais´, mas na verdade preciso identificar qdo é digitado casas ´a mais´ e tomar uma decisao, e nao apenas ignora-las, por isso tentei com a funcao abaixo mas nao funcionou:

if (Frac(Sender.AsFloat * 10000) > 0) then
abort;

´Abort´ seria apenas um exemplo de uma decisao que poderia ser tomada.

Grato.


GOSTEI 0
Joaoshi

Joaoshi

08/04/2008

Colega, se o problema é quando esta recebendo os valores digitados poderia tentar:

- Atraves da funcao [b:7fb5146ecf]POS[/b:7fb5146ecf] verificar a posição do separador decimal
- A partir dai verificar quantos digitos após o separador decimal pela função [b:7fb5146ecf]LENGTH[/b:7fb5146ecf]

Parece meio gambiarra mas pode ser uma saída.


GOSTEI 0
POSTAR