TImage su Form e Panel
in Delphi utilizzando JvBackground (Librerie Jedi), si risolve il problema;
in Lazarus si puo' ottenere lo stesso effetto con un minimo di ingegno;
in base alle dimensioni della BitMap si calcola quante volte puo'
essere scritta nel Form (ClientWidth e ClientHeight)
si utilizzano 2 Array di tipo TImage
BmpX: array[0..1300] of TImage; // per il Form
BmpT: array[0..50] of TImage; // per il Panel
nel form si utilizza un TImage e si carica un'immagine/logo da un file (Image1)
scriveremo una procedure DisegnaBmp ed una EliminaArrayBmp (presenti in fondo al testo)
vediamo passo passo come costruire:
calcoliamo il numero di volte che il Form puo' contenere la BitMap in orizzontale
// numero Colonne
i := 0;
iNumImg := 0;
while i <= Self.ClientWidth do
begin
iNumImg := iNumImg + 1;
i := i + Image1.Width;
end;
iNumColonne := iNumImg;
stessa cosa in vericale
// numero righe
iNumImg := 0;
while i <= Self.ClientHeight do
begin
iNumImg := iNumImg + 1;
i := i + Image1.Height;
end;
iNumRighe := iNumImg;
//in totale serviranno n Immagini
iNumImg := iNumRighe * iNumColonne;
tenendo presente che ad ogni Ridimensionamento del form
le immmagini andranno eliminate e ricreate, si creano n BitMap
creazione ed assegnazione di n TImage per il Form
//Crea TImage
for i := 0 to iNumImg do
begin
BmpX[i] := TImage.Create(nil);
BmpX[i].Width := Image1.Width;
BmpX[i].Height := Image1.Height;
//si assegna alla TImage(n) il contenuto della Image1 inserita sul Form
BmpX[i].Picture.Bitmap := Image1.Picture.BitMap;
end;
creazione ed assegnazione di n TImage per il Panel
//Crea TImage per Panel
for i := 0 to iNumColonne do
begin
BmpT[i] := TImage.Create(nil);
BmpT[i].Width := Image1.Width;
BmpT[i].Height := Image1.Height;
//si assegna alla TImage(n) il contenuto della Image1 inserita sul Form
BmpT[i].Picture.Bitmap := Image1.Picture.BitMap;
end;
a questo punto basta un ciclo, che visualizzi le Immagini
//Disegna TImage
for i := 0 to iNumImg do
begin
//crea img orizzontali
BmpX[i].Left := iPosizioneX;
BmpX[i].Top := iPosizioneY;
BmpX[i].Parent := Self;
BmpX[i].Show;
//nuova posizione orizzontale
iPosizioneX := BmpX[i].Left + BmpX[i].Width;
//se Posizione sinistra > Larghezza Client
//disegna img verticali
if (BmpX[i].Left + Image1.Width) > Self.ClientWidth then
begin
iPosizioneY := BmpX[i].Top + BmpX[i].Height;
iPosizioneX := Image1.Left;
end;
end;
ad ogni cambio di Dimensioni del Form (Evento OnResize), si eliminano le BitMap create e si ripete il ciclo
di disegno
//Elimina tutte le TImage create
for i := 0 to iNumImg do BmpX[i].Free;
Cosa analoga si puo' fare per simulare la trasparenza su un TPanel;
Si disegnano le BitMap sul TPanel;
Esistono altre tecniche sovrascrivendo il metodo CreateParams dei genitore TWinControl,
che pero' non danno sempre i rusltati attesi, spesso per i temi utilizzati (Windows)
es:
procedure CreateParams(var Params: TCreateParams); override;
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := WS_EX_TRANSPARENT;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Brush.Style := bsClear;
BorderStyle := bsNone;
end;
la soluzione neutra, di scrivere le BitMap dentro il Panel , funziona sempre anche sotto Linux
//Disegna TImage
iPosizioneX := 0;
for i := 0 to iNumColonne do
begin
//crea img orizzontali
if i > 0 then
iPosizioneX := BmpX[i].Left + BmpX[i].Width;
BmpT[i].Left := iPosizioneX; //nuova posizione
BmpT[i].Top := 0;
BmpT[i].Parent := Panel1;
BmpT[i].Show;
//nuova posizione
iPosizioneX := BmpT[i].Left + BmpX[i].Width;
ed a fine ciclo si portano in primo piano i vari controlli presenti
sul TPanel stesso es:
SpeedButton1.BringToFront;
SpeedButton2.BringToFront;
SpeedButton3.BringToFront;
di seguito le procedure necessarie
Eventu attivato su Form OnResize
procedure TForm1.FormResize(Sender: TObject);
begin
EliminaArrayBmp; //Elimina Array BitMap
DisegnaBmp; //crea e Disegna BitMap
end;
Si occupa di Disegnare sul Form e Panel
procedure TForm1.DisegnaBmp;
var
i, iPosizioneX, iPosizioneY, iNumColonne, iNumRighe: integer;
begin
iNumColonne := 0;
iNumRighe := 0;
iPosizioneX := 0;
iPosizioneY := Panel1.Top + Panel1.Height;
iPosizioneY := 0;
//Verifica Numero Immagini Vertcali su Form
//volendo risparmiare un po' di Bmp (se la Bmp e' piccola) si puo' cambiare la posizione Verticale di partenza
i := 0; //iPosizioneY
iNumImg := 0;
while i <= Self.ClientHeight do
begin
iNumImg := iNumImg + 1;
i := i + Image1.Height;
end;
iNumRighe := iNumImg;
//Verifica Numero Immagini Orizzontali su Form
i := 0;
iNumImg := 0;
while i <= Self.ClientWidth do
begin
iNumImg := iNumImg + 1;
i := i + Image1.Width;
end;
iNumColonne := iNumImg;
iNumImg := iNumRighe * iNumColonne;
Self.Caption := '- Bitmap necessarie : ' + IntToStr(iNumImg);
Self.Refresh;
//Crea TImage
for i := 0 to iNumImg do
begin
BmpX[i] := TImage.Create(nil);
BmpX[i].Width := Image1.Width;
BmpX[i].Height := Image1.Height;
BmpX[i].Picture.Bitmap := Image1.Picture.BitMap;
end;
//Crea TImage per Panel
for i := 0 to iNumColonne do
begin
BmpT[i] := TImage.Create(nil);
BmpT[i].Width := Image1.Width;
BmpT[i].Height := Image1.Height;
BmpT[i].Picture.Bitmap := Image1.Picture.BitMap;
end;
iPosizioneX := Image1.Left;
//Disegna TImage
for i := 0 to iNumImg do
begin
//crea img orizzontali
BmpX[i].Left := iPosizioneX;
BmpX[i].Top := iPosizioneY;
BmpX[i].Parent := Self;
BmpX[i].Show;
//nuova posizione
iPosizioneX := BmpX[i].Left + BmpX[i].Width;
//se Posizione sinistra > Larghezza Client
//disegna img verticali
if (BmpX[i].Left + Image1.Width) > Self.ClientWidth then
begin
iPosizioneY := BmpX[i].Top + BmpX[i].Height;
iPosizioneX := Image1.Left;
end;
end;
//Disegna TImage
iPosizioneX := 0;
for i := 0 to iNumColonne do
begin
//crea img orizzontali
if i > 0 then
iPosizioneX := BmpX[i].Left + BmpX[i].Width;
BmpT[i].Left := iPosizioneX; //nuova posizione
BmpT[i].Top := 0;
BmpT[i].Parent := Panel1;
BmpT[i].Show;
//nuova posizione
iPosizioneX := BmpT[i].Left + BmpX[i].Width;
end;
SpeedButton1.BringToFront;
SpeedButton2.BringToFront;
SpeedButton3.BringToFront;
end;
Elimina spazio alocato per le TImage
procedure TForm1.EliminaArrayBmp;
var
i: integer;
begin
//Elimiuna tutte le TImage create
for i := 0 to iNumImg do
BmpX[i].Free;
end;