Você está na página 1de 3

Um leitor perguntou recentemente sobre imagens de fundo em Forms....

Apesar de já se
ter escrito diversos artigos sobre este tópico, sua questão tinhas algumas novidades.
Primeiramente, ele desejava que o fundo se alternasse periodicamente entre diferentes
imagens. Além disso, elas deveriam estar todas dentro do executável ao invés de serem
carregadas do disco.

Essencialmente, a solução para isto seria a aplicação de outros artigos similares. Em


primeiro lugar, para resolver a questão de se ter diversas imagens, os bitmaps devem ser
carregados em um array quando o Form for criado. A mudança periódica da imagem
será tratada por um Timer. Quando o tempo se esgota, incrementa-se um contador (que,
também, deve fazer um loop para 1 quando se chega ao máximo preestabelecido) e
então informa ao Form para rodar o Repaint. Quando o método Paint do Form ocorre,
ele simplesmente desenha cópias suficientes do bitmap por toda a sua extensão (width e
height) para cobri-lo totalmente.

Finalmente, para tratar do assunto "não leia as imagens do disco", recorremos aos
resources. Um arquivo de resource é apenas um caminho para empacotar muito bem
qualquer tipo de dados que será anexado ao executável durante o processo de
Linkedição. Para o caso deste exemplo, Eu utilizei 5 bitmaps e os nomeei Image1.bmp
até Image5.bmp. Então criei um script de resource semelhante ao que se segue:

BITMAP1 BITMAP IMAGE1.BMP


BITMAP2 BITMAP IMAGE2.BMP
BITMAP3 BITMAP IMAGE3.BMP
BITMAP4 BITMAP IMAGE4.BMP
BITMAP5 BITMAP IMAGE5.BMP

A primeira parte de cada linha é o identificador que você utilizará no código para
capturar uma imagem em particular. A segunda parte é o tipo de resource (neste caso,
bitmap). E a última parte é o nome do arquivo que deve ser utilizado para a imagem.
Isto feito, eu apenas utilizei o programa BRCC32 (na pasta BIN do Delphi) da Borland
para compilar o script de resource, gerando um arquivo RES. Então, inclui uma
referência como a seguinte no código do projeto:

{$R MYBMPS.RES}

Quando o executável está sendo linkeditado (um passo antes da compilação), o resource
será automaticamente anexado ao executável. Para carregar as imagens do resource no
array de bitmaps no programa, fiz simplesmente:

for a := 1 to NumBmps do
begin
Bmps[a] := TBitmap.Create;
Bmps[a].LoadFromResourceName(hInstance,'BITMAP'+IntToStr(a));
end;

É basicamente isto... A seguir a listagem da Unit principal:

unit Unit1a;
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;

const
NumBmps = 5;

type
TForm1 = class(TForm)
Timer1: TTimer;
Edit1: TEdit;
CheckBox1: TCheckBox;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
Bmps : Array[1..NumBmps] of TBitmap;
SelectedBmp : Integer;
public
{ Public declarations }
end;

var

Form1: TForm1;

implementation

{$R *.DFM}
{$R MYBMPS.RES}

procedure TForm1.FormCreate(Sender: TObject);


var
a : Integer;
begin
for a := 1 to NumBmps do
begin
Bmps[a] := TBitmap.Create;
Bmps[a].LoadFromResourceName(hInstance,'BITMAP'+IntToStr(a));
end;
SelectedBmp := 1;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
a : Integer;
begin
for a := 1 to NumBmps do Bmps[a].Free;
end;

procedure TForm1.FormPaint(Sender: TObject);


var
x,y,w,h : Integer;
begin
w := Bmps[SelectedBmp].Width;
h := Bmps[SelectedBmp].Height;
for x := 0 to (Width div w) do
for y := 0 to (Height div h) do
Canvas.Draw(x*w,y*h,Bmps[SelectedBmp]);
end;

procedure TForm1.Timer1Timer(Sender: TObject);


begin
Inc(SelectedBmp);
if SelectedBmp > NumBmps then SelectedBmp := 1;
Paint;
end;

end.

Você também pode gostar