terça-feira, 28 de agosto de 2012

Imagem do executável em DLL




Vamos começar desenvolvendo um projeto em branco. Para isso abra o Delphi. File à New à Application;

Insira:

3 TBitBtn( bitConfirmar, bitCancelar, bitSair );
3 TSpeedButton( speConfirmar, speCancelar, speSair );
3 TImage( imgConfirmar, imgCancelar, imgSair );

Deixe o formulário conforme imagem a seguir:


Escolha, agora, 3 imagens BMP que pra você represente Sair, Cancelar e Confirmar. No meu caso eu escolhi as 3 que costumo usar em meus projetos.

Após a escolha das imagens, vamos fazer nossa DLL.

Crie uma pasta no C com o nome de Imagens_Projeto.
Dentro desta pasta coloque as 3 imagens que selecionou para nosso programa.
Renomeie estas imagens com os nomes Cancelas.BMP, Confirmar.BMP e Sair.BMP.
*É interessante criar a pasta e nomear as imagens conforme o nome sugerido para seguir os procedimentos deste artigo.

Criando o Arquivo RC

Agora, abra o bloco de notas e insira as linhas a seguir:

Cancelar                RCDATA "Cancelar.BMP"
Confirmar              RCDATA "Confirmar.BMP"
Sair                         RCDATA "Sair.BMP"



Salve este arquivo na pasta criada “Imagens_Projeto” como “Imagem.RC”

Explicação simples, porém necessária:

A primeira coluna é responsável pelo nome que nosso sistema irá referenciar no arquivo.
A coluna do meio é para identificação.
A última coluna é a figura.

Criando o Arquivo RES

Para criação deste arquivo.

Abra o prompt de comando e digite:

CD c:\Arquivos de Programas\Borland\Delphi6\Bin   //Dependendo da configuração de instalação do Delphi
brcc32.exe C:\Imagens_Projeto\Imagem.rc

Pronto!!!

Nosso arquivo está gerado.

Criando a DLL

Este processo é muito simples.

Para criar a DLL abra novamente o Delphi. File à New à Other e escolha DLL Wizard.

Localize a linha

{$R *.res}

Após esta linha insira a sintaxe:

{$R Imagem.RES}

Salve o projeto como DLL.

Compile o projeto na pasta “Imagens_Projeto” e será criada a DLL de nome dll.dll.

Aplicando as imagens em nosso projeto
Volte ao nosso projeto inicial.

Por se tratar de um projeto bem simples e para fins de exemplificação, irei desenvolver tudo em uma única Unit. Mas você deve, e, por favor, faça, dividindo-as.

Vamos lá!!!

Abaixo de uses vamos criar nosso tipo de dados. Conforme listagem abaixo.

type
   TImagem = ( tiConfirmar, tiCancelar, tiSair );

No código acima criamos o tipo TImagem podendo ser de 3 maneiras.

Abaixo do nosso tipo de dados iremos criar uma constante para a associação do nosso tipo de dados com a referência da figura em nossa DLL. Faça-o dessa forma:

const
   TArrayImagem : Array[TImagem] of String = ( 'Confirmar' , ‘Cancelar’  , ‘Sair’ );

No código acima fazemos a referência ao nosso tipo de dados.

Vamos declarar mais uma constante:

C_DLL = ‘Dll.dll’

Esta constante define o nome da dll que o sistema irá buscar na mesma pasta que o aplicativo.

Não acaba por aí. Agora devemos fazer uma função que retorne, conforme o tipo( TImagem ), a string referente ( TArrayImagem ).

Podemos fazer isso conforme o código abaixo.

function RetFigura( campo : TImagem ) : String;
begin
   Result := TArrayImagem[ campo ];
end;

Este código é muito simples. Recebe o nosso tipo de dados e retorna a string referente ao tipo informado.

Feito isso estamos próximos de terminarmos nosso aplicativo.

Vamos criar, agora, uma procedure que associe a imagem ao componente informado.

Segue abaixo:

procedure CarregaImagem( Componente : TControl ; Imagem : TImagem );
var
   DLL : THandle;
   BMP : TBitMap;
   ResourceStream : TResourceStream;
begin

   try
   BMP := TBitmap.Create();
   DLL := LoadLibrary(PChar(C_DLL));
   ResourceStream := TResourceStream.Create(DLL, RetFigura( Imagem ) , RT_RCDATA);
   BMP.LoadFromStream( ResourceStream );
   if (Componente is TSpeedButton) then
      (Componente as TSpeedButton).Glyph.Assign( BMP )
         else if (Componente is TBitBtn) then
            (Componente as TBitBtn).Glyph.Assign( BMP )
               else if ( Componente is TImage ) then
                  (Componente as TImage).Picture.Assign( BMP );
   finally
      FreeANDNIL( BMP );
      FreeLibrary(DLL);
      FreeAndNil(ResourceStream);
      end;

end;

No código acima carregamos nossa DLL.
Associamos a imagem ao BitMap criado, conforme função desenvolvida ( RetFigura ).
E exibimos no componente, seja ele, TSpeedButton, TBitBtn ou TImage.

Pronto! Agora é só associarmos as imagens aos nossos componentes.

No OnCreate do formulário informe o código

//Para os componentes de confirmação
CarregaImagem( bitConfirmar, tiConfirmar );
CarregaImagem( speConfirmar, tiConfirmar );
CarregaImagem( imgConfirmar, tiConfirmar );

//Para os componentes de cancelamento
CarregaImagem( bitCancelar, tiCancelar );
CarregaImagem( speCancelar, tiCancelar );
CarregaImagem( imgCancelar, tiCancelar );

//Para os componentes de saída
CarregaImagem( bitSair, tiSair );
CarregaImagem( speSair, tiSair );
CarregaImagem( imgSair, tiSair );

Execute o programa.

O resultado deverá ser semelhante a figura abaixo.


Conclusão

Bom, neste artigo aprendemos a criar uma DLL com imagens e associar as imagens que estão contidas nessa DLL a botões e imagens de nosso aplicativo.
Vale lembrar que este é um artigo para exemplo, sendo assim, fica a seu critério desenvolver novas funções, novas procedures e até mesmo alterar a forma de como desenvolvi. Dentre milhares dicas uma é configurar os botões com Tag’s e atribuir uma imagem dependendo da tag do botão. Usando-se um loop.

Lembrando de sempre que adicionarem uma imagem ao arquivo .rc a DLL deverá ser compilada e distribuída novamente.
E não esquecer de ao adicionar um tipo, fazer a sua referência nos arrays.

Nenhum comentário:

Postar um comentário