Você está na página 1de 9

1

Você está em

DevMedia

Artigo

Invista em você! Saiba como a DevMedia pode ajudar sua


carreira.

Resources no Delphi: Como embutir


arquivos no executável
Aprenda neste artigo a embutir textos, imagens, sons, DLLs e outros recursos dentro do executável
e reutilizá-los quando necessário.

Anotar Marcar como concluído

Artigos

Delphi

Resources no Delphi: Como embutir arquivos no executável

Para gerar um executável pequeno, uma das práticas mais utilizadas é a de


modularizar o projeto em vários EXEs, DLLs, BPLs, e manter separados os
arquivos auxiliares de texto, imagens ou sons. Essa prática é útil para diminuir o
21
tráfego de arquivos durante as atualizações do sistema, executando o update1
apenas daqueles que realmente sofreram modificações.

Você está em
No entanto, caso seja necessário manter um único arquivo para todo o sistema, o
DevMedia
Delphi oferece a possibilidade de trabalhar com resources, uma forma de
embutir arquivos externos dentro do executável e acessá-los posteriormente
quando necessário.

Nesse artigo veremos como utilizar essa funcionalidade a partir do Delphi 2010,
versão na qual o IDE passou a oferecer uma interface amigável para gerenciar os
recursos.

Saiba mais sobre o Delphi no Guia de Referência

Adicionando arquivos ao projeto

Embora esse recurso exista desde a versão 3 do Delphi, a forma de incorporar


arquivos externos ao executável foi melhorada significativamente a partir da
versão 2009. Atualmente, é possível utilizar um gerenciador de recursos que pode
ser acessado através do menu Project > Resources and Images. Na Figura 1 é
possível observar diversos arquivos adicionados através da tela de gerenciador de
recursos.

21
1

Você está em

DevMedia

Figura 1. Tela de gerenciamento de Resources

Assim que os arquivos são adicionados, eles aparecem no Projetct Manager do


Delphi, onde você poderá selecioná-los e alterar suas propriedades no Object
Inspector conforme mostra a Figura 2.

Figura 2. Project Manager com arquivos adicionados aos recursos


21
Uma vez que os arquivos tenham sido adicionados, quando o projeto é compilado,
1

é gerado um arquivo de texto com extensão *.rc, que contém em cada linha um
“alias” (apelido) para referenciar o arquivo, seu caminho físico e o tipo de dado do
Você está em

DevMedia
recurso. O conteúdo desse arquivo referente à Figura 2 pode ser visto na
Listagem 1.

Listagem 1. Conteúdo do arquivo ProjectResourcesTestResource.rc

1 WAVRelogio RCDATA "8672.mp3"


2 DllAuxiliar RCDATA "auxiliar.dll"
3 ExeCalc RCDATA "calc.exe"
4 IMGDevmediaLogo RCDATA "devmedia2peq.PNG"
5 TXTuf RCDATA "Siglas-UF.txt"
6 IMGPredio BITMAP "Company-icon.bmp"

Depois do arquivo *.rc ter sido gerado, o Delphi o compila em uma versão
intermediária com extensão *.dres, que será utilizada durante o processo de
linkagem e posteriormente gerará um novo arquivo de extensão *.res, que
finalmente é encapsulado dentro do executável.

Reutilizando arquivos de texto

Os arquivos que não se encaixam nos padrões pré-definidos para resources


(bitmaps, ícones e arquivos de fontes), como os de texto, são encapsulados como
um tipo binário denominado RCData. A partir disso, para acessá-los, é necessário
fazer uso de uma classe denominada TResourceStream , que permite carregar o

arquivo em qualquer componente que tenha uma propriedade do tipo TStrings ,

utilizando para isso uma única linha de código. Por exemplo, podemos carregar
facilmente o conteúdo do arquivo e exibi-lo em um ListBox com o seguinte
21
comando:
1
1 ListBox1.Items.LoadFromStream(TResourceStream.Create(HInstance,'TXTu

Você está em

DevMedia

Ao instanciar a classe TResourceStream na chamada do método LoadFromStream

da classe TStrings , por exemplo, é necessário passar ao menos três parâmetros:

uma variável de ponteiro chamada HInstance , o “alias” que faz referência ao


recurso e uma constante que representa o tipo de dado no qual o recurso está
armazenado no executável.

Reutilizando arquivos de imagens

Os arquivos de imagem podem ser reutilizados de duas formas, dependendo do


seu tipo. Caso sejam imagens de ícones, arquivos *.bmp e cursores, existe o
método LoadFromResourceName , que permite carregá-los com apenas uma linha de

código:

1 Image2.Picture.Bitmap.LoadFromResourceName(HInstance,'IMGPredio');

Observe que por se tratar de uma imagem com extensão *.bmp, o método não
contém rotinas de conversão adicionais, algo que não ocorre com imagens de
outros formatos, que são compiladas como binários.

A segunda forma é utilizada quando tratamos de imagens do tipo PNG ou JPEG,


por exemplo, casos em que é preciso utilizar classes que tratem adequadamente o
recurso. Podemos ver um exemplo disso na Listagem 2.

21
Listagem 2. Exemplo de reutilização de um uma imagem *.png como resource
1

Você está1em procedure TForm3.Button2Click(Sender: TObject);


2
DevMedia var
3 png: TPngImage;
4 begin
5 png:=TPngImage.Create;
6 png.LoadFromResourceName(HInstance, 'IMGDevmediaLogo');
7 Image1.Picture.Graphic:=png;
8 end;

Linha 05: Instanciamos um objeto do tipo TPngImage ;


Linha 06: O método LoadFromResourceName recebe o “alias” da imagem do
tipo *.png que foi compilada como RCData ;
Linha 07: Atribuímos a instância png para a propriedade Graphic , que

resulta na exibição da imagem no componente.

Reutilizando arquivos de áudio, executáveis, DLLs,


entre outros

Os arquivos de tipos diferentes dos que vimos até agora também são compilados
como RCData , mas para utilizá-los é preciso extraí-los utilizando a combinação
das classes TResourceStream e TFileStream , conforme apresentado na Listagem

3. Nesse exemplo fizemos uso de um arquivo MP3, mas o mesmo código serviria
para os demais tipos, como executáveis ou DLLs.

Listagem 3. Exemplo de reutilização de um arquivo MP3 como resource

procedure TForm3.btnExecutarMP3(Sender: TObject);


var
21
fs: TFileStream;
5 rs: TResourceStream;
1
6 s : string;
7 m : TMediaPlayer;
8 begin
Você está em
9 rs := TResourceStream.Create(hInstance, 'WAVRelogio', RT_RCDATA);
DevMedia
10 s := ExtractFilePath(Application.ExeName)+'file.mp3';
11 fs := TFileStream.Create(s,fmCreate);
12 rs.SaveToStream(fs);
13 fs.Free;
14
15 MediaPlayer.Close;
16 MediaPlayer.FileName:=s;
17 MediaPlayer.Open;
18 MediaPlayer.Play;
end;

Linha 08: Instanciamos um TResourceStream , passando como parâmetro o

“alias” do arquivo MP3 e o tipo de dado ( RCData );


Linha 09: Atribuímos à variável string o caminho de um diretório para
extrair o arquivo;
Linhas 10 e 11: Instanciamos a classe TFileStream , passando o caminho

onde o arquivo será criado. Na sequência, salvamos todo o conteúdo do


resource carregado na linha 8 no arquivo; Linhas 14 a 17: Executamos o
arquivo MP3 extraído do executável.

Embora sejam muito úteis para transportar arquivos no próprio executável e


reutilizá-los dentro do sistema, deve-se ter cuidado com o uso de resources. Como
não há uma compactação efetiva do arquivo, seu tamanho normalmente acaba
aumentando mais do que o esperado.

Tecnologias:

Delphi
21
Anotar Marcar como concluído 1

Você está em

DevMedia

Confira outros conteúdos:

Instalando o ACBr Mapeamento Objeto-Relacional com


TMS...

12x
Em caso de dúvidas chame no whatsapp

PLANO PRO

Formação FullStack completa


Projetos reais
Professores online
Exercícios gamificados
Certificado de autoridade
21
MATRICULE-SE 1

Você está em

DevMedia

Por Hélio
Em 2016

Quem Somos

Planos de estudo

Fale conosco

Plano para Instituição de ensino

Assinatura para empresas

Assine agora

Hospedagem web por Porta 80 Web Hosting.

21

Você também pode gostar