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
Interesante, como siempre Xavier.
Me ha sorprendido el RT_ACCELERATOR, no lo conocía. Tengo que revisarlo…
Un saludo.
______________________________
Germán
Gracias Germán.
A mi me sorprendéis siempre vosotros con vuestros artículos jejeje Si te sirve de consuelo, yo también desconocía el RT_ACCELERATOR. Es lo bueno que tiene investigar un tema para preparar un artículo, que siempre aprendes cosas nuevas 🙂
Un saludo