Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-05-2017
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Poder: 9
Soa Pelaez Va por buen camino
Validación coma y decimales Keypress

Buen día.

Quisiera saber si me pueden colaborar, tenía este código que encontre en un foro en el evento keypress de un edit y funciona correctamente me valida que solo deje ingresar dos decimales y que si escribo un punto lo modifique y lo cambie por una coma, como necesito realizar esta validación para varios edits quise hacerlo como un procedimiento, pero al hacerlo no me realiza la validación correctamente (no me cambia el punto por la coma y no lo muestra en el edit).

Alguien que me pueda ayudar a corregir o decirme el motivo por el cual no me funciona. Gracias.

Código Delphi [-]
procedure ValidarPorcentajeKeyPressEdit(Caracter: Char;Edit:TrDBEdit;Sender: TObject);
var
  pos: Cardinal;
begin
  i:=0;
  if ( StrScan('0123456789.,'+chr(7)+chr(8)+#13, Caracter) = nil ) then  Caracter := #0;
  // cambia el punto decimal por coma
  if (Caracter = '.') or (Caracter = ',') then Caracter := ',';
  //controlar entrada una sola coma
  for i := 1 to length(Edit.Text) do
    if ( copy(Edit.Text,i,1) = ',' ) and not ( StrScan(',', Caracter) = nil ) then  Caracter := #0;

  with Sender as TrDBEdit do
  begin
    pos := System.Pos(',', Text);
    if not LongBool(Pos) then Dec(Pos);
      ReadOnly := not (Caracter in ['0'..'9',#13, ',', #8]) or
        (Pos <> $FFFFFFFF) and (Caracter = ',') or
        ((Caracter <> #8) and (Caracter <> #13) and (Pos < (SelStart - 1)));
  end;
end;
Responder Con Cita
  #2  
Antiguo 08-05-2017
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Poder: 16
orodriguezca Va por buen camino
Creo que el problema esta en la línea:

Código Delphi [-]
if ( copy(Edit.Text,i,1) = ',' ) and not ( StrScan(',', Caracter) = nil ) then  Caracter := #0;

En esa línea de codigo haces referencia directa al objeto Edit. Prueba a cambiarla de esta forma para hacerlo más genérico:

Código Delphi [-]
if ( copy((Sender as TrDBEdit), i , 1) = ',' ) and not ( StrScan(',', Caracter) = nil ) then  Caracter := #0;
Responder Con Cita
  #3  
Antiguo 09-05-2017
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Poder: 9
Soa Pelaez Va por buen camino
Buen día.

Lo probe de la manera que planteas pero al compilarlo me saler un error y dice que tipos incompatibles y señala la parte del código donde dices (Sender as TrDBEdit).

Gracias espero puedas colaborarme y decirme como organizarlo.
Responder Con Cita
  #4  
Antiguo 09-05-2017
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Cita:
Empezado por Soa Pelaez Ver Mensaje
Código Delphi [-]
procedure ValidarPorcentajeKeyPressEdit(Caracter: Char;Edit:TrDBEdit;Sender: TObject);
Cita:
Empezado por Soa Pelaez Ver Mensaje
... pero al compilarlo me saler un error y dice que tipos incompatibles y señala la parte del código donde dices (Sender as TrDBEdit)
Solo cámbialo por el objeto correcto.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #5  
Antiguo 09-05-2017
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Poder: 9
Soa Pelaez Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
Solo cámbialo por el objeto correcto.
El código lo modifique así como me dices, pero al compilar sigue con el mismo error de tipos incompatibles.
Código Delphi [-]
procedure ValidarPorcentajeKeyPressEdit(Caracter: Char;Edit:TrDBEdit;Sender: TObject);
var
  pos: Cardinal;
begin
  i:=0;
  if ( StrScan('0123456789.,'+chr(7)+chr(8)+#13, Caracter) = nil ) then  Caracter := #0;
  // cambia el punto decimal por coma
  if (Caracter = '.') or (Caracter = ',') then Caracter := ',';
  //controlar entrada una sola coma
  for i := 1 to length(Edit.Text) do
    if ( copy((Sender as TrDBEdit), i , 1) = ',' ) and not ( StrScan(',', Caracter) = nil ) then  Caracter := #0;

  with Sender as TrDBEdit do
  begin
    pos := System.Pos(',', Text);
    if not LongBool(Pos) then Dec(Pos);
      ReadOnly := not (Caracter in ['0'..'9',#13, ',', #8]) or
        (Pos <> $FFFFFFFF) and (Caracter = ',') or
        ((Caracter <> #8) and (Caracter <> #13) and (Pos < (SelStart - 1)));
  end;
end;
Responder Con Cita
  #6  
Antiguo 09-05-2017
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
y entrega el valor correcto a la función que te lanza el error
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #7  
Antiguo 09-05-2017
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Poder: 9
Soa Pelaez Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
y entrega el valor correcto a la función que te lanza el error
No entiendo como sería.
Responder Con Cita
  #8  
Antiguo 09-05-2017
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Cita:
Empezado por Soa Pelaez Ver Mensaje
No entiendo como sería.
¿Leíste lo del enlace?

El error es generado en la función Copy. Ya que la función requiere un texto con el que trabajar

Al hacer el cast

Código Delphi [-]
(Sender as TrDBEdit)

A la función le estás pasando es un objeto no el texto del objeto lo que obtendrías con

Código Delphi [-]
(Sender as TrDBEdit).text

Recomendación:

Ya que al parecer estás usando un control de base de datos, podrías validar el valor almacenado en el campo en lugar al del control.

Código Delphi [-]
QueryFieldavalidar.AsString
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #9  
Antiguo 09-05-2017
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Poder: 9
Soa Pelaez Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
¿Leíste lo del enlace?

El error es generado en la función Copy. Ya que la función requiere un texto con el que trabajar

Al hacer el cast

Código Delphi [-]
(Sender as TrDBEdit)

A la función le estás pasando es un objeto no el texto del objeto lo que obtendrías con

Código Delphi [-]
(Sender as TrDBEdit).text

Recomendación:

Ya que al parecer estás usando un control de base de datos, podrías validar el valor almacenado en el campo en lugar al del control.

Código Delphi [-]
QueryFieldavalidar.AsString
Si esa parte la entendí pero mi problema no es como tal el pasarle el objeto sea de un campo de base de datos o de un edit. El problema es que al invocar el procedimiento desde el evento keypress de un Edit al ingresar un punto no lo muestra y no realiza correctamente la validación del procedimiento que es modificar ese punto cambiarlo por una coma y visualizarlo en el edit con sus respectivos decimales.

Es que lo que tengo en el procedure funciona correctamente si es invocado directamente desde el keypress del edit, me explico sin invocar un procedimiento externo sino aplicar todo el código ahi, pero como lo necesito para varios edits por eso decidí volverlo un procedure pero al hacer esto como te comento no me realiza correctamente la validación.

Última edición por Soa Pelaez fecha: 09-05-2017 a las 20:57:18.
Responder Con Cita
  #10  
Antiguo 09-05-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Soa Pelaez Ver Mensaje
El problema es que al invocar el procedimiento desde el evento keypress de un Edit
Pon el código con el que invocas al procedimiento.

LineComment Saludos
Responder Con Cita
  #11  
Antiguo 09-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por Soa Pelaez Ver Mensaje
...
Es que lo que tengo en el procedure funciona correctamente si es invocado directamente desde el keypress del edit, me explico sin invocar un procedimiento externo sino aplicar todo el código ahi, pero como lo necesito para varios edits por eso decidí volverlo un procedure pero al hacer esto como te comento no me realiza correctamente la validación.
¿ Y por que no asignas ese código (que funciona correctamente) al evento OnKeyPress de todos los componentes TrDBEdit en que lo necesites ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #12  
Antiguo 09-05-2017
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Poder: 9
Soa Pelaez Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Pon el código con el que invocas al procedimiento.

LineComment Saludos
De esta manera lo invoco en el keypress.

Código Delphi [-]
procedure TFormulario.DBPorcentajeKeyPress(Sender: TObject; var Key: Char);
begin
  ValidarPorcentajeKeyPressEdit(Key,DBPorcentaje,Sender);
end;
Responder Con Cita
  #13  
Antiguo 09-05-2017
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Poder: 9
Soa Pelaez Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola.

¿ Y por que no asignas ese código (que funciona correctamente) al evento OnKeyPress de todos los componentes TrDBEdit en que lo necesites ?

Saludos
Porque de la manera en procedure lo puedo llamar de muchas partes (distintos formularios), sin realizar uses de unidades.
Responder Con Cita
  #14  
Antiguo 09-05-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Y ¿por qué manejas dos componentes TrDBEdit e el mismo procedimiento? ¿Cuál es la relación entre Edit y Sender?

Es que, de verdad, no se entiende lo que quieres hacer. Hablas de validar la entrada en un Edit pero en el procedimiento con el que quieres hacer la validación se involucra otro Edit.

Trata de ser más explícito y detallado.

LineComment Saludos
Responder Con Cita
  #15  
Antiguo 09-05-2017
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Poder: 9
Soa Pelaez Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Y ¿por qué manejas dos componentes TrDBEdit e el mismo procedimiento? ¿Cuál es la relación entre Edit y Sender?

Es que, de verdad, no se entiende lo que quieres hacer. Hablas de validar la entrada en un Edit pero en el procedimiento con el que quieres hacer la validación se involucra otro Edit.

Trata de ser más explícito y detallado.

LineComment Saludos
No es que maneje otro edit, es que trato de enviar el TRDBEdit donde se entra el texto como parametro al procedure y asi quede general para todos los componentes TRDBEdit.
Responder Con Cita
  #16  
Antiguo 09-05-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Entonces, tu procedimiento debe tener sólo dos parámetros:

Código Delphi [-]
procedure ValidarPorcentajeKeyPressEdit(Caracter: Char; Edit:TrDBEdit);
begin
...
end;

y lo invocas pasando el Sender AS TrDBEdit:

Código Delphi [-]
procedure TFormulario.DBPorcentajeKeyPress(Sender: TObject; var Key: Char);
begin
  ValidarPorcentajeKeyPressEdit(Key, Sender as TrDBEdit);
end;

y modifica tu procedimiento acordemente.

LineComment Saludos
Responder Con Cita
  #17  
Antiguo 09-05-2017
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Poder: 9
Soa Pelaez Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Entonces, tu procedimiento debe tener sólo dos parámetros:

Código Delphi [-]
procedure ValidarPorcentajeKeyPressEdit(Caracter: Char; Edit:TrDBEdit);
begin
...
end;

y lo invocas pasando el Sender AS TrDBEdit:

Código Delphi [-]
procedure TFormulario.DBPorcentajeKeyPress(Sender: TObject; var Key: Char);
begin
  ValidarPorcentajeKeyPressEdit(Key, Sender as TrDBEdit);
end;

y modifica tu procedimiento acordemente.

LineComment Saludos
Lo aplique de esa manera, modifique el procedimiento y aun asi sigue sin realizar el cambio de punto a coma.
Responder Con Cita
  #18  
Antiguo 09-05-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pon el código final del procedimiento.

LineComment Saludos
Responder Con Cita
  #19  
Antiguo 09-05-2017
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Poder: 9
Soa Pelaez Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Pon el código final del procedimiento.

LineComment Saludos
Aqui está.

Código Delphi [-]
procedure ValidarPorcentajeKeyPressEdit(Caracter: Char;Edit:TrDBEdit);
var
  pos: Cardinal;
begin
  i:=0;
  if ( StrScan('0123456789.,'+chr(7)+chr(8)+#13, Caracter) = nil ) then  Caracter := #0;
  // cambia el punto decimal por coma
  if (Caracter = '.') or (Caracter = ',') then Caracter := ',';
  //controlar entrada una sola coma
  for i := 1 to length(Edit.Text) do
    if ( copy((Edit.Text), i , 1) = ',' ) and not ( StrScan(',', Caracter) = nil ) then  Caracter := #0;

  with Edit as TrDBEdit do
  begin
    pos := System.Pos(',', Text);
    if not LongBool(Pos) then Dec(Pos);
      ReadOnly := not (Caracter in ['0'..'9',#13, ',', #8]) or
        (Pos <> $FFFFFFFF) and (Caracter = ',') or
        ((Caracter <> #8) and (Caracter <> #13) and (Pos < (SelStart - 1)));
  end;
end;

//EJECUCIÓN DESDE EL KEYPRESS DEL COMPONENTE TRDBEDIT
procedure TForm.DBPorcentajeKeyPress(Sender: TObject; var Key: Char);
begin
  ValidarPorcentajeKeyPressEdit(Key,Sender AS TrDBEdit);
end;
Responder Con Cita
  #20  
Antiguo 10-05-2017
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Hola Soa Pelaez,

Sólo quieres controlar si al pulsar un (.) se cambie por una (,) y delimitar el número de decimales que puedes introducir, pues yo utilizo esto.

Código Delphi [-]
procedure ValidOnKeyPress(var Key: Char; MaxDecimals: Integer; Text: String);

  const
    WVK_POINT       = '.';
    WVK_COMMA       = ',';
    WVK_NULL        = #0;
    WVK_BACKDELETE  = #8;


  function CountDecimals: Byte;
  var
    nPos: Integer;
  begin
    Result := 0;
    nPos := Pos(',', Text);
    if (nPos <> 0) or (nPos <> Length(Text)) then
      Result := (Length(Text) - nPos);
  end;

begin
  if (Key = WVK_POINT) then
    Key := WVK_COMMA;

  if not (Key in ['0'..'9', WVK_BACKDELETE, WVK_COMMA]) then
    Key := WVK_NULL;

  if (Key = WVK_COMMA) and (Pos(WVK_COMMA, Text) > 0) then
    Key := WVK_NULL;

  if (CountDecimals = MaxDecimals) and (not (Key = WVK_BACKDELETE)) then
    Key := WVK_NULL;
end;
Y la llamada lo hacemos asi.
Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  ValidOnKeyPress(Key, 2, Edit1.Text);
end;
O
Código Delphi [-]
procedure TForm1.DBEdit1KeyPress(Sender: TObject; var Key: Char);
begin
  ValidOnKeyPress(Key, 2, DBEdit1.Text);
end;
Un saludo.
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Uso del keypress en un edit snake25237 OOP 1 23-02-2011 16:30:43
evento keypress ronson Varios 40 04-01-2011 05:18:23
validar decimales con "coma" lucasarts_18 PHP 3 26-12-2008 02:41:50
teclas F# en keypress sargento elias OOP 3 08-10-2008 09:23:43
Llamar a evento Keypress edgusano .NET 1 30-11-2005 23:02:29


La franja horaria es GMT +2. Ahora son las 10:11:00.


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
Copyright 1996-2007 Club Delphi