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

Codice: [Seleziona]

// 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

Codice: [Seleziona]

// 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

Codice: [Seleziona]

  //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

Codice: [Seleziona]

  //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

Codice: [Seleziona]

  //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

Codice: [Seleziona]

  //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

Codice: [Seleziona]

  //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:

Codice: [Seleziona]

  SpeedButton1.BringToFront;
  SpeedButton2.BringToFront;
  SpeedButton3.BringToFront;


di seguito le procedure necessarie

Eventu attivato su Form OnResize

Codice: [Seleziona]

procedure TForm1.FormResize(Sender: TObject);
begin
  EliminaArrayBmp;  //Elimina Array BitMap
  DisegnaBmp;       //crea e Disegna BitMap
end;


Si occupa di Disegnare sul Form e Panel

Codice: [Seleziona]

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

Codice: [Seleziona]

procedure TForm1.EliminaArrayBmp;
var
  i: integer;
begin
  //Elimiuna tutte le TImage create
  for i := 0 to iNumImg do
    BmpX[i].Free;
end;



SMF 2.0.8 | SMF © 2011, Simple Machines
Privacy Policy
SMFAds for Free Forums
TinyPortal © 2005-2012

Go back to article