sábado, 7 de septiembre de 2013

Hola, hace un rato me hacia falta encontrar como se tenia que hacer para evitar que lazarus cree un formulario de manera automatica, y me he encontrado con este post en el blog de  en esta dirección: http://aitoreus.blogspot.com.es

Abrir formularios en Lazarus-FreePascal



Como en un lenguaje de programación moderno (con extensión para orientación a objetos), en Lazarus - FreePascal tenemos dos formas de abrir formularios:



  1. De forma estática. Diseñas los formularios. Luego, al iniciar la aplicación se crean todos los formularios, aunque están ocultos. Cuando quieras lo haces visible en tiempo de ejecución.
  2. De forma dinámica. Cuando abres una aplicación como el Microsoft Word, tú no sabes cuantos formularios "de documento" vas a tener que abrir. El usuario puede abrir 1 documento o 20. Cada vez que haga clic en "Nuevo documento" hay que abrir un formulario.
1.-FORMA ESTÁTICA DE CREAR FORMULARIOS.

Diseñamos los formularios que necesitemos con Lazarus. Para crear un nuevo formulario vamos al MENÚ ARCHIVO, Opción NUEVO FORMULARIO.

Hay que tener en cuenta que cada formulario gráfico que hemos creado está descrito en una unidad (UNIT). Para verlo seleccionamos el formulario y vamos al MENÚ VER, Opción "EDITOR DE CÓDIGO FUENTE". El nombre de la unidad se encuentra en la primera línea del código fuente del formulario. Por ejemplo:

unit Unit1;

Si desde este form1 que está definido en Unit1, queremos llamar al form2, tenemos que incluir la definición de form2 dentró de la sección uses:

uses: 
xxxxx, xxxxxx, xxxxxx, xxxxxx, unit2;

Ahora ya podemos "llamar" al form2 desde form1. Realmente la invocación sólo consiste en hacer visible el formulario. Eso es así porque al arrancar se crean todos los formularios que hemos diseñado.

form2.show;

2.-FORMA DINÁMICA DE CREAR FORMULARIOS.

Tenemos que pensar que cada formulario es un objeto. Nuestro programa puede necesitar abrir varios objetos de ese tipo (formularios de entrada, informes, etc.), aunque cada uno tenga datos diferentes.

Vamos al MENÚ PROYECTO, Opción OPCIONES DEL PROYECTO, y elegimos FORMULARIO. Saldrá esta ventana:


Pasamos los formularios que haya que abrir dinámicamente, de la columna "CREAR FORMULARIOS AUTOMÁTICAMENTE" a la de "FORMULARIOS DISPONIBLES".

En los eventos OnClose de los formularios tenemos que añandir lo siguiente para que libere la memoria:
CloseAction:= caFree;

Lo único que hay que hacer ahora para abrir el form2 desde el form1 es instanciar el objeto form2:

procedure Tform1.Button1Click(Sender: TObject);
var
   frmDocumento: Tform2;
begin
   frmDocumento:= Tform2.Create(Application);
   frmDocumento.Show;
end;  

Saludos.

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...