Written by Maverich Dicembre 07, 2011, 06:58:00 pm21502 ViewsRating: 0 (0 Rates)Print
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;
//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)
//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:
//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;
//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;
procedure TForm1.EliminaArrayBmp; var i: integer; begin //Elimiuna tutte le TImage create for i := 0 to iNumImg do BmpX[i].Free; end;
About the author
Maverich registered at Italian community of Lazarus and Free Pascal on Novembre 20, 2011, 10:21:54 pm and has posted 134 posts in the boards since then. Last visit was Novembre 20, 2016, 08:23:41 pm.
Questo blog non rappresenta una testata giornalistica poiché viene
aggiornato senza alcuna periodicità. Non può pertanto considerarsi un
prodotto editoriale ai sensi della legge n. 62/2001.
Questo sito utilizza cookie, anche di terze parti, per offriti servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina, cliccando su un link o proseguendo la navigazione in altra maniera, acconsenti all’uso dei cookie.