Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

 
 
Herramientas Buscar en Tema Desplegado
  #2  
Antiguo 16-06-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 24
andres1569 Va por buen camino
Pues, con tu permiso, Lepe, voy a reabrir el hilo.

A raíz de aquel mensaje tuyo, me quedé pensando si la razón de querer mostrar al usuario los números con "punto" para separación decimal tenía que ver con que el usuario de tu programa era algún residente extranjero que quería ver las cantidades "como en su país", pero por otra parte aclarabas que no querías tener que cambiarle la configuración regional a nivel de SO, lo cual me extrañó.

Pensándolo un poco me he acordado de que con la llegada del Euro se ha popularizado el uso de los decimales, y muchos usuarios, sobre todo contables, demandan poder usar el punto del teclado numérico como lo que es, un separador decimal, pero si nuestro control DBAware sólo admite "comas", eso no es posible. Si éste es tu caso, la solución de cambiar el DecimalSeparator deja como efecto secundario el que las cantidades se muestren de forma distinta a lo habitual (es decir, a la americana), aunque consiga dar validez a dicho punto.

De las varias soluciones que pensé para solucionarlo, la que me parece más acertada es la de interceptar la pulsación del punto decimal y transformarlo en una coma. Crear nuevos componentes heredados de los DBAware para controlar esto es "demasiao", más aún cuando habría que redefinir DBGrids, DBEdits ... etc, y no se me ocurre una forma mejor. Así que aquí va lo que tengo implementado:

Código:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if MapearPuntoAComa AND (Msg.message = WM_KEYDOWN) AND 
     (Msg.wParam = VK_DECIMAL) AND (DecimalSeparator = ',') then 
  begin
    Msg.message := WM_CHAR;   // cambiamos el tipo de mensaje
    Msg.wParam := 44;  // si omitimos la línea anterior, aquí sería Msg.wParam := 188;  
    Handled := FALSE;
  end;
end;
Colocamos un TApplicationEvents (a partir de Delphi 5, en Delphi 4 o anterior hay que hacerlo a mano) e interceptamos el evento OnMessage.

Con esto, si tenemos la variable global MapearPuntoAComa a TRUE y se pulsa el . del teclado numérico, transformamos ese mensaje en uno que envía una coma, y asunto resuelto. En este caso he cambiado el tipo de mensaje de WM_KEYDOWN a WM_CHAR, la razón es que así le puedo asignar la coma directamente (ASCII 44). Si dejara el mensaje como WM_KEYDOWN, debería asignar el código ASCII 188, que es la tecla que genera la coma, pero esto sólo valdría para los "teclados españoles".

Si alguien tiene alguna sugerencia sobre este tema, o lo ha resuelto de otro modo, bienvenida sea otra solución, seguro que a casi todos se os ha planteado esta cuestión.
__________________
Guía de Estilo
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:58:01.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi