Académique Documents
Professionnel Documents
Culture Documents
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.
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.
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.
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.
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.
02 var
03 png: TPngImage;
04 begin
05 png:=TPngImage.Create;
06 png.LoadFromResourceName(HInstance, 'IMGDevmediaLogo');
07 Image1.Picture.Graphic:=png;
08 end;
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.
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.
02 var
03 fs: TFileStream;
04 rs: TResourceStream;
05 s : string;
06 m : TMediaPlayer;
07 begin
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;
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;
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
Compartilhe:
Publicado em 2016
h 19 dias
Douglas
Um forte abrao.
h 19 dias
Gutierry Pereira
consultor
Ueder Caetano
h 18 dias
Gutierry Pereira
consultor
Nada eu caro,
Bom ter ajudado.
h 18 dias
Arthur Jardim
h +1 ms
Douglas
Um forte abrao.
h +1 ms
consultor
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...
h +1 ms
Arthur Jardim
Muito bom Hlio, isso era uma curiosidade mesmo que eu tinha, muito obrigado.
h +1 ms
consultor
Obrigado pelo retorno. Muito sucesso Profissional e fique com Deus.
h +1 ms
Gladstone Gomes
h +1 ms