Lazarus Resources/es

From Free Pascal wiki
Jump to: navigation, search

Deutsch (de) English (en) español (es) français (fr) 한국어 (ko) русский (ru)

   Los archivos de recursos contienen información que debe ser compilada en el archivo exe. Esos datos pueden ser imágenes, tablas de cadenas, la información de versión, ... incluso un manifiesto Windows XP y formularios. Con ello se incluyen datos que el programador puede recuperar en su código (acceso a los mismos como si fuesen archivos). El uso de recursos puede ser útil si quiere distribuir ejecutables autónomos .

En las versiones previas a la 2.4 de FPC no era posible utilizar los recursos "normales", archivos de recursos (*. res), en Lazarus, ya que son específicos de win32. Si queremos utilizar los recursos de todos modos, tendremos que volver a crearlos con lazres. Lazres se encuentra en el directorio de herramientas de la carpeta de instalación de Lazarus (tal vez antes haya que compilarlo).

   Ahora ya podemos compilar archivos de recursos de Lazarus (*.lrs) desde la línea de ordenes. La sintaxis para lazres es:

lazres <nombre del archivo de recursos> <archivo1 (archivo2 archivo3 ...)>

Por Ejemplo:

lazres mirecursolazarus.lrs un_icono.ico

   Para utilizar un archivo de recursos de Lazarus en tus proyectos incluye el archivo correspondiente con la directiva del compilador $I en la sección de inicio (initialization) de la unidad.

   Puedes acceder a los datos de los recursos con el método LoadFromLazarusResource de los objetos que contendrán los contenidos de los archivos. LoadFromLazarusResource necesita un parámetro de cadena que indica qué objeto debe ser cargado desde el archivo de recursos.

Ejemplo:

 ...
 procedure ejemploproc;
 var
   icono: TIcon;
 begin
   icono := TIcon.Create;
   icono.LoadFromLazarusResource('un_icono');
 end;
 
 initialization
   {$I mirecursolazarus.lrs}
 ...

   Mediante {$I mirecursolazarus.lrs} incluimos el archivo mirecursolazarus.lrs en la unidad compilada. En el procedimiento ejemploproc creamos la variable icono de tipo TIcon y cargamos en ella el objeto de nombre "un_icono" del archivo de recursos. El archivo que compiló en el archivo de recursos fue probablemente el de nombre un_icono.ico.

   Todas las clases que se derivan de TGraphic contienen el procedimiento LoadFromLazarusResource.

El archivo de recursos Lazarus del formulario

   Lazarus genera un archivo .lrs del archivo de formulario .lfm. Pero no lo hace de forma automática si no existe el archivo .lrs; en esta situación FPC dará al compilar un mensaje como este: ERROR: unidad001.pas(24,4) Fatal: Can't open include file "unidad001.lrs".

   Para solucionarlo podemos utilizar lazres: (LazarusDir)\tools\lazres unidad001.lrs unidad001.lfm. En linux: ~$ lazres unidad001.lrs unidad001.lfm.

   La forma más sencilla de rehacer un archivo .lrs es realizar un cambio trivial en el diseño del formulario, deshacerlo y guardar el formulario; así no necesitaremos recurrir a lazres. Vincent 09:47, 6 enero 2009 (CET)

Obtener los datos en bruto de un recurso lrs

   Puedes recuperar los datos de un recurso tal como se muestra en este código:

 uses ...LResources...;
 
 ...
 procedure TForm1.FormCreate(Sender: TObject);
 var
   r: TLResource;
   Datos: String;
 begin
   r:=LazarusResources.Find('archivoDatos1');
   if r=nil then raise Exception.Create('No existe el recurso archivoDatos1');
   Datos:=r.Value;
   ...procesar los datos...
 end;

Recursos FPC

   A partir de FPC 2.4 se puede utilizar archivos estándar .rc (script de recursos) y .res (compilado de recursos)en tu proyecto para incluir los recursos. Para convertir la secuencia de comandos del archivo .rc usado en el código fuente en un recurso binario (archivo .res), FPC ejecuta el compilador externos adecuado para los recursos (windres o GoRC). Por lo tanto el compilador de recursos tiene que estar instalado y presente en la variable de entorno PATH.

   Para simplificar el proceso de compilación, es posible utilizar únicamente los recursos compilados en los archivos .res. Puedes precompilar los recursos con cualquier compilador de recursos disponible -windres (disponible en sistemas Unix y Windows), GoRC (sólo Windows), compilador de recursos de Microsoft (rc.exe, incluido en Visual Studio), compilador de recursos Borland (Brcc32.exe, incluido en Delphi, C++ Builder o productos RAD Studio) o cualquier otro.

   Utiliza las directivas {$R nombreArchivo.rc} o {$R nombreArchivo.res} para incluir un archivo de recursos en el ejecutable. FPC RTL ofrece dos funciones de bajo nivel, así como clases de alto nivel para acceder a los recursos.


   Las funciones de bajo nivel son:

  • EnumResourceTypes
  • EnumResourceNames
  • EnumResourceLanguages
  • FindResource
  • FindResourceEx
  • LoadResource
  • SizeofResource
  • LockResource
  • UnlockResource
  • FreeResource

   Son compatibles con las funciones API de Windows: [1]

   La clase principal que se utiliza para trabajar con los recursos es TResourceStream. La LCL la utiliza para cargar bitmaps incrustados, iconos y los formularios. Mira TGraphic.LoadFromResourceID o TIcon.LoadFromResourceHandle para ver cómo se utilizan dentro de la LCL.

Añadir recursos a tu programa

   Vamos a revisar la situación cuando necesitas almacenar ciertos datos dentro de tu ejecutable y durante la ejecución del programa se desea extraer estos datos del mismo.

   En primer lugar tenemos que indicar al compilador qué archivos queremos incluir en el recurso. Esto lo hacemos en un archivo .rc (secuencia de comandos de recursos):    Archivo MisDatos.rc:

 MISDATOS         RCDATA "misdatos.dat"

   Donde MISDATOS es el nombre del recurso, RCDATA es el tipo del recurso ( ver http://msdn.microsoft.com/en-us/library/ms648009(VS.85).aspx para la explicación de los posibles tipos) y "misdatos.dat" es tu archivo de datos.


   Vamos a indicar al compilador que incluya el recurso en el proyecto:

 program misdatos;
 
 {$R MisDatos.rc}
 begin
 end.
   Silenciosamente, el compilador FPC indica ahora al compilador de recursos distribuidos con FPC a leer el guión .rc para compilar tus archivos de datos en un archivo binario .res de recursos. El enlazador entonces incluirá este en el ejecutable. Aunque esto es transparente para el programador, puedes, si lo deseas, crear su propio archivo .res con, por ejemplo el compilador de recursos de Borland. Ene ste caso, en lugar de utilizar
 {$R MisDatos.rc}
habrá que utilizar
 {$R MisDatos.res}
.

Usar los recursos en tu programa

   Ahora vamos a extraer los recursos alamecandos en un archivo, v.g. misdatos.dat:

 program mydata;
 uses
   SysUtils;
  {$R misdatos.res}
 var
   S: TResourceStream;
   F: TFileStream;
 begin
   // crear un flujo derecursos que apunta al recurso
  S := TResourceStream.Create(HInstance, 'MISDATOS', 'RT_RCDATA'); 
  try
    // crear el archivo misdatos.dat en el directorio de la aplicación
    F := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'misdatos.dat', fmCreate); 
    try
      F.CopyFrom(S, S.Size); // copiar los datos desde el flujo de recurso al flujo de archivo
    finally
      F.Free; // liberar el flujo de archivo
    end;
  finally
    S.Free; // liberar el flujo del recurso
  end;
 end.

Autores y Colaboradores

JayK 21:35, 4 Nov 2005 (CET)
Versión castellana por Iskraelectrica 11 de diciembre de 2009