Quando você insere imagem em sua aplicação, através de um componente Image, normalmente atribui à propriedade Picture o nome do arquivo que contém a imagem. Neste caso, a imagem é compilada dentro de seu executável. Se você quiser mudar a imagem, deverá modificar o arquivo de sua aplicação, e recompilá-la. Para evitar isto, você pode colocar a imagem utilizada em um arquivo de recursos. Este arquivo, com extensão .RES, é compilado junto com seu programa. Se precisar modificar a imagem, basta modificá-la no arquivo de recursos, sem mexer na sua aplicação. Entre os recursos que uma aplicação contém podemos citar: bitmaps, ícones, menus, cursores, caixas de diálogo, tabelas de strings. Quando você compila sua aplicação, o Delphi sempre cria um arquivo de recursos com o mesmo nome de seu projeto. Este arquivo contém o ícone da aplicação. No arquivo de projeto da aplicação (.DPR), aparece a diretiva: {$R *.RES}
Esta diretiva manda o Delphi encontrar e recuperar o arquivo de recurso .RES com o mesmo nome da aplicação corrente. Este arquivo é criado e manipulado pelo Delphi, mas você pode criar um arquivo de recursos próprio, que você mesmo manipule.
Criando o Arquivo .RC
Para criar o arquivo de recursos, você inicialmente cria um arquivo com extensão .RC. Este arquivo é um arquivo texto (se for feito no Bloco de Notas, pode manter a extensão .TXT), no seguinte formato:
ID_recurso | tipo_de_recurso | arquivo_recurso |
---|---|---|
. | . | . |
. | . | . |
Onde tipo_de_recurso pode ser BITMAP, ICON, CURSOR, TEXT, MENU, DIALOG BOX, FONT ou STRINGTABLE.
Exemplo
Vamos criar um arquivo de recurso contendo um bitmap e um arquivo de texto. Para isso:
- Entre no Bloco de Notas
- Digite o seguinte texto:
- Salve o arquivo com o nome MeusRec.txt.
Um arquivo de recursos contendo mensagens de erros seria parecido com:
STRINGTABLE BEGIN ID1, “Mgs1” ID2, “Msg2” ID3, “Msg3” END
Criando o Arquivo .RES
O arquivo .RC deve ser compilado, transformando-se em um arquivo .RES. Para compilá-lo, use o programa BRCC32.EXE (no diretório\Arquivos de Programas\Borland\DelphiX\Bin), no prompt do DOS.
Exemplo
Vamos compilar o arquivo MeusRec.Txt, feito anteriormente, transformando-o no arquivo MeusRec.RES. Para isso:
- Abra o prompt do DOS;
- Vá para o diretório \Arquivos de Programas\Borland\Delphi X\Bin
- Digite então (não esqueça de colocar o path para o arquivo MeusRec.txt): brcc32 MeusRec.txt.
- Veja no Explorer que o arquivo MeusRec.RES é criado.
Anexando o Arquivo de Recurso na Aplicação
Para anexar o arquivo de recursos a sua aplicação, você deve digitar, após a linha {$R *.DFM} da unit que usará o recurso: {$R <NomeArqRecurso>.RES}.
Ligando os Recursos a Aplicação
-
Usando BitMaps
Para ligar um recurso do tipo bitmap do seu arquivo de recursos à propriedade Picture de um componente Image, utilize a função da API do Windows LoadBitMap:
LoadBitmap(Instancia: Thandle; NomeBitmap: Pchar): Hbitmap;
Onde Instancia é o handle da aplicação (armazenado na variável hInstance que o Delphi cria sempre que a aplicação é executada), e NomeBitmap é o nome do bitmap. A função LoadBitmap retorna um handle para o bitmap.
Para associar este handle à propriedade Picture do componente Image, é preciso lembrar que esta propriedade é na realidade um objeto Tpicture, que possui a propriedade BitMap, que representa o bitmap associado à Picture. A propriedade BitMap, por sua vez, é um objeto TbitMap que possui a propriedade Handle, que representa o handle para o bitmap usado em Picture. Portanto, para ligarmos o bitmap do arquivo de recursos à propriedade Picture do componente Image1, faríamos:
Image1.Picture.Bitmap.Handle:= LoadBitMap(hInstance, ‘Quimica’);
-
Exemplo
Vamos criar uma aplicação em Delphi que use o bitmap Bolhas.bmp, do nosso arquivo de recursos, em um componente Image.Para isso:
- Inicie uma aplicação
- Insira no formulário um componente Image:
- Salve a unit e o projeto na mesma pasta onde está o arquivo de recursos MeusRec.RES;
- Passe para a unit. Após a linha {$R *.DFM}, digite: {$R MeusRec.RES}.
- No evento OnCreate do formulário, insira o seguinte código:
procedure Tform1.FormCreate (Sender: Tobject); begin Image1.Picture.Bitmap.Handle:= LoadBitMap(hInstance, ‘Quimica’); end;
- Salve aplicação e execute-a. O bitmap Bolhas.bmp é mostrado no componente Image.
-
Usando Ícones ou Cursores
Além da função LoadBitMap, a API do Windows oferece as funções LoadIcon e LoadCursor, que funcionam de forma idêntica a LoadBitMap.
-
Usando Strings
Para ligar uma string de um arquivo de recurso a um componente, utilizamos a função da API do Windows LoadString:
LoadString(Instance: Thandle; ID: Word; Buffer: Pchar; BufferNax: Integer): Integer;
Onde Instancia é o handle para a aplicação, ID é identificador para a string no arquivo de recursos, Buffer é um espaço na memória para armazenar a string, e BufferMax é o tamanho máximo da string a ser armazenada no buffer.
-
Exemplo
Vamos criar uma aplicação contendo um botão que, ao ser clicado, mostra uma mensagem de um arquivo de recursos. Para isso:
- Crie um arquivo de recursos de nome MExcecoes, que contenha as mensagens de exceção. Veja o arquivo criado no Bloco de Notas, e salve-o com o nome MExcecoes.txt:
- Gere o arquivo MExcecoes.RES, usando o utilitário BRCC32.exe;
- Inicie então uma nova aplicação no Delphi;
- Insira um botão no formulário;
- Salve o projeto na mesma pasta do arquivo de recursos Mexcecoes.RES;
- Passe para a unit. Após a linha {$R *.DFM}, digite: {$R MExcecoes.RES};
-
Na cláusula type da seção interface, declare a exceção EErrorOne, que será usada posteriormente, e a
função GetError, que será criada:
type EerrorOne = class(Exception); Tform1 = class(Tform) Button1: Tbutton; procedure Button1Click(Sender: Tobject); private { Private declarations } public { Public declarations } end; function GetError(ID: Integer):string;
-
Crie uma função que associe as mensagens do arquivo de recursos a uma string (não esqueça de declarar
esta função):
function GetError(ID: Integer): string; var S: array[0..150] of Char; begin LoadString(Hinstance, ID, S, 150); Result := StrPas(S); end;
-
No evento Click do botão, vamos ligar a exceção gerada quando apertamos Button1 à mensagem número 1 de
nosso arquivo de recursos:
procedure Tform1.Button1Click(Sender: Tobject); begin raise EerrorOne.Create(GetError(1)); end;
- Salve a aplicação e execute-a Clique no botão. A seguinte mensagem será exibida:
-
Usando Menus
Para ligar um menu do recurso a um item de menu de seu aplicativo, utilize a função LoadMenu, da API do Windows:
LoadMenu(Instancia: Thandle; NomeMenu: Pchar): Hmenu;
Onde Instancia é o handle da aplicação, e NomeMenu é o nome do menu no arquivo de recursos. A função retorna um handle para o menu.
-
Internacionalizando o Aplicativo
Se você planeja exportar seu aplicativo para outros países, deve pensar seriamente em criar um arquivo .RES com todos os recursos utilizados. Isto porque, ao vender o aplicativo para um determinado país, basta traduzir as strings, os menus e mensagens do arquivo de recursos (e talvez mudar os ícones, para se aproximarem da realidade do país), sem modificar o aplicativo.