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:
    Exemplo de arquivo de recurso contendo Bitmap
  • 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.
    Image com bmp do arquivo de recursos
    Image com bmp do arquivo de recursos
  • 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:
      Aquivos de recursos de nome MExcecoes
    • 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:
      Mensagem erro de divisão por zero
  • 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.


Clube Delphi edição 7
Esse artigo faz parte da revista Clube Delphi edição 7. Clique aqui para ler todos os artigos desta edição.
Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML.