Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Tecla punto como coma decimal (https://www.clubdelphi.com/foros/showthread.php?t=71024)

Kubelo 25-11-2010 13:56:45

Tecla punto como coma decimal
 
Hola, he buscado en los diferentes hilos que hay pero no he encontrado solución a mi problema.

Mi problema es que necesito que al pulsar tanto la coma como el punto, lo coja como separador decimal. He probado varios ejemplos en el Keypress que a continuación os pongo, pero el punto me lo ignora. Imagino que tendré que modificar algo de la coma decimal o algo de eso, pero no lo domino demasiado.

Estos son los casos que he probado:

Código Delphi [-]
procedure EditKeyPress(Sender: TObject; var Key: Char);
begin
  inherited;
  if ( StrScan('0123456789,.'+chr(7)+chr(8), Key) = nil ) then Key := #0;
end;

Y por otro lado:

Código Delphi [-]
procedure EditKeyPress(Sender: TObject; var Key: Char);
begin
  inherited;
  if not (key in ['0','1','2','3','4','5','6','7','8','9',',','.', #7, #8, #13]) then
  begin
    Key := #0;
    Beep;
  end;
end;

Agradezco vuestra ayuda de antemano! ;)

MAXIUM 25-11-2010 14:08:29

En sistemas Windows, creo que eso se soluciona en Configuración Regional...

Kubelo 25-11-2010 15:37:24

Pero yo lo que quiero es que tanto si al pulsar la coma como al pulsar el punto me ponga la coma decimal, igual no me he explicado bien antes. Es decir, si queréis un ejemplo, que funcione igual que la calculadora de Windows, que tanto si pulsas el punto como la coma se pone la coma decimal.

Gracias de nuevo

Kubelo 25-11-2010 16:06:12

Encontré la solución...

Se trata de jugar con la captura del mensaje y cambiarlo, paso el código:

Declaramos la siguiente función:
Código Delphi [-]
procedure ApplicationMessage(var Msg: TMsg; var Handled: Boolean);

Asignamos la propiedad OnMessage en el evento Create del formulario, por ejemplo:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := ApplicationMessage;
end;

Si queremos dejar de capturar mensajes todo lo que tenemos que hacer es establecer OnMessage en nil:
Código Delphi [-]
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Application.OnMessage := nil;
end;

Finalmente debemos implementar el procedimiento. Por ejemplo, vamos a atrapar los mensajes de teclado WM_KEYUP y WM_KEYDOWN para convertir el punto decimal del teclado numérico en una coma.

Código Delphi [-]
procedure TForm1.ApplicationMessage(var Msg: TMsg;
  var Handled: Boolean);
begin
  case Msg.Message of
  WM_KEYDOWN, WM_KEYUP:
    case Msg.wParam of
    // Reemplazar el punto del teclado numerico (key code = 110)
    // por una coma (key code = 188).
    110: Msg.wParam := 188;
    end;
  end;
end;

Cabe destacar que la solución la encontré aquí:

http://www.latiumsoftware.com/es/delphi/00047.php

Yo me he permitido modificar la función para que cambie también el punto del teclado normal, tal que así:


Código Delphi [-]
procedure TForm1.ApplicationMessage(var Msg: TMsg;
  var Handled: Boolean);
begin
  case Msg.Message of
  WM_KEYDOWN, WM_KEYUP:
    case Msg.wParam of
    // Reemplazar el punto del teclado numerico (key code = 110)
    // por una coma (key code = 188).
    110: Msg.wParam := 188;
    // Reemplazar el punto del teclado normal (key code = 190)
    // por una coma (key code = 188).
    190: Msg.wParam := 188;
    end;
  end;
end;

Gracias por la ayuda y espero que sirva a alguien! :D:D:D

Neftali [Germán.Estévez] 25-11-2010 16:11:11

Yo más que en los eventos de teclas, lo haría en el OnChange del componente (TEdit). Si lo haces con las tecla y por ejemplo "PEGAS" un valor con el menú contextual del ratón, los eventos de teclas no saltarán.

Si lo haces con el evento OnChange o similar, lo único que debes tener en cuenta es dejar el cursor en la misma posición que estaba antes de modificar el valor (revisa para ellos las propiedades SelText, SelStart,... del TEdit).

fidel 28-11-2010 23:58:24

Código Delphi [-]
  //controlar entrada solo números
  if ( StrScan('0123456789.,'+chr(7)+chr(8), Key) = nil ) then  Key := #0;
  //cambiar punto decimal por coma
    if key = '.' then key := ',';
  //controlar entrada una sola coma
  for i := 1 to length(Edit1.Text) do
    if ( copy(Edit1.Text,i,1) = ',' ) and not ( StrScan(',', Key) = nil ) then  Key := #0;
end;


La franja horaria es GMT +2. Ahora son las 19:39:36.

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