sábado, 13 de julio de 2013

Lazarus Borrar los EDIT y MEMO de golpe

Aun no he tenido tiempo de probar esta función que me paso un conocido por E-mail hace varios años, pero la voy a publicar ya que me parece muy interesante:

 
Código:

procedure TForm1.Button1Click(Sender: TObject);

  procedure VaciaComponentesDeEdicion;
  var
    n : integer;
  begin
    for n:=0 to Pred(ComponentCount) do begin
      //Recorremos los componentes de la form y los vaciamos
      if Components[n] is TEdit then TEdit(Components[n]).Clear
        else
      if Components[n] is TMemo then TMemo(Components[n]).Lines.Clear
        else
      if Components[n] is TDBEdit then TDBEdit(Components[n]).Clear;
    end;
  end;

begin
  VaciaComponentesDeEdicion;
end;

lunes, 8 de julio de 2013

Lazarus detener un bucle for

Para detener un bucle for tenemos que utilizar la sentencia break.

Código:

  for j := longitud_cadena downto 1 do
      begin
        Insert (cadena [j],resultado,n);       //Inserta los caracteres a la var resultado.
        n := n + 1;                            //Contador N.
        if cadena [j] = ' ' then Break;
      end;



Lazarus invertir el orden de una cadena de string

Para dar la vuelta a un string o mejor dicho para invertir su orden podemos utilizar esta instrucción:

Código:

ReverseString(string_a_invertir );

Para utilizar esta instrucción hay que poner en el uses un enlace a las StrUtils.

Código:

uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, StrUtils; type { TForm1 }

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.

Programando en Lazarus, presentación

Hacia tiempo que no programaba en ningún leguaje de programación, ufff por lo menos 10 años... A pesar que durante estos últimos años he estado programando en HTML y PHP se puede decir que que he empezado prácticamente desde 0 con Lazarus.

Hace muchos años aprendi a programar en turbo pascal y luego me pase al delphi, pero lo tuve que dejar por que los estudios me absorbía mucho tiempo (sobretodo el viaje).

He decidido crear este otro bogg para tener mis apuntes siempre a mano en cualquier lugar del mundo, y no los quiero postear en mi otro bogo ya que esta mas orientado hacia la artesanía...