unit aplane_;

interface

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


type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Image1: TImage;
    procedure FormActivate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;



implementation

{$R *.DFM}
var
  Back, bitmap, Buf : TBitMap;  // фон, картинка, буфер
  BackRct : TRect; // область фона, которая должна быть
                   // восстановлена из буфера
  BufRct: Trect;   // область буфера, которая используется для
                   // восстановления фона

  x,y:integer;  // текущее положение картинки
  W,H: integer; // размеры картинки

procedure TForm1.FormActivate(Sender: TObject);
begin
  // создать три объекта - битовых образа
  Back := TBitmap.Create;    // фон
  bitmap := TBitmap.Create;  // картинка
  Buf := TBitmap.Create;     // буфер

  // загрузить и вывести фон
  Back.LoadFromFile('factory.bmp');
  Form1.Image1.canvas.Draw(0,0,Back);

  // загрузить картинку, которая будет двигаться
  bitmap.LoadFromFile('aplane.bmp');
  // определим "прозрачный" цвет
  bitmap.Transparent := True;
  bitmap.TransParentColor := bitmap.canvas.pixels[1,1];

  // создать буфер для сохранения копии области фона,
  // на которую накладывается картинка
  W:= bitmap.Width;
  H:= bitmap.Height;
  Buf.Width:= W;
  Buf.Height:=H;
  Buf.Palette:=Back.Palette; // Чтобы обеспечить соответствие палитр !!
  Buf.Canvas.CopyMode:=cmSrcCopy;
  // определим область буфера, которая будет использоваться
  // для восстановления фона
  BufRct:=Bounds(0,0,W,H);

  // начальное положение картинки
  x := -W;
  y := 20;

  // определим сохраняемую область фона
  BackRct:=Bounds(x,y,W,H);
  // и сохраним ее
  Buf.Canvas.CopyRect(BufRct,Back.Canvas,BackRct);
end;

// обработка сигнала таймера
procedure TForm1.Timer1Timer(Sender: TObject);
begin
     // восстановлением фона (из буфера) удалим рисунок
     Form1.image1.canvas.Draw(x,y,Buf);

     x:=x+2;
     if x>form1.Image1.Width then x:=-W;

     // определим сохраняемую область фона
     BackRct:=Bounds(x,y,W,H);
     // сохраним ее копию
     Buf.Canvas.CopyRect(BufRct,Back.Canvas,BackRct);

     // выведем рисунок
    Form1.image1.canvas.Draw(x,y,bitmap);
end;

// завершение работы программы
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 // освободим память, выделенную
 // для хранения битовых образов
 Back.Free;
 bitmap.Free;
 Buf.Free;
end;

end.

