Anda di halaman 1dari 9

Resources no Delphi: Como embutir arquivos no executvel

Aprenda neste artigo a embutir textos, imagens, sons, DLLs e outros recursos dentro do
executvel e reutiliz-los quando necessrio.
(11) (0)

#ShowMeTheCode

Motivao

Para gerar um executvel pequeno, uma das prticas mais utilizadas a de modularizar o projeto em vrios EXEs, DLLs, BPLs, e manter
separados os arquivos auxiliares de texto, imagens ou sons. Essa prtica til para diminuir o trfego de arquivos durante as atualizaes do
sistema, executando o update apenas daqueles que realmente sofreram modificaes.

No entanto, caso seja necessrio manter um nico arquivo para todo o sistema, o Delphi oferece a possibilidade de trabalhar com resources,
uma forma de embutir arquivos externos dentro do executvel e acess-los posteriormente quando necessrio.

Nesse artigo veremos como utilizar essa funcionalidade a partir do Delphi 2010, verso na qual o IDE passou a oferecer uma interface
amigvel para gerenciar os recursos.

Saiba mais sobre o Delphi no Guia de Referncia

Adicionando arquivos ao projeto

Embora esse recurso exista desde a verso 3 do Delphi, a forma de incorporar arquivos externos ao executvel foi melhorada
significativamente a partir da verso 2009. Atualmente, possvel utilizar um gerenciador de recursos que pode ser acessado atravs do
menu Project > Resources and Images. Na Figura 1 possvel observar diversos arquivos adicionados atravs da tela de gerenciador de
recursos.

Figura 1. Tela de gerenciamento de Resources

Assim que os arquivos so 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

Uma vez que os arquivos tenham sido adicionados, quando o projeto compilado, gerado um arquivo de texto com extenso *.rc, que
contm em cada linha um alias (apelido) para referenciar o arquivo, seu caminho fsico e o tipo de dado do recurso. O contedo desse
arquivo referente Figura 2 pode ser visto na Listagem 1.

WAVRelogio RCDATA "8672.mp3"

DllAuxiliar RCDATA "auxiliar.dll"

ExeCalc RCDATA "calc.exe"

IMGDevmediaLogo RCDATA "devmedia2peq.PNG"

TXTuf RCDATA "Siglas-UF.txt"

IMGPredio BITMAP "Company-icon.bmp"

Listagem 1. Contedo do arquivo ProjectResourcesTestResource.rc

Depois do arquivo *.rc ter sido gerado, o Delphi o compila em uma verso intermediria com extenso *.dres, que ser utilizada durante o
processo de linkagem e posteriormente gerar um novo arquivo de extenso *.res, que finalmente encapsulado dentro do executvel.

Reutilizando arquivos de texto

Os arquivos que no se encaixam nos padres pr-definidos para resources (bitmaps, cones e arquivos de fontes), como os de texto, so
encapsulados como um tipo binrio denominado RCData. A partir disso, para acess-los, necessrio 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 cdigo. Por exemplo, podemos carregar facilmente o contedo do arquivo e exibi-lo em um ListBox com o
seguinte comando:

ListBox1.Items.LoadFromStream(TResourceStream.Create(HInstance,'TXTuf',RT_RCDATA));

Ao instanciar a classe TResourceStream na chamada do mtodo LoadFromStream da classe TStrings, por exemplo, necessrio
passar ao menos trs parmetros: uma varivel de ponteiro chamada HInstance, o alias que faz referncia ao recurso e uma constante
que representa o tipo de dado no qual o recurso est armazenado no executvel.
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 mtodo LoadFromResourceName, que permite carreg-los com apenas uma linha de cdigo:

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

Observe que por se tratar de uma imagem com extenso *.bmp, o mtodo no contm rotinas de converso adicionais, algo que no ocorre
com imagens de outros formatos, que so compiladas como binrios.

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.

01 procedure TForm3.Button2Click(Sender: TObject);

02 var

03 png: TPngImage;

04 begin

05 png:=TPngImage.Create;

06 png.LoadFromResourceName(HInstance, 'IMGDevmediaLogo');

07 Image1.Picture.Graphic:=png;

08 end;

Listagem 2. Exemplo de reutilizao de um uma imagem *.png como resource

Linha 05: Instanciamos um objeto do tipo TPngImage;

Linha 06: O mtodo LoadFromResourceName recebe o alias da imagem do tipo *.png que foi compilada como RCData;

Linha 07: Atribumos a instncia png para a propriedade Graphic, que resulta na exibio da imagem no componente.

Reutilizando arquivos de udio, executveis, DLLs, entre outros

Os arquivos de tipos diferentes dos que vimos at agora tambm so compilados como RCData, mas para utiliz-los preciso extra-los
utilizando a combinao das classes TResourceStream e TFileStream, conforme apresentado na Listagem 3. Nesse exemplo fizemos
uso de um arquivo MP3, mas o mesmo cdigo serviria para os demais tipos, como executveis ou DLLs.

01 procedure TForm3.btnExecutarMP3(Sender: TObject);

02 var

03 fs: TFileStream;

04 rs: TResourceStream;

05 s : string;

06 m : TMediaPlayer;
07 begin

08 rs := TResourceStream.Create(hInstance, 'WAVRelogio', RT_RCDATA);

09 s := ExtractFilePath(Application.ExeName)+'file.mp3';

10 fs := TFileStream.Create(s,fmCreate);

11 rs.SaveToStream(fs);

12 fs.Free;

13

14 MediaPlayer.Close;

15 MediaPlayer.FileName:=s;

16 MediaPlayer.Open;

17 MediaPlayer.Play;

18 end;

Listagem 3. Exemplo de reutilizao de um arquivo MP3 como resource

Linha 08: Instanciamos um TResourceStream, passando como parmetro o alias do arquivo MP3 e o tipo de dado (RCData);

Linha 09: Atribumos varivel string o caminho de um diretrio para extrair o arquivo;

Linhas 10 e 11: Instanciamos a classe TFileStream, passando o caminho onde o arquivo ser criado. Na sequncia, salvamos todo o contedo do resource carregado na linha 8 no
arquivo;

Linhas 14 a 17: Executamos o arquivo MP3 extrado do executvel.

Embora sejam muito teis para transportar arquivos no prprio executvel e reutiliz-los dentro do sistema, deve-se ter cuidado com o uso de
resources. Como no h uma compactao efetiva do arquivo, seu tamanho normalmente acaba aumentando mais do que o esperado.
Publicado no Canal Delphi

Guia Desenvolvimento em Delphi +

por Hlio Carlos

Delphi na veia (!)

Ajude-nos a evoluir: voc gostou do post? (11) (0)

Compartilhe:

Publicado em 2016

Ficou com alguma dvida?


Ueder Caetano

Muito bom esse artigo.


T show.
Posso colocar um arquivo de configurao inicial pra ser executado na primeira vez ou quando no existir outro ?

h 19 dias

Douglas

Opa Ueder, beleza?

Contactamos o autor e estamos tralhando na sua dvida.


Pode ficar tranquilo que vamos trazer uma resposta em at 24 horas.

Um forte abrao.

h 19 dias

Gutierry Pereira

consultor

Opa, Boa tarde meu caro.


No sei se entendi bem sua pergunta.
Oque deseja e verificar se existe um arquivo de configurao se no vc ir utilizar um padro ? Correto ?
Se isso, sim. Voc pode fazer um teste se o arquivo de configurao se encontra na pasta desejada, se no, voc pode carregar dos recursos que estaro
empacotados com o exe.
Voc ainda pode alm de s ler o arquivo de configurao, pode descarregar este arquivo no diretrio desejado. Assim facilitar a edio do arquivo
pelo cliente.

Qualquer coisa estou a disposio.

Att: Gutierry Antonio


h 19 dias

Ueder Caetano

Opa muito obrigado, era justamente isso que estava na dvida.


Pois fica muito mais portvel dessa forma.
Valeu mesmo, Gutierry...

h 18 dias

Gutierry Pereira

consultor

Nada eu caro,
Bom ter ajudado.

Qualquer coisa estou a disposio.

Att: Gutierry Antonio

h 18 dias

Arthur Jardim

Ol Helio, contedo muito interessante, obrigado.


Minha duvida se ao abrir o sistema ele j carregaria todos esses recursos que adicionei diretamente na memoria. ou ele vai carregando conforme eu
for usado?

h +1 ms
Douglas

Opa Arthur, tudo tranquilo?

uma tima pergunta ;)


Contactei o autor Hlio e estamos trabalhando na sua dvida.
Fique tranquilo que vamos trazer uma resposta em at 8 horas.

Um forte abrao.

h +1 ms

[autor] Hlio Devmedia

consultor

Ol Artur, tudo bem?

Ocorre as duas coisas, carregado o cdigo binrio do resource junto com o executvel em memria, mas a medida que voc extrai o contedo do
resource para instncias prprias (uma imagem para um TImage por exemplo) o consumo de memria aumenta para acoplar as instncias e quando
voc destri, ele libera a memria.

O interessante que isso acontece com todos os executveis, ento no h porque se preocupar, ocorreria da mesma forma que acontece com um
software que no usa resources...

Espero ter esclarecido. Fique com Deus e um forte Abrao.

h +1 ms

Arthur Jardim

Muito bom Hlio, isso era uma curiosidade mesmo que eu tinha, muito obrigado.

h +1 ms

[autor] Hlio Devmedia

consultor
Obrigado pelo retorno. Muito sucesso Profissional e fique com Deus.

h +1 ms

Gladstone Gomes

interessante, sempre tive essa dvida tambm... belissimo post, parabens! :D

h +1 ms