Difference between revisions of "Lazarus Packages/es"

From Lazarus wiki
Jump to navigationJump to search
Line 89: Line 89:
 
Si nuestro paquete contiene formularios u otros objetos de la LCL, entonces requerirá del paquete LCL.
 
Si nuestro paquete contiene formularios u otros objetos de la LCL, entonces requerirá del paquete LCL.
  
* Em el editor de paquetes pulsamos en el botón ''Añadir'' y seleccionamos la pestaña ''Nuevo Requerimiento''
+
* En el editor de paquetes pulsamos en el botón ''Añadir'' y seleccionamos la pestaña ''Nuevo Requerimiento''
 
* De la lista desplegable, elegimos el paquete ''LCL''
 
* De la lista desplegable, elegimos el paquete ''LCL''
 
* Damos al botón ''Aceptar''.
 
* Damos al botón ''Aceptar''.

Revision as of 19:34, 15 November 2009

Deutsch (de) English (en) español (es) français (fr) 日本語 (ja) português (pt) русский (ru) slovenčina (sk)

Descripción del sistema de paquetes Lazarus

¿Qué es un paquete Lazarus?

   Es una conjunto de unidade y componentes, que contiene información sobre cómo compilarlos y utilizarlos en proyectos, otros paquetes o en el IDE. Al contraio que en DElphi los paquetes no están limitados a librerías y pueden ser independientes de la plataforma. Los paquetes Delphi son librerías especiales compiladas que utilizan las aplicaciones, el IDE o ámbos. Los paquetes Delphi necesitan de un soporte interno del compilador, FPC no es capaz por ahora de hacerlo y este truco es dependiente del sistema operativo)

   Actualmente el compilador Free Pascal únicamente soporta paquetes estáticos. Por tanto hay que compilar y relanzar el IDE cada vez que se instala o elimina un paquete.

   Un paquete Lazarus se identifica y distingue por su nombre y su versión.

Preguntas frecuentes

   ¿Es necesario instalar un paquete?

Únicamente si el paquete contiene elementos de diseño, cómo componentes para la paleta del IDE. Si no es así, sí sólo utilizas el paquete en el proyecto, no hay que instalarlo.

   He instalado un paquete, pero el IDE no encuentra las unidades

Al instalar un paquete este se integra en el IDE, no en tu proyecto. Son dos cosas distintas. Para utilizar un paquete en tu proyecto añádelo al mismo, con Proyecto -> Inspector del proyecto, y en la ventana, botón Añadir, y Nuevo Requerimiento.

Inicio rápido

   Para ver el sistema de paquetes en acción y familiarizarse con él, haz lo siguiente:

Creando un nuevo paquete

  • En el menú principal del IDE, Archivo -> Nuevo... -> Paquete -> Standard Package
  • Se abre la ventana de edición de paquetes.
  • Utiliza el botón Guardar.
  • Dependiendo de la configuración de Nombrado en las Opciones de del Entorno, el IDE preguntará si la guarda en minúsculas. Responde sí.

   ¡Felicidades! has creado tu primer paquete.

Añadiendo un nuevo componente

  • Utiliza el botón Añadir y selecciona la pestaña Nuevo componente de la ventana.
  • Selecciona el ancestro del componente de entre la lista. Por ejemplo: TBevel. Las otras opciones se cumplimentan por defecto.Se pueden cambiar.
  • Pulsa el botón aceptar.
  • El archivo creado será añadido al paquete y aparecerá abierto en el editor.
  • Instala el paquete usando el botón Instalar.
  • Lazarus guardará el paquete y preguntará si reconstruye el IDE. Responde sí.
  • El paquete será enlazado de forma estática y será necesario relanzar el IDE de Lazarus.
  • Una vez de nuevo en Lazarus veremos nuestro nuevo componente del paquete en la pestaña que elegimos al crearlo (Por ejemplo: TBevel1 en la pestaña Additional).
  • Si no se ve el nuevo componente en la paleta será seguramente porque no se está ejecutando la nueva versión compilada del IDE de Lazarus. Puedes ver donde se ha construido en: Entorno -> Opciones del Entorno ... Archivos -> Directorio de Lazarus (...). En vez de ejecutar directamente Lazarus puedes usar startlazarus, que arranca el recién creado Lazarus, en el directorio ~/.lazarus, si no tienes permiso de escritura en el directorio donde Lazarus está instalado.

   ¡Felicidades! has instalado tu primer paquete con tu primer componente.

Añadir un icono para el componente

  • El tamaño de la imágen PNG debe ser de 24x24 puntos.
  • El nombre del archivo png debe ser el mismo de la clase del nuevo componente.

Para crear el archivo lrs ejecutar (donde mi_paquete es el nombre de tu paquete y TMiComponente es el nombre de tu componente):

~/lazarus/tools/lazres mi_paquete.lrs TMiComponente.png
  • Puede que necesites para compilar lazres en su primer uso. Simplemente abre lazres.lpi en el IDE y en el menú Ejecutar -> Construir.

Puedes agregar más de una imagen al archivo lrs, añadiendo el nombre del archivo de imagen al final. Por ejemplo ~/lazarus/tools/lazres mi_paquete.lrs TMiComponente.png TMiOtroComponente.png ...

Si abrimos el archivo mi_paquete.lrs veremos algo como esto.

 LazarusResources.Add('TMiComponente','PNG',[
 #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#24#0#0#0#24#8#2#0#0#0'o'#21#170#175
 +#0#0#0#4'gAMA'#0#0#177#143#11#252'a'#5#0#0#0'|IDAT8O'#237#212#209#10#192' '#8
 +#5'P'#247#231#251's'#215#138#133#164#166'\'#220#195'`'#209'c'#157'L'#173#131
 +#153#169'd4'#168'dP'#137'r_'#235'5'#136'@Zmk'#16'd9'#144#176#232#164'1'#247
 +'I'#8#160'IL'#206'C'#179#144#12#199#140'.'#134#244#141'~'#168#247#209'S~;'#29
 +'V+'#196#201'^'#10#15#150'?'#255#18#227#206'NZ>42'#181#159#226#144#15'@'#201
 +#148#168'e'#224'7f<@4'#130'u_YD'#23#213#131#134'Q]'#158#188#135#0#0#0#0'IEND'
 +#174'B`'#130
]);
  • Haz clic de nuevo en el botón Añadir, ve a la pestaña Agregar archivo y busca el archivo mi_paquete.lrs y haz clic en Aceptar.

Crear un paquete para nuestras unidades comunes

Pongamos que tenemos varias unidades, que deseamos utilizar en nuestros proyectos. Colocaremos las unidades en un directorio independiente, por ejemplo, C:\MisUnidadesCompartidas.

  • Paquete->Paquete Nuevo... o Archivo->Nuevo... -> Paquete -> Paquete
  • El editor de paquetes se abre
  • Usar el botón Guardar. Navegar hasta nuestro directorio (C:\MisUnidadesCompartidas), poner el nombre que queremos (MiPaqueteUnidadesCompartidas.lpk). El nombre no debe entrar en conflicto con el de una unidad existente.
  • Dependiendo de la opción 'nombrado' en las 'opciones de entorno' el IDE pude avisar para que al guardar se ponga el nombre en minúsculas. Aceptamos.
  • Ahora tendremos un paquete de nombre MiPaqueteUnidadesCompartidas en C:\MisUnidadesCompartidas\mipaqueteunidadescompartidas.lpk.
  • Añadir las unidades: Añadir->Añadir Archivos->Añadir Directorio.
  • Aparece un diálogo con el directorio C:\MisUnidadesCompartidas y los filtros incluir y excluir. Clic Aceptar para añadir todas las unidades.
  • Las unidades aparecen en la lista. Clic Añadir archivos al paquete.
  • Los archivos han sido añadidos al paquete. Clic Guardar.
  • Si nuestras unidades únicamente requieren de las unidades normales de FPC, podemos simplemente dar a Compilar. En otro caso ver lo que sigue.

Añadir la LCL como una dependencia

Si nuestro paquete contiene formularios u otros objetos de la LCL, entonces requerirá del paquete LCL.

  • En el editor de paquetes pulsamos en el botón Añadir y seleccionamos la pestaña Nuevo Requerimiento
  • De la lista desplegable, elegimos el paquete LCL
  • Damos al botón Aceptar.
  • La LCL ha sido añadida bajo el rótulo Paquetes Requeridos. Damos al botón Guardar.

Podemos ver el efecto de la inclusión paquete LCL, haciendo doble clic en el editor de paquetes sobre Opciones del compilador en la pestaña Heredado.

Usar tu paquete en tus proyectos

You need to add a dependency from the project to your new package. There are several ways to do this:

  • Open your package. For example via Package / Open recent package. On the package editor of your package click More ... / Add to project.
  • Or you can use the project inspector:
    • Project / Project Inspector.
    • Click on the Add button with the plus.
    • Select the page New Requirement
    • Choose as package name your package
    • Click Ok

Los elementos del menú del IDE para paquetes:

  • Archivo -> Nuevo... -> Package -> Package -> Standard Package
    • Crea un nuevo paquete.
  • Proyecto -> Inspector de proyecto
    • En la ventana se ve la lista de paquetes que utiliza el proyecto abierto.
    • Es posible añadir ( -> botón Añadir -> pestaña Nuevo Requerimiento) o eliminar ( botón Eliminar) paquetes.
  • Proyecto -> Opciones del Compilador... -> Heredado
    • Aquí vemos las opciones del compilador que son heredadas desde los paquetes usados.
  • Componentes
    • 'Abrir paquete cargado': Un dálogo muestra todos los paquetes abiertos con su estado e información cada uno sobre ellos.
    • 'Abrir archivo de paquete (.lpk)...': Abre un paquete desde un archivo .lpk, para editarlo, compilarlo o instalarlo.
    • 'Abrir paquete de unidad actual': Abre el archivo .lpk, del paquete al que pertenece el archivo activo en el editor.
    • 'Abrir paquete reciente...': Muestra la lista de los archivos .lpk de los paquetes más recientes abiertos o editados.
    • 'Añadir unidad activa a un paquete': Añade el archivo activo en el editor aun paquete.
    • 'Gráfico de paquete...': Un gráfico muestra todos los paquetes abiertos y sus dependencias.
    • 'Configurar paquetes instalados': Edita la lista de los paquetes instalados en el IDE. Permite instalar o eliminar varios paquetes a la vez.

Removing Packages

  • To remove installed components, on the IDE menu, click Package > Configure installed packages. The following image shows the Installed Packages tool.
 Installed Components
  • Select the package you want to uninstall and click Uninstall selection.
 If something goes wrong with a package (for instance a package directory is deleted without first uninstalling it), Lazarus may not allow you to uninstall packages. To fix the problem, at the IDE menu click Tools > Build Lazarus. Lazarus will rebuild all packages and restart. You should now be able to uninstall problematic packages.

La teoría

   Todo paquete Lazarus tiene un archivo .lpk. Un paquete se identifica por su nombre y su versión. El nombre se corresponde con el nombre del archivo lpk. Por ejemplo:

   Nombre: Paquete1, Versión: 1.0, Nombre de archivo: /home/.../Paquete1.lpk.

  • El IDE crea automáticamente el archivo principal Paquete1.pas, ver más adelante. El archivo lpk contiene información sobre los paquetes necesarios, los archivos necesarios para compilarlo y que es necesario para usar el paquete con otros paquetes o proyectos. El directorio en el que reside el lpk se denomina directorio del paquete.
  • El IDE mantiene una lista de todos los archivos de paquete (<config directory>/packagelinks.xml). Cada vez que un paquete es abierto por el IDE se añade a la lista. Cada vez que se abre un paquete, el IDE automáticamente abre todos los paquetes necesarios usando la lista.
  • Hay tres paquetes básicos: FCL,LCL y SynEdit. Son parte del IDE y son creados automáticamente, son de sólo lectura y no tienen un archivo lpk.
  • Normalmente un paquete tiene un directorio con las unidades con el código fuente pascal. También dispone de un directorio de destino, que por defecto es 'lib/$(TargetCPU)-$(TargetOS)/' dentro del directorio del paquete.
  • Antes de compilar un paquete el IDE verifica todos los paquetes necesarios y si si estos necesitan actualización y la señal de hacerlo está marcada, se compilan antes. Después el IDE crea el archivo principal del paquete. Si el lpk es 'paquete1.lpk' es archivo principal será 'paquete1.pas'. Este archivo contendrá todas la unidades necesarias en la cláusula uses y además el procedimiento de registro que se llamará en la sección initialization.

   Por ejemplo:

<delphi> {This file was automatically created by Lazarus. Do not edit!

This source is only used to compile and install the package GTKOpenGL 1.0.}
unit GTKOpenGL;
interface
uses GTKGLArea, GTKGLArea_Int, NVGL, NVGLX, LazarusPackageIntf;
implementation
procedure Register;
begin
  RegisterUnit('GTKGLArea', @GTKGLArea.Register);
end;</elphi>
initialization
  RegisterPackage('GTKOpenGL', @Register)
end.</delphi>
  • El compilador se lanza y el paquete se compila en el directorio de salida
  • Tras una compilación correcta se crea un archivo de estado en el directorio de salida; su nombre será de la forma <nombrepaquete>.compiled y contiene información sobre cómo se compiló el paquete. Este fichero de estado es utilizado por el IDE para comprobar si es necesaria una actualización.

   Por ejemplo: gtkopengl.compiled:

<delphi> <?xml version="1.0"?>

<CONFIG>
  <Compiler Value="/usr/bin/ppc386" Date="781388725"/>
  <Params Value=" -Rintel -S2cgi -CD -Ch8000000 -OG1p1
    -Tlinux -gl -vewnhi -l -Fu../../../lcl/units
    -Fu../../../lcl/units/gtk -Fu../../../packager/units
    -Fu. -FElib/ gtkopengl.pas"/>
</CONFIG></delphi>
  • El IDE abre automáticamente todos los paquetes necesarios. Es decir, abre todos los paquetes instalados, todos los marcados para instalación (instalación automática), los que tengan un archivo en edición, todos los necesarios por el proyecto y todos los que necesiten otros paquetes. Los paquetes innecesarios son descargados automáticamente.
  • El IDE núnca abre dos paquetes que se llaman igual al mismo tiempo. Cuándo el usuario abre un paquete con el mismo nombre que uno abierto el IDE solicita sustituir el anterior.
  • El IDE mantiene dos conjuntos adicionales de paquetes: Los paquetes instalados y los paquetes de instalación automática, que serán enlazados al IDE en la siguiente compilación. SE crean dos nuevos archivos en el directorio de configuración staticpackages.inc y idemake.cfg. Ahora se lanzará make ide OPT=@/path/to/your/config/idemake.cfg para compilar el nuevo IDE.

Consejos y sugerencias

   Por favor, añada cualquier consejo, sugerencia o error aquí.

  • Para renombrar un paquete utiliza 'Archivo -> Guardar Como...'.
  • Configuración de paquete

   Utilizamos tiOPF como ejemplo. El paquete tiOPF tiene esta estructura de directorios, debido al hecho de que se compila para FPC, Delphi 5-7, D2005 y D200.

 Source                <= ruta completa \Programming\3rdParty\tiOPF\Source
  \Compilers
     \Delphi7          <= el paquete para Delphi 7 está aquí
     \D2005
     \FPC              <= el archivo tiOPF.lpk está aquí
  \Core                <= archivos de la unidades del núcleo
  \Options             <= archivos de unidades opcionales para características adicionales
  \GUI

   Usando este ejemplo, se añade en la ventana de edición del paquete en "botón Opciones - pestaña Uso - Unidad" las siguientes rutas:

 "$(PkgOutDir);..\..\Core;..\..\Options;..\..\GUI" 

   que se añadirán a cualquier proyecto que utilice el paquete.

Añadir componentes existentes a un paquete

   Si se quiere añadir un archivo que contiene un componente a un paquete existente, hay que hacer los siguiente:

  • Abrimos el archivo del paquete.
  • En la ventana de edición pulsamos el botón 'Añadir' para añadir un nuevo elemento al paquete.
  • Seleccionamos la pestaña Añadir Unidad del diálogo Añadir a paquete.
  • Seleccionamos el archivo que queremos añadir.
  • Marca Tiene procedimiento de registro si la unida contiene un procedimiento de registro del componente. Sin esto el componente no se mostrará en la paleta de componentes.
  • Pulsa el botón Añadir Unidad.
  • Vuelve a compilar e instalar el paquete.

   Y ya está, el componente aparecerá en la paleta de componentes.

El procedimiento de registro (procedure Register;)

   Para mostrar el componente en la paleta de componentes, hay que registrarlo en el IDE de Lazarus. Para ello se utiliza el procedimiento de registro.

   Este procedimiento que debe aparecer en la sección interfaz de la unidad, y en el mismo se realizarán una o más llamadas a RegisterComponent, así mismo instalará los editores de componentes y propiedades.

   En un paquete puede haber uno o más procedimientos; en el editor de paquetes hay que indicar la unidad que contiene el procedimiento de registro, para que Lazarus sepa cuál debe llamar cuándo se instala el paquete.

    Hay dos formas de marcar la unidad que contiene el procedimiento de registro:

   Hay que volver a compilar e instalar el paquete después de cambiar las propiedades.

Search paths

All search paths are stored relative to the directory of the .lpk file. If you use an absolute path you have either not understood packages or you don't care.

Each package has two types of search paths:

  • Paths in the Compiler Options are used to compile the package itself.
  • Paths in the Options / Usage are used by packages and projects that require this package,

Design Time vs Run Time package

  • A package can be a design time package, run time package or both.
  • A design time package can be installed in the IDE and provides IDE extensions like new components, new file or project types, new menu items, new component or property editors, etc.
  • A run time package can be used by projects.
  • A run time only package should not be installed in the IDE, for example because it is incompatible with the LCL. The IDE will warn if a developer tries to install it.
  • A design time only package should not be used by projects. For example when it only contains IDE extensions. The IDE will warn if a developer to tries to add it.
  • These restrictions are not hard. For example to test a design time package you may want to use it in a test project.

Typical scenario for a run time and design time package

You have a component library called Awesome and you want to write some IDE editors for some special properties. For example a property editor for the property Datafile which shows a TOpenDialog to let the user select a file. You can put the components into one run time package named AwesomeLaz.lpk' and create another directory design for the design time package AwesomeIDELaz.lpk. Move all units containing the IDE editors and registering stuff into the design directory. Add a dependency in AwesomeIDELaz to AwesomeLaz. Make sure they do not share units or search paths. For an example see components/turbopower_ipro/: The run time package is turbopoweripro.lpk and the design time package is design/turbopoweriprodsgn.lpk.

For Delphians: I can not install a run time package, why not?

Installing a package means compiling the whole code into the IDE. A run time package does not contain code for the IDE or maybe even bites it. In order to use a package in your project, simple open the package, right click on the package editor for the popup menu and click Add to project. Or use View / Project Inspector. The project inspector shows what packages are used by your project, you can add dependencies or delete them.

Links

How To Write Lazarus Component - a tutorial about creating a new component.

Contribuciones y comentarios