Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Самолет летит по небу

01.01.2007
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.

https://delphiworld.narod.ru/

DelphiWorld 6.0