sábado, 6 de julio de 2013

Lazarus letra o número

Buscando una función o instrucción para Lazarus que me distinga si lo que se esta introduciendo en un edit es un valor numérico o de texto me he encontrado con este post:

http://www.ajpdsoft.com/modules.php?name=Foros&file=viewtopic&t=937

Aquí tienes una función, por supuesto no es la mejor, pero es una forma rápida de resolver el problema:


Para el caso de un entero (integer): 

Código:

//Comprueba si un valor es numérico
function esNumero (valor : string) : boolean;
var
  numero : integer;
begin
  try
    numero := strtoint(valor);
    result := true;
  except
    result := false;
  end;
end; 


Para el caso de un double: 

Código:

//Comprueba si un valor es numérico
function esNumero (valor : string) : boolean;
var
  numero : double;
begin
  try
    numero := StrToFloat(valor);
    result := true;
  except
    result := false;
  end;
end; 


En ambas funciones utilizamos las funciones de Delphi "StrToFloat" y "StrToInt" para convertir una cadena de texto a double y a integer respectivamente. Si la función no puede convertir el valor de cadena devolverá un error, lo capturaremos y devolveremos true o false según se haya podido convertir o no.

Existen más posibilidades, por supuesto, otra es comprobar con el evento "OnKeyPress" del los cuadros de edición (TEdit) si lo que se introduce es un número o un texto para no dejar introducir letras en el cuadro. Aunque este caso puede ser más complicado, pues habría que realizar bastantes comprobaciones: el usuario debe poder introducir "-" (para números negativos), también "," como separador de decimales. Y se debe comprobar que el usuario no introduzca dos comas, ni dos guiones. Para este caso sería algo así (sin comprobar que se introduzcan dos guiones o dos o más comas): 

Código:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (key in ['0'..'9']) and (Key <> ',')
      and (Key <> '-') then
    Key := #0;
end; 


En este caso el código anterior lo ponemos en el evento OnKeyPress, si el usuario no introduce un número, una coma o el signo menos, la pulsación quedará anulada con key := #0, por lo que el usuario sólo podrá introducir número en el TEdit.

----------
Yo en mi programa para ahorrar código he utilizado estas funciones que vienen a continuación:


Código:


function esNumero (key : char) : boolean;
begin
  //Si no es un número o el caracter borrado izquierda entrega false
  //y no muestra el texto.
  if not ((key in ['0'..'9']) or (Key = #8)) then
    begin
      result := false;
    end
  else
  begin
     result := true;
  end;
end;

procedure TForm1.edt_cantidadKeyPress(Sender: TObject; var Key: char);
begin
  if not (esNumero (Key) = true) then key := #0;
end;

end.
Ya que en mi programa tengo varios edit donde únicamente solo tienen que introducirse números, y para no andar repitiendo partes del código fuente una y otra vez he creado esta función.  Seguro que se puede mejorar, pero de momento no se me ocurre como.

No hay comentarios:

Publicar un comentario