Zetta-Ømnis Soluções Tecnológicas
Desenvolvendo hoje a tecnologia do amanhã
Visite Nosso Patrocinador
Você está aqui:
DO NOT UNDERSTAND PORTUGUESE? CLICK ON THE FLAG TO CHANGE THE LANGUAGE!

Open Tools API - Ícones nas telas de "Splash" e "About"!

Imagem meramente ilustrativa

Ícones nas telas de "Splash" e "About"

Para começar com os exemplos de OTA eu resolvi falar sobre algo que pode ser usado em qualquer pacote de componentes, mesmo que este não use características mais avançadas do OTA. Suponha que você tenha um pacote de componentes desenvolvido por você, o que você acharia de colocar uma referência a ele na tela de "Splash" do Delphi?

Legal não é mesmo? Dentre vários componentes excelentes e experts realmente úteis, lá está um ícone para representar o seu pacote de componentes. Seu lugar entre os grandes está reservado e você pode se sentir importante, mas não é só isso! Nenhum pacote de componentes está completo sem algumas informações gerais ou de direitos autorais. Sendo assim, acho que seria excelente uma referência ao seu pacote de componentes na tela de "About", não é mesmo?

A inclusão destes ícones e destas informações é bem mais simples do que aparenta ser e eu não vou entrar em detalhes adicionais a respeito disso porque a minha intenção com estes artigos sobre OTA é, de fato, entregar o serviço quase pronto, de forma que você, caro leitor, possa se aprofundar por si só, seja estudando o código, seja procurando mais informações na Internet. Chega de conversa mole, vamos ao que interessa.


Apenas dois arquivos de fonte estão presentes neste exemplo, um deles é o arquivo ZOOW.Wizards.Register.pas, que é o responsável por registrar nossos componentes, wizards e experts por meio do procedure Register:

unit ZOOW.Wizards.Register;

interface

procedure Register;

implementation

uses
  DesignIntf;

procedure Register;
begin
  ForceDemandLoadState(dlDisable);
end;

end.

Obviamente este arquivo está praticamente vazio porque não teremos neste exemplo nenhum wizard, expert ou componente sendo instalado. A única linha que merece menção é a linha 14. ForceDemandLoadState é um procedure que atua na forma como Delphi carrega componentes registrados. Por padrão, o Delphi só carrega componentes quando eles são efetivamente usados e isso é bom para diminuir o consumo de memória, no entanto o carregamento por demanda também impede que os ícones na tela de Splash apareçam.

Eu não sei se isso é um bug ou se eu estou fazendo algo errado, só sei que em todos os exemplos com fonte que eu achei, esta linha estava presente para garantir a exibição de tais ícones. O parâmetro usado (dlDisable), indica que o carregamento por demanda está desabilitado, e que por isso, o carregamento será feito independentemente de qualquer um dos componentes de nosso pacote ser usado ou não. Isso, invariavelmente, vai exibir nosso ícone na tela de Splash, que é nosso objetivo. Para mais detalhes sobre o procedure ForceDemandLoadState, acesse http://docwiki.embarcadero.com/Libraries/Seattle/en/DesignIntf.ForceDemandLoadState.

O segundo arquivo, que é o responsável por, de fato, utilizar o OTA para inclusão de ícones na tela de Splash e About, bem como informações adicionais, é o arquivo ZOOW.Wizards.Information.pas, o qual pode ser visto abaixo:

unit ZOOW.Wizards.Information;

interface

implementation

{$R *.res}

uses
  ToolsAPI, Windows, Graphics, SysUtils, DesignIntf;

const
  ICON_SPLASH = 'SPLASHICON';
  ICON_ABOUT = 'ABOUTICON';

var
  AboutBoxServices: IOTAAboutBoxServices;
  AboutBoxIndex: Integer = 0;

resourcestring
  resPackageName = 'Zetta-Ømnis OTA Wizards';
  resLicense = 'Open Source Donationware';
  resAboutCopyright = 'Copyright Zetta-Ømnis Soluções Tecnológicas Ltda.';
  resAboutTitle = 'Zetta-Ømnis OTA Wizards';
  resAboutDescription = 'O Zetta-Ømnis OTA Wizards é um exemplo disponível no s' +
  'ite wwww.zettaomnis.net.br e visa mostrar 3 usos simples, porém bastante int' +
  'eressantes, do OTA (Open Tools API): Exibição de íncones na tela de splash e' +
  ' about do Delphi (esta tela), um wizard exclusivo que inclui capacidades adi' +
  'cionais ao TDataModule, um wizard exclusivo que inclui capacidades adicionai' +
  's ao TForm';

procedure RegisterSplashScreen;
begin
  SplashScreenServices.AddPluginBitmap(resPackageName, LoadBitmap(HInstance,ICON_SPLASH), False, resLicense);
end;

procedure RegisterAboutBox;
begin
  if Supports(BorlandIDEServices,IOTAAboutBoxServices, AboutBoxServices) then
    AboutBoxIndex := AboutBoxServices.AddPluginInfo(resAboutTitle, resAboutCopyright + #13#10#13#10 + resAboutDescription, LoadBitmap(HInstance, ICON_ABOUT), False, resLicense);
end;

procedure UnregisterAboutBox;
begin
  if (AboutBoxIndex <> 0) and Assigned(AboutBoxServices) then
  begin
    AboutBoxServices.RemovePluginInfo(AboutBoxIndex);
    AboutBoxIndex := 0;
    AboutBoxServices := nil;
  end;
end;

initialization
  RegisterAboutBox;
  RegisterSplashScreen;

finalization
  UnRegisterAboutBox;

end.

Agora sim, este arquivo tem bem mais coisas a serem explicadas. Para começar, a linha 7 mostra uma referência a um arquivo .res que tem o mesmo nome do arquivo fonte com extensão trocada, ou seja, ZOOW.Wizards.Information.res. Este arquivo encontra-se na pasta res do código-fonte anexado a este artigo. É natural que precisemos de um arquivo de recurso, pois precisaremos vincular imagens ao BPL que será gerado, de forma que o OTA possa carrega-las e exibi-las.


Nas linhas 13 e 14 são definidas constantes de escopo local que contém os nomes dos recursos de imagem contidos no arquivo de recurso. Estas constantes foram definidas apenas para facilitar o acesso aos nomes SPLASHICON e ABOUTICON, os quais nomeiam as imagens no arquivo arquivo de recurso, cujo conteúdo pode ser visto na figura abaixo:

O ícone a ser exibido na tela de Splash precisa ter 24 x 24 pixels, enquanto o ícone a ser exibido na tela About, precisa ter 48 x 48 pixels. Na figura acima, o ícone da tela de About está selecionado e podemos ver suas dimensões, bem como a profundidade de cores na parte inferior da tela.

Voltando à explicação do arquivo ZOOW.Wizards.Information.pas, as linhas 17 e 18 definem algumas variáveis de escopo local necessárias apenas para a inclusão do ícone + informações na tela de About. Note que, pela primeira vez, você vê um identificador que contém a siga OTA, a interface IOTAAboutBoxServices. Como o próprio nome sugere, esta interface possui métodos que possibilitam a interação com a caixa de diálogo "Sobre" do Delphi.

As linhas 21 a 30 definem algumas Resource Strings (Strings de Recurso). Estas strings serão salvas no arquivo de recurso do projeto (arquivo .res com o mesmo nome do projeto .dpk), e consequentemente no BPL final gerado. O resultado disso pode ser visto, inspecionando-se o BPL final com um editor de recuso:

Note que o BPL final vai conter tanto nossas strings, como os ícones que foram incluídos no arquivo de recurso ZOOW.Wizards.Information.res. Isso é absolutamente esperado, já que todos os arquivos de recurso associados aos projetos delphi (dpr ou dpk) são incluídos nos binários gerados (dll, exe, bpl, etc.). Eu poderia ter usado simples constantes, mas resolvi usar strings de recurso, devido à sua flexibilidade. Se algum dos textos precisar de modificação eu posso alterar as strings usando um editor de recurso sem precisar recompilar o BPL. O mesmo acontece com os ícones, isto é, eu poderia alterar os ícones diretamente no BPL usando um editor de recurso, sem precisar recompilar o pacote!

As linhas 32 a 35 do arquivo ZOOW.Wizards.Information.pas definem o procedure RegisterSplashScreen. O método SplashScreenServices.AddPluginBitmap vai, de fato, incluir nosso ícone na tela de Splash do Delphi. Note que eu estou usando algumas das strings de recurso definidas anteriormente. Note também que eu estou carregando o ícone que deverá aparecer. LoadBitmap(HInstance,ICON_SPLASH) vai carregar diretamente do BPL (HInstance[1]) o recurso de imagem (bitmap) definido na constante ICON_SPLASH.

As linhas 37 a 41 definem o procedure RegisterAboutBox. De forma análoga ao procedure RegisterSplashScreen, este procedure vai habilitar a visualização de nosso ícone e de algumas informações na tela About do Delphi. Diferentemente do procedure anterior, este procedure precisa verificar se a interface IOTAAboutBoxServices é suportada por BorlandIDEServices e, caso seja, a variável AboutBoxServices conterá uma interface que permitirá a interação com a tela de About. AboutBoxServices.AddPluginInfo é a função que vai incluir nosso ícone e os textos na tela de About. Note que estou usando as strings de recurso e que também estou carregando o ícone que deve aparecer (LoadBitmap(HInstance,ICON_ABOUT). A função AboutBoxServices.AddPluginInfo retorna um número, um índice que representa este item na lista de "plugins" cujas informações são exibidas na tela de About.

As linhas 43 a 51 definem o procedure UnRegisterAboutBox. Este procedure é responsável por desregistrar (remover) nosso ícone e textos da tela de About. O código é bem simples e intuitivo. Não vou explicar.

As linhas 54 e 55, dentro da seção initialization, registram respectivamente os itens que serão exibidos na tela de Splash e os itens que serão exibidos na tela de About. Toda vez que nosso pacote for carregado pelo Delphi a seção de inicialização será executada, portanto, o registro de nossos itens especiais será realizado no momento em que o BPL for carregado pelo Delphi.

Por fim, a linha 58 mostra o que deve ser feito quando nosso pacote for descarregado (seção finalization). A única coisa sendo feita é o desregistro (remoção) dos itens da tela de About[2].


Um pouco de ação

Agora que você entendeu o que está sendo feito, instale o pacote zoow (anexado a este artigo). Abra no Delphi o arquivo prj\Delphi 19 (Delphi XE5)\zoow.dpk[3]. Dê um build, depois um install. Se tudo ocorrer dentro do previsto e o pacote for instalado com sucesso, você já poderá, imediatamente, ir no menu Help > About Embarcadero Delphi (ou Help > About, não importa) e lá você já poderá ver o seu ícone e as informações que foram definidas no arquivo ZOOW.Wizards.Information.pas.

Para ver o ícone da tela de Splash, feche o Delphi e reabra. Seu ícone, bem como as informações definidas no arquivo ZOOW.Wizards.Information.pas deverão aparecer.

  Arquivos anexados  
Arquivo Descrição Tamanho Modificado em
Download this file (zoow.zip) ZOOW Exemplos de utilização básica do OTA (Mais Bonus Track) 41 KB 14/04/2017 às 15:45

1 HInstance, refere-se à instância atual do nosso projeto após ser compilado. Como estamos compilando um pacote, que vai gerar um BPL, HInstance refere-se à instância do BPL carregado pelo Delphi
2 As informações colocadas na tela de Splash não precisam ser removidas, na verdade, nem mesmo existe uma função para realizar esta operação ;)
3 Este exemplo foi compilado originalmente em Delphi XE5, por isso a pasta com esse nome, contudo, ele também funciona em outros Delphis. Eu o testei em Delphi 2006, por exemplo, mas não posso garantir que vá funcionar sem alguma modificação. Isso fica como tarefa de casa pra você. Por se tratar de um componente, eu estou utilizando o LibSuffix de acordo com o Delphi XE5 (190). Se você for compilar em outro Delphi, é desejável usar o libsuffix correto. Apesar de isso não ser obrigatório, é uma boa prática colocar esta informação de acordo com o Delphi para o qual o pacote de componentes foi desenvolvido
Acesso Rápido
Não digite mais que o necessário...



Escaneie este QRCode em dispositivos móveis para acessar a página atual rapidamente nestes dispositivos
Conteúdo Verificado!
#BULLSHITFREE #CLICKBAITFREE
#MONEYLESS
Este site é amigo do desenvolvedor do mundo real
Gostou do conteúdo?
Se você gostou do conteúdo que está lendo, você pode ajudar a manter este site no ar doando qualquer quantia. Use os botões abaixo para realizar sua doação.
 
É rápido, fácil e indolor :)
 

Estatísticas em tempo real

Visite Nosso Patrocinador