Mostrando entradas con la etiqueta Free Pascal. Mostrar todas las entradas
Mostrando entradas con la etiqueta Free Pascal. Mostrar todas las entradas

viernes, 6 de agosto de 2021

La directiva {$include}

Tal como lo indica su nombre, la directiva de compilación {$Include} o {$I} se utiliza para incluir el contenido de un archivo. Generalmente se utiliza la extensión de archivo .inc aunque es opcional, también se utiliza .pp y .pas o puede no utilizarse ninguna extensión.

Si nos fijamos en el código fuente de Lazarus o de Free Pascal, encontraremos miles de ejemplos.

El uso de archivos ".inc" mejora mucho la legibilidad de un proyecto y su mantenimiento. Muchas veces se utiliza para separar el código que "molesta", como gran cantidad de definiciones. Por ejemplo una unidad que utiliza muchas definiciones de registros que ocupan varias líneas (100, 200, lo que cada uno entienda por "varias"), esas definiciones se pueden separar a otro archivo .inc e invocar ese archivo mediante la directiva {$I} en una sola línea en el lugar donde antes estaban, es importante esto, porque el compilador traerá lo que contenga el archivo .inc y lo insertará donde se encuentre la directiva.

En este caso serán definiciones de registros pero puede ser cualquier cosa, procedimientos, clases, etc. 

No es necesario incluir el archivo al proyecto, el compilador lo buscará en el directorio del proyecto, en los directorios a buscar indicados en el proyecto o en el lugar que se haya especificado, por ejemplo: {$I /home/programas/prueba/archivo.inc"}.

Se puede invocar esta directiva en una unidad todas las veces que sea necesario y en cualquier parte de la unidad, es decir que podemos incluir varios archivos en distintas partes.

No solo se pueden incluir archivos, también información de compilación y variables de entorno, en este último caso se diferencia entre mayúsculas y minúsculas.

Documentación oficial (en inglés) de esta directiva:

$I or $INCLUDE : Include file 

$I or $INCLUDE : Include compiler info

Wiki de Free Pascal.

miércoles, 20 de junio de 2018

LazReport EVariantError

Un error muy común: Invalid variant  type cast, esta excepción puede ser lanzada por LazReport cuando utilizamos variables en el reporte que las enviamos mediante eventos como el típico GetValue.

Resulta que si bien Free Pascal no distingue entre mayúsculas y minúsculas, el componente LazReport sí lo hace con las variables del reporte, motivo que está fuera del alcance de esta entrada. En resumen, el string que utilizamos en dicho evento o cualquier otro evento de LazReport que utilice el par  de valores parname y parvalue, en parname debemos respetar las minúsculas.

Ejemplo del error:


Motivo del error:


En LazReport la variable está escrita toda en minúscula.


Mientras que en el evento está escrita combinando mayúsculas y minúsculas.

Solución: simplemente escribir correctamente la variable definida en el reporte, es decir todo en minúsculas, en este caso se cambia 'FechaReporte' por 'fechareporte'.

miércoles, 3 de enero de 2018

Libro para emprezar con Lazarus y Free Pascal en español

Es un libro libre distribuido bajo la licencia Creative Commons, del año 2012 y traducido al español. Son 150 páginas en formato PDF. Parte desde cero, motivo por el cual la mayor parte del libro son ejercicios o ejemplos por consola y recién los últimos capítulos con Lazarus. Como bien indicar el autor, el libro está dirigido a programadores y también a quienes no los son y quieren aprender a programar. Por mi parte también lo recomiendo para quienes dejaron de programar hace muchos años y en DOS, les ayudará mucho para dar ese salto a la programación con objetos, programación orientada a objetos y programación con interfaz gráfica. Y por si fuera poco, multiplataforma.

Y reitero que el año en que se hizo el libro no es un problema, ya que lo que se trata en el mismo, poco y nada a cambiado, es totalmente válido aún en 2018.

Dejo la versión original en inglés y la traducida al español.

Start programming using Object Pascal Free Pascal/Lazarus book

Introducción a la programación con Object Pascal Free Pascal / Lazarus

También puedes buscar más documentación en este sitio en:

Documentación y Enlaces.

viernes, 15 de diciembre de 2017

Comprobar el contenido de un string

Muchas veces es necesario validar que una cadena de texto contenga solo ciertos caracteres, por ejemplo solo letras mayúsculas, minúsculas y números. Como todo hay mil formas de hacerlo, en este caso usaremos conjuntos, un ciclo FOR .. DO para recorrer el string, que de paso recordamos que su índice comienza con 1, y un condicional IF.. THEN. Todo esto, en una función que retornará True si el string contiene los caracteres "válidos" o False si alguno de ellos no cumple con la regla.

function ChequearContenido (const c:String) : Boolean;
var
  i:Integer;
begin
  for i:=1 to Length(c) do
    if not ( c[i] in ['A'..'Z', 'a'..'z', '0'..'9'] ) then Exit (False);
ChequearContenido:=True;
end;


Y todo sin siquiera la necesidad de recurrir a la definición de conjuntos.

miércoles, 13 de diciembre de 2017

Detener un programa mediante Halt

Halt es un procedimiento que al ser llamado, detiene el programa, "a lo bestia" podría decirse, sin vueltas, el programa finaliza. No es necesario un ejemplo, basta con llamar a Halt desde cualquier parte de nuestro código y listo.

Halt devuelve el control al programa que lo llamó, si el que lo llamó fue el sistema operativo, volverá a él, si fue otro programa, retornará a ese otro programa, por eso el procedimiento Halt permite un argumento (un integer) como valor de salida. Si este argumento no se especifica, su valor por default es cero.

Documentación oficial de Halt en FreePascal.org

martes, 10 de octubre de 2017

Diferencia entre Free y FreeAndNil

Básicamente Free libera el objeto, pero no el puntero, es decir, el puntero sigue apuntando a una dirección de memoria (inutilizable ya). Para evitar esto está FreeAndNil que además de liberar el objeto le asigna nil al puntero, por ende, si preguntamos si esta asignado nos devolverá False, de la otra forma, Assigned nos devolvería True.
Hay varias discusiones en torno a FreeAndNil, argumentos a favor y en contra. Depende la situación, a veces en un escenario particular conviene no utilizarlo.

Resumiendo, Free libera al objeto y FreeAndNil además de liberarlo le asigna Nil al puntero.

Ejemplo:

var
  objeto : TBitmap;
begin
  objeto := TBitmap.Create;
  //... Se hace algo con el objeto ...
  objeto.Free;
  if Assigned (objeto) then
    ShowMessage ('Sí, está asignado.')
  else ShowMessage ('No está asignado');
end;


Esto mostrará 'Sí, está asignado'.

Con FreeAndNil:

var
  objeto : TBitmap;
begin
  objeto := TBitmap.Create;
  //... Se hace algo con el objeto ...
  FreeAndNil (objeto);
  if Assigned (objeto) then
    ShowMessage ('Sí, está asignado.')
  else ShowMessage ('No está asignado');
end;


Esto mostrará 'No está asignado'.

Conclusión final: en la mayoría de los casos usar solo Free es correcto y también lo es usar FreeAndNil.

Este es el procedimiento FreeAndNil:

procedure FreeAndNil(var obj);
var
  temp: tobject;
begin
  temp:=tobject(obj);
  pointer(obj):=nil;
  temp.free;
end;
     

Como curiosidad aunque algo lógico, primero le asigna nil y luego hace el Free por razones más que obvias, digo curioso porque podría llamarse NilAndFree.

martes, 5 de septiembre de 2017

Instalar Lazarus y Free Pascal en Linux Mint

Hay varios métodos para instalar Lazarus, muy bien explicados en la wiki de Lazarus, en este caso explicaré un método muy simple que consiste en descargar los 3 paquetes necesarios e instalarlos.

Breve pero necesaria aclaración: se descarga el compilador, las fuentes y la IDE Lazarus. Para poder instalar Lazarus es necesario que previamente estén instalados el compilador y las fuentes, por ende primero deben instalarse primero esos dos paquetes, luego el RAD (IDE) Lazarus.

En este caso vamos a descargar e instalar FPC3.0.0 (Free Pascal Compiler), el código fuente del mismo compilador y por último Lazarus 1.6.2 para GNU/Linux 32 y 64 bits desde donde corresponde, es decir, desde SourceForge.net. <–click


Descargar todos esos archivos con excepción de README.txt.


Para instalar, solo basta con hacer doble click, en este caso sobre el paquete fpc-scr…. el cual se abrirá con el instalador de paquetes, hay que hacer click en el botón Instalar paquete. En la imagen aparece reinstalar porque ya lo tengo instalado, un detalle.


Nos pedirá la contraseña de super usuario y los instalará, puede demorar un poco.


Una vez finalizado el proceso tendrá que mostrar el paquete ya instalado. Cerramos y vamos por el siguiente, el compilador de Free Pascal.


Hacemos doble click en fpc_3.0.0…. y presionamos instalar, también nos pedirá la contraseña.


Esta advertencia hay que ignorarla con el botón cerrar y seguir. La misma se debe a que por algún motivo que desconozco, las versiones de Lazarus y Free Pascal en los repositorios de Ubuntu (que utiliza Linux Mint) son muy antiguas, demasiado, casi obsoletas.


Una vez cerrada la advertencia, se continúa con la instalación del compilador.


Al aparecer esto, significa la instalación a finalizado y cerramos el instalador de paquetes. Abrimos con doble click lazarus-project_1.6.2-1…. para ahora sí instalar Lazarus.


En esta captura en lugar de 3 archivos hay 6 porque tengo dos versiones de cada paquete, uno para 64 bits y otro para 32 bits.


Al tratarse de paquetes .deb las instalaciones son similares, se abre el paquete, click en instalar, contraseña y cerrar.


Para este pequeño tutorial instalé la versión i386 (32 bits) en una VM pero el procedimiento es igual para la versión de 64 bits que salvo para equipos muy antiguos, es la que más comúnmente se instala.


Ahora sí, en la carpeta que se creo “Lazarus” buscamos el ejecutable del mismo nombre y lo lanzamos.


Si aparece una ventana así significa que todo fue bien y solo hay que “Arrancar IDE”.


Aclaración: como la instalación fue a través del instalador de paquetes deb, en caso de necesitar desinstalar, se debe hacer lo mismo, ejecutar cada uno de los 3 paquetes y hacer click en el botón desinstalar. Es una forma de desinstalar, de seguro hay otras parecidas, pero esta es simple y rápida.