Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Validación coma y decimales Keypress (https://www.clubdelphi.com/foros/showthread.php?t=91825)

Soa Pelaez 10-05-2017 15:34:02

Cita:

Empezado por olbeup (Mensaje 516483)
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.

Primero muchas gracias por tu aporte.
Pero sigue con la misma falla que tiene mi código porque lo ensaye y al compilarlo e ingresar un punto en el edit no me lo modifica por la coma y a su vez con tu código si escribo muchas comas lo deja hacer.

olbeup 11-05-2017 08:13:31

Cita:

Empezado por Soa Pelaez (Mensaje 516527)
Primero muchas gracias por tu aporte.
Pero sigue con la misma falla que tiene mi código porque lo ensaye y al compilarlo e ingresar un punto en el edit no me lo modifica por la coma y a su vez con tu código si escribo muchas comas lo deja hacer.

El problema que tú tienes, es, en el procedimiento, tienes que añadir "var", en vez de:
Código Delphi [-]
procedure ValidarPorcentajeKeyPressEdit(Caracter: Char;Edit:TrDBEdit);
Pon esto otro:
Código Delphi [-]
procedure ValidarPorcentajeKeyPressEdit(var Caracter: Char;Edit:TrDBEdit);
Un saludo

roman 11-05-2017 15:12:48

Cita:

Empezado por olbeup (Mensaje 516549)
El problema que tú tienes, es, en el procedimiento, tienes que añadir "var"

Ja, ja. Un detalle tan simple y no lo habíamos visto. Buen ojo olbeup ^\||/

LineComment Saludos

Soa Pelaez 11-05-2017 15:23:52

Cita:

Empezado por olbeup (Mensaje 516549)
El problema que tú tienes, es, en el procedimiento, tienes que añadir "var", en vez de:
Código Delphi [-]
procedure ValidarPorcentajeKeyPressEdit(Caracter: Char;Edit:TrDBEdit);
Pon esto otro:
Código Delphi [-]
procedure ValidarPorcentajeKeyPressEdit(var Caracter: Char;Edit:TrDBEdit);
Un saludo

Muchas gracias, modifique eso a la declaración de mi procedimiento y funciono correctamente. Quedo de la siguiente manera:

Código Delphi [-]
procedure ValidarPorcentajeKeyPressEdit(var Caracter: Char;Edit:TrDBEdit; Sender:TObject);
var
  pos: Cardinal;
begin
  i:=0;
  //Permite que desepues de se digite el . o , solo se puedan ingresar 2 Registros Mas
  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
    if ( copy((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;

//LA INVOCACIÓN DEL PROCEDIMIENTO ES ASI.
procedure TForm.DBEPorcentajeKeyPress(Sender: TObject; var Key: Char);
begin
  ValidarPorcentajeKeyPressEdit(Key,DBEPorcentaje,Sender);
end;

olbeup 12-05-2017 08:29:25

Hola Soa Pelaez,

Me alegro por ti.

Un saludo.


La franja horaria es GMT +2. Ahora son las 08:46:17.

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