Ver Mensaje Individual
  #1  
Antiguo 15-06-2003
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
Thumbs up dichoso separador decimal

Hola a todos.

He rescatado este mensaje del historico de los foros unicamente con el proposito de "cerrarlo" y aclarar el tema del todo.

En el hilo original preguntaba lo siguiente:
Cita:
Posteado originalmente por Lepe
Holassss.........

El problema que tengo es que no me deja escribir el punto decimal en los controles DBAware de delphi.

al arrancar el programa, pregunto cual es el separador, y me dice que es la coma, así que hago esto:
Código:
   sysutils.CurrencyDecimals:=2; 

   sysutils.decimalseparator:='.'; 

   sysutils.thousandseparator:=',';
Al entrar en un control DB nativo de delphi, pregunto de nuevo cual es el separador decimal, y me responde que es el punto; entonces, ¿Por qué no me deja escribirlo?, unicamente me deja escribir la coma, y por tanto, al salir del control DB, me da el error de que el número con la coma no es un Tfloat válido.
Cita:
Posteado originalmente por andres1569
Hola Lepe:

He investigado un ratito y he llegado a las conclusiones siguientes:

La configuración del BDE no sirve de nada, de hecho ni siquiera afecta al Database Desktop, sino que sigue lo que hayamos definido en la Configuración Regional del Panel de Control, lo mismo que los controles DBAware.

Las propiedades DisplayFormat y EditFormat utilizan "siempre" la coma como indicador de separador de millares, y el punto como separador decimal, por lo que al rellenar estas propiedades le estamos indicando si queremos incluirlos y en el caso del separador decimal en qué posición (nº de decimales), pero "nunca" le estamos indicando qué caracter queremos usar para cada cosa.

La única forma de sobreecribir esas variables de entorno es mediante ThousandSeparator y DecimalSeparator. ¿Qué ocurre? Que al cambiarlas afectan a la visualización, de hecho tú sí ves el punto como separador decimal pero no te deja introducirlo, y la coma sí.

SOLUCION: Urgando en el código te enteras de que los controles DBAware, al comprobar si una tecla es válida llaman al método IsValidChar del campo relacionado TField, ese método comprueba si la tecla está permitida según el tipo de campo (difiere de un Integer a un Float ...) mirando una cadena de caracteres que es inicializada cuando se crea el campo en cuestión y que SÍ mira el DecimalSeparator; lo que ocurre es que cuando se crean estos objetos TField, tú aún no has cambiado esas variables de entorno; por lo tanto los campos que se creen antes de asignar tú por código esta variable se comportarán de forma diferente a los creados después, por ejemplo los que se crean dinámicamente en ejecución. Como solución he creado una unit que hace esto:


Código:
UnitAnticipa; 

interface 

uses SysUtils; 

implementation 

initialization 
  ThousandSeparator  := ','; 
  DecimalSeparator := '.'; 

end;
Ahora en el MainForm declaro esa unit justo detrás de SysUtils y entonces sí me coge esas variables como yo quiero incluso antes de que se creen los controles DBAware (había probado en el OnCreate del form, y poniendo OldCreateOrder a TRUE, pero no funcionaba).

Un saludo

La solución de crear una unit aparte puede ser excesiva, es posible que poniendo lo mismo en la sección Initialization del DataModule principal, o incluso en mismo archivo .dpr ya sirva.

Saludos
Exacto Andres, poniendolo en la inicialización del datamodule ya funciona.
Código:
initialization
  ThousandSeparator  := ',';
  DecimalSeparator := '.';

Esta última es la aclaración que queria hacer

Gracias andres
Responder Con Cita