title: how to move two bitmap-image on a canvas
body: <p>I am writing an animation program under Delphi 7 consisting of moving two discs on a canvas (I choose a PaintBox) with a bounce effect on the edges.</p>
  <p>it's woks fine if I load the pictures one by one: In this case, when the two disks that arrive from time to time are superimposed, no background rectangle appears with even a rather pleasant transparency effect.</p>
  <p>But if I try to generalize the operation with many more discs by introducing for example a Record.</p>
  <p>The movements are ok BUT in this case, when the discs cross, a background
  rectangle appears in the upper image which spoils everything!</p>
  <p>I even tried to write the code with an Object with :</p>
  <pre><code>    TSphere = class (TObject) 
  </code></pre>
  <p>but nothing to do, the phenomenon remains ..</p>
  <p>Do you have any idea how to remove this display defect?</p>
  <p>and i have another question, i would like to fill the disks with textures.</p>
  <p>the full code :</p>
  <pre><code>    unit Unit1;
  
      interface
  
      uses
       Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
      Dialogs, ExtCtrls, StdCtrls, ComCtrls;
  
  
      type
      TSphere = record
      W, H: integer;
      vx, vy: Extended;
      x, y: integer;
      xx, yy: extended;
      ROld, RNew: TRect;
      Bitm: TBitmap;
      end;
  
      type
      TForm1 = class(TForm)
      PaintBox1: TPaintBox;
      Button1: TButton;
      Timer1: TTimer;
      Label1: TLabel;
      Edit1: TEdit;
      Label2: TLabel;
      TrackBar1: TTrackBar;
  
      procedure FormCreate(Sender: TObject);
      procedure FormDestroy(Sender: TObject);
      procedure FormPaint(Sender: TObject);
      procedure Button1Click(Sender: TObject);
      procedure Timer1Timer(Sender: TObject);
      procedure TrackBar1Change(Sender: TObject);
      end;
  
      var
      Form1: TForm1;
  
      fin: boolean;
      BmpBkg: Tbitmap;
      BmpMoving: TBitmap;
  
      Spheres: array of TSphere;
  
      const
      nb = 2;
      ImageWidth = 32;
  
      implementation
  
      {$R *.DFM}
  
      procedure PictureStorage;
      var
      i: integer;
      begin
      SetLength(Spheres, nb);
      for i := 0 to (nb - 1) do
      begin
        with Spheres[i] do
         begin
          Bitm := TBitmap.Create;
           case i of
             0: Bitm.loadFromFile('Sphere1.bmp');
             1: Bitm.loadFromFile('Sphere2.bmp');
           end;
         end;
       end;
       end;
  
      procedure TForm1.FormCreate(Sender: TObject);
      var
      i: integer;
      begin
      DoubleBuffered := true;
      randomize;
      Fin := false;
  
      BmpBkg := TBitmap.Create;
      BmpMoving := TBitmap.Create;
  
      BmpBkg .Canvas.Brush.Color := ClBtnFace;
      BmpBkg .Canvas.FillRect(Rect(0, 0, PaintBox1.height, 
      PaintBox1.width));
      BmpBkg .Width := PaintBox1.Width;
      BmpBkg .Height := PaintBox1.Height;
      BmpMoving .Assign(BmpBkg );
  
      PictureStorage;
  
        for i := 0 to (nb - 1) do
        begin
        with Spheres[i] do
          begin
          W := Bitm.Width;
          H := Bitm.Height;
          Bitm.Transparent := True;
          Bitm.TransParentColor := Bitm.canvas.pixels[1, 1];
  
          xx := random(400) + 1;
          yy := random(200) + 1;
           x := trunc(xx);
           y := trunc(yy);
           vx := random(3) + 1;
           vy := random(4) + 1;
           RNew := bounds(x, y, W, H);
           ROld := RNew;
          end;
         end;
  
         Timer1.interval := 1;
         Timer1.enabled := true;
         end;
  
         procedure TForm1.FormDestroy(Sender: TObject);
         var
         i: integer;
          begin
          Fin := true;
          BmpBkg.free;
          BmpMoving.free;
  
           for i := 0 to (nb - 1) do
            Spheres[i].Bitm.Free;
           end;
  
        procedure TForm1.FormPaint(Sender: TObject);
        begin
          PaintBox1.Canvas.Draw(0, 0, BmpMoving);
        end;
  
        procedure TForm1.Button1Click(Sender: TObject);
         begin
           close;
         end;
  
        procedure TForm1.Timer1Timer(Sender: TObject);
          var
          n, i: integer;
         Runion: Trect;
           begin
            for n := 1 to trackbar1.position do
             begin
                 if fin then exit;
              for i := 0 to (nb - 1) do
              begin
               with Spheres[i] do
                begin
                  BmpMoving.Canvas.CopyRect(ROld, bmpBkg.canvas, ROld);
  
                if (x &lt; -ImageWidth) or (x &gt; bmpBkg.width - W + ImageWidth) 
                  then
                 vx := -vx;
                  if (y &lt; 0) or (y &gt; bmpBkg.height - H) then
                  vy := -vy;
                  xx := xx + vx;
                  yy := yy + vy;
                   x := trunc(xx);
                   y := trunc(yy);
                  RNew := bounds(x, y, W, H);
                  BmpMoving.Canvas.Draw(x, y, Bitm);
  
                  UnionRect(RUnion, ROld, RNew);
                  PaintBox1.Canvas.CopyRect(RUnion, BmpMoving.Canvas, 
                  RUnion);
                  ROld := RNew;
                  end;
                 end;
                end;
               end;
  
          procedure TForm1.TrackBar1Change(Sender: TObject);
            begin
             Edit1.text := inttostr(trackbar1.position);
               if trackbar1.position = 1 then
                 label2.visible := true
                  else
               label2.visible := false;
             end;
  
          end.
  </code></pre>
  <p>this program is just the start of another more important</p>
  <p>thanks</p>