O presente artigo apresenta o esqueleto estrutural de uma classe para manipulação de ícones com a finalidade de carga em botões pertencentes às classes TBitBtn ou TSpeedButton, já que nessas classes o desenho de uma figura na área referenciada por sua propriedade Glyph (TBitmap) pode ser simulado através de conversão de formatos. Tendo em conta que por padrão, botões do tipo TBitBtn e TSpeedButton aceitam apenas arquivos do formato *.bmp em sua propriedade Glyph, manipularemos a propriedade canvas (camada ou superfície na qual podem ser inseridos itens gráficos ou desenhos) pertencentes a todas as instâncias da classe TBitmap e assim simularemos a carga de arquivos em outros formatos executando desenhos nesses tipos de botões.
Introdução
As orientações aqui apresentadas são frutos de pesquisas
dentro de métodos para facilitação do desenvolvimento
de aplicações
para ambiente desktop. Freqüentemente nos deparamos com
adversidades que pedem um pouco mais de atenção devido à falta
de
flexibilidade de alguns componentes, seja por restrições da própria
plataforma ou por motivos legais. No nosso caso apenas por
restrições da própria plataforma que no momento não
configuram um
cenário instransponível. O fato que iremos abordar nesse artigo é o
carregamento de outros formatos de figuras diferentes do formato
padrão *.bmp em componentes das classes TBitBtn e/ou
TSpeedButton.
Para muitos programadores os formatos referentes ao padrão
bitmap não são tão recomendados visto que, um número
muito
grande de informações (profundidade de bits, numero de cores,
mantissa, sombra, efeitos de degrade, etc) torna a escolha do
formato “mapa de bits” uma solução não tão
atraente, devido ao
tamanho em disco que a figura pode alcançar no final de sua edição.
Não esquecendo que uma figura muito rebuscada pode pesar no
tamanho final em disco do software, depois de compilado. Contudo
alguns programadores optam por manter arquivos reduzidos de
algumas figuras com o mesmo formato bitmap, perdendo na maioria
das vezes no design e conseqüentemente empobrecendo a interface.
Usar os ícones que acompanham o Delphi pode ser uma boa
pedida como forma de padronização de interfaces, mas ao mesmo
tempo pode prejudicar o programador, pois suas aplicações não
conseguirão obter um diferencial, o que poderia distingui-lo de outros
no que tange o escopo de design de seus softwares. Além disso,
arquivos no formato *.ico ou *.jpeg podem armazenar um número
maior de informações ao mesmo tempo em que ocupam um menor
espaço em disco.
Desenvolvimento
Para a execução da conversão
dos formatos *.ico, *.jpg e
*.wmf para o formato bitmap, que pode ser escrito na propriedade
glyph dos componentes TBitBtn e/ou TspeedButton, construímos uma
classe com os métodos LoadIcon, LoadJpeg, LoadMetafile, sendo suas
assinaturas basicamente semelhantes: recebem como parâmetro um
caminho onde possa estar armazenado o arquivo desejado e
retornam um objeto da classe TBitmap. Este objeto por sua vez é setado
na propriedade Glyph dos botões
na forma de linha de comando, em runtime (tempo de execução), fazendo com que
a figura não seja
incorporada ao executável, flexibilizando a mudança a qualquer
momento e simulando uma espécie de skin.

Figura 1. Esqueleto da classe TLoadIcons.
A forma de invocação dos métodos da classe
pode ser
visualizada logo abaixo, com a simples chamada ao método que
converterá o arquivo de formato escolhido (ico, jpg ou wmf) para o
formato *.bmp.

Figura 2. Chamada ao método que converte formatos *.ico
em *.bmp
para apresentação em botões.
A interface em execução pode ser vista logo abaixo
representada na figura que segue. As seções estão separadas
por
classe de botão e método de carregamento. Na primeira seção
(“Carregamento Normal de Ícones e Figuras”) temos 3 botões
sendo
dois do tipo TSpeedButton e um do tipo TBitBtn. O primeiro que está com foco é um botão do tipo TBitBtn e receberá um ícone.
O segundo
botão é do tipo TSpeedButton, que também receberá um ícone
e
finalmente o terceiro é um TSpeedButton que receberá um arquivo
no
formato *.jpg, obviamente convertido para o formato *.bmp.

Figura 3. Visualização da interface de testes dos
métodos de carregamento
de imagens em botões do tipo TBitBtn ou/e TSpeedButton.
Na segunda seção (“Carregamento de ícone
através de caminho
fornecido”) temos um botão da classe TSpeedButton que receberá uma figura do tipo *.ico, passado como parâmetro
o caminho de tal arquivo. O caminho poderá ser dado através da
caixa de texto ou
fornecido através da caixa de diálogo OpenPicture, que é executada
quando o botão ‘Procurar ícone’ é pressionado.
Na terceira e última
seção (“Carregando WMF”), quando o botão (“TSpeedButton
WMF”)
da classe TSpeedButton é executado, um WMF é carregado em seu
canvas. A classe pode ser expandida para outros formatos gráficos,
mas para tanto, deve ser assegurado que a plataforma Delphi usada
comporte classes que possam fazer a conversão do formato desejado
para o formato Bitmap, como é o caso do formato *.gif (Graphic
Interchange Format) que na maioria das vezes, consegue ser apenas
processado através da aquisição de bibliotecas de terceiros.
Abaixo, temos a visão do carregamento dos formatos
permitidos pela classe TLoadIcons.

Figura 4. Ìcones carregados através dos métodos da classe
TLoadIcons.
Devemos atentar que, para ícones que se comportam como
ICL ´
s a figura padrão que será carregada será o ícone
setado como
default dentro do arquivo. Para burlar esse tipo de infortúnio
devemos editar o ícone desejado excluindo as camadas adicionais
(ícones 8x8, ícones 16x16, ícones 48x48) existentes dentro
do
arquivo com algum editor especializado tal como microangelo,
iconedit, Icon Studio, ABBIcon Pro, Active ICONStudio, ArtIcons,
IconDeveloper (particularmente recomendado) ou qualquer outro da
sua preferência.
Os demais formatos de figuras
devem ser mensurados conforme a necessidade do programador e modelos de design
utilizados. Conforme vimos, esse método de carregamento ajuda o
programador a diversificar a forma como uma interface entre sistema
e usuário é projetada flexibilizando as alternativas para arquivos
diferentes do padrão *.bmp, diminuindo algumas vezes de forma
substancial o tamanho do executável. Trechos do código da classe
de
conversão podem ser vistos logo abaixo.
{Método
que retorna um bitmap a partir de um ico}
function TLoadIcons.LoadIcon(const strPath: String): TBitmap;
var Icon : TIcon;
Bitmap : TBitmap;
begin
{Cria um ícone temporario}
Icon := TIcon.Create;
try
{Cria um bitmap temporario}
Bitmap := TBitmap.Create;
try
{Carrega o icone .ICO}
Icon.LoadFromFile(strPath);
{Faz a conversao}
Bitmap.Height := Icon.Height;
Bitmap.Width := Icon.Width;
Bitmap.Canvas.Draw(0, 0, Icon);
{Retorna o bitmap}
Result := Bitmap;
finally
//Bitmap.Free;
end;
finally
Icon.Free;
end;
end;
Para maiores informações sobre os métodos
de conversão, clique aqui e faça o download dos
arquivos do exemplo.
Conclusão
Dessa forma podemos conhecer outros métodos de
carregamento de imagens em botões fazendo com que o tamanho
final do software seja bem menor além de desacoplar as figuras do
executável, criando uma espécie de padrão de skin (pele)
para cada
tipo de aplicação precisando apenas mudar a pasta de figuras
na qual
estão localizados os ícones da aplicação.
Michel Alves dos Santos - Formado em Processamento de
Dados (Curso Técnico de Nível Médio) e
Tecnologia da Informação (Tecnólogo de Nível Superior)
pelo Centro Federal de Educação Tecnológica do
Estado de Alagoas – CEFET/AL. Programador Delphi desde a versão
2.0. Contato :
michel.mas@gmail.com ou
michelalvessantos@hotmail.com
|