O documento descreve uma classe para carregar ícones em formatos diferentes de BMP nos botões TBitBtn e TSpeedButton em Delphi. A classe contém métodos para converter arquivos ICO, JPG e WMF para BMP e definir na propriedade Glyph dos botões, permitindo usar outros formatos sem aumentar o tamanho do executável. Exemplos demonstram o uso da classe para carregar diferentes ícones nos botões.
1. CARREGANDO ÍCONES EM BOTÕES TBITBTN E TSPEEDBUTTON
Michel Alves dos Santos
RESUMO
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.
Palavras-chave: Programação, Delphi, Classes, Conversão, Formatos.
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
2. 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 tempo de runtime, 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.
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.
3. 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.
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
4. 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.
Ì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
5. 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 consulte os
arquivos em anexo.
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