TEdit limitado para la entrada de números

4584 vistas

Es suficiente con reemplazar todo carácter por el carácter nulo dentro del evento OnKeyPress del TEdit con excepción, claro está, del separador decimal (DecimalSeparator), la tecla de borrar (VK_BACK), la de suprimir (VK_DELETE) y el signo negativo.

También hay que controlar el pegado desde el portapapeles

Para números enteros:


delphi
  1. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  2. var
  3.   sNumAnterior:string;
  4. begin
  5.   sNumAnterior := (sender as TEdit).Text;
  6.   if (key <> #3) and (key <> #22) then  // #3 = Copiar (Ctrl + C)
  7.   begin                                // #22 = Pegar (Ctrl + V)
  8.     if key = '-' then
  9.     begin
  10.       if ((pos(key,(sender as TEdit).Text) > 0) and
  11.         (pos(key,(sender as TEdit).SelText) = 0))
  12.         or
  13.         ((sender as TEdit).SelStart > 0)
  14.       then key:=#0;
  15.     end
  16.     else if not (key in ['0'..'9',#8]) then key:=#0;
  17.   end;
  18.   if key = #22 then
  19.   try
  20.     key := #0;
  21.     (sender as TEdit).PasteFromClipBoard;
  22.     StrToInt((sender as TEdit).Text);
  23.   except
  24.     (sender as TEdit).Text := sNumAnterior;
  25.     (sender as TEdit).SelStart := Length((sender as TEdit).Text);
  26.   end;
  27. end;



Para números reales



delphi
  1. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  2. var sNumAnterior:string;
  3. begin
  4.   sNumAnterior := (sender as TEdit).Text;
  5.   if (key <> #3) and (key <> #22) then  // #3 = Copiar (Ctrl + C)
  6.   begin                                // #22 = Pegar (Ctrl + V)
  7.     if key in ['-','.'] then
  8.     begin
  9.       if (pos(key,(sender as TEdit).Text) > 0) and
  10.         (pos(key,(sender as TEdit).SelText) = 0)
  11.         then key:=#0;
  12.       case key of
  13.         '-': if ((sender as TEdit).SelStart > 0) then key:=#0;
  14.         '.': if ((sender as TEdit).SelStart = 0) or
  15.                 (((sender as TEdit).SelStart = 1) and
  16.                 ((sender as TEdit).Text[1] = '-'))
  17.             then key:=#0;
  18.       end;
  19.     end
  20.     else if not (key in ['0'..'9',#8]) then key:=#0;
  21.   end;
  22.   if key = #22 then
  23.   try
  24.     key := #0;
  25.     (sender as TEdit).PasteFromClipBoard;
  26.     StrToFloat((sender as TEdit).Text);
  27.   except
  28.     (sender as TEdit).Text := sNumAnterior;
  29.     (sender as TEdit).SelStart := Length((sender as TEdit).Text);
  30.   end;
  31. end;