may 052013
 

Buenas,

Un archivo de recursos es un tipo de archivos que nos permite almacenar datos que posteriormente se añadirán a nuestra aplicación en la compilación para ser usados por ésta.

Lo primero que necesitaremos es un archivo de texto (script) en el que se especificarà el nombre del recurso, el tipo de recurso y el recurso propiamente dicho. Los tipos de recurso pueden ser los siguientes:

RT_ACCELERATOR Accelerator table
RT_BITMAP Bitmap resource
RT_DIALOG Dialog box
RT_FONT Font resource
RT_FONTDIR Font directory resource
RT_MENU Menu resource
RT_RCDATA Application-defined resource (raw data)
RT_STRING String-table entry
RT_MESSAGETABLE Message-table entry
RT_CURSOR Hardware-dependent cursor resource
RT_GROUP_CURSOR Hardware-independent cursor resource
RT_ICON Hardware-dependent icon resource
RT_GROUP_ICON Hardware-independent icon resource
RT_VERSION Version resource

 

Estos archivos de script llevan extensión .rc y han de tener un formato como el que sigue:

TGMMap         BITMAP    "GMMap.bmp"
RES_MAPCODE    RCDATA    "map.html"

Donde la primera columna es el nombre del recurso, la segunda es el tipo de recurso y la tercera es el recurso propiamente dicho.

Una vez tenemos nuestro fichero .rc terminado, tenemos que compilarlo. Para ello usaremos el compilador de recursos de Borand (brcc32.exe) que se distribuye con cualquier versión de Delphi y está localizado en la carpeta bin de la instalación. Así pues, desde línea de comandos ejecutamos la siguiente instrucción:

brcc32 MiArchivoDeRecursos.rc

Esto generará un archivo con el mismo nombre pero con extensión .res que será el archivo de recursos que añadiremos a nuestra aplicación. Por lo general, lo que suele hacerse es crear un archivo de comandos con esta instrucción para facilitarnos el trabajo.

Para añadirlo a la aplicación, Delphi dispone de la directiva de compilación $R que podemos usar de la siguiente manera:

{$R MiArchivoDeRecursos.RES}

Para más información sobre esta directiva visitar la documentación en Embarcadero.

Ahora ya sólo nos queda usar los recursos del fichero desde la aplicación. Para ello, la unit Windows nos provee una serie de funciones llamadas LoadXXXX donde XXXX es el tipo de recurso a cargar, como por ejemplo:

function LoadBitmap
function LoadCursor
function LoadAccelerators
function LoadString
.....

Para ver cómo funcionan, lo mejor es un ejemplo, en el cual mostraré cómo cargaríamos nuestra imagen “GMMap.bmp” llamada “TGMMap” en un TImage.

var 
  Bmp: TBitmap;
begin
 Bmp := TBitmap.Create;
 try
  Bmp.Handle := LoadBitmap(hInstance, 'TGMMap');
  Image1.Width := Bmp.Width;
  Image1.Height := Bmp.Height;
  Image1.Canvas.Draw(0,0,Bmp);
 finally
  Bmp.Free;
 end;
end;

Lo primero que hace es crear un TBitmap en el que cargaremos la imagen mediante la función LoadBitmap. Esta función recibe 2 parámetros (como la mayoría de las demás funciones), el primero es el handle a la instancia (hInstance es una variable global) y el segundo el nombre del recurso. Luego le da las medidas al TImage y muestra la imagen mediante el Canvas. Y para finalizar, libera el bitmap creado.

No obstante esto, hay muchos componentes Delphi que ya están preparados para cargar de forma directa uno de nuestros recursos encapsulando así este trabajo, como por ejemplo el propio TImage:

begin
 Image1.Picture.Bitmap.LoadFromResourceName(hInstance,'TGMMap');
end;

Con los archivos de recursos, la imaginación es nuestra única limitación a la hora de acompañar nuestra aplicación de características, ya que podemos  incluir desde una simple cadena, a archivos de música, pasando por imágenes, cursores,…. Y todo ello en un mismo archivo (nuestra aplicación) por lo que ya estará todo cargado en memoria cuando queramos usarlo.

Espero os sea de utilidad.

Nos leemos

  2 Responses to “Ficheros de recursos”

  1. Interesante, como siempre Xavier.
    Me ha sorprendido el RT_ACCELERATOR, no lo conocía. Tengo que revisarlo…

    Un saludo.

    ______________________________
    Germán

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)