unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer2: TTimer;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Bitmap,Bitmap1: TBitmap;
implementation

{$R *.dfm}

// procedura pobiera prostokątny fragment formularza i uruchamia Timer
procedure TForm1.Button1Click(Sender: TObject);
var x,y:integer;
begin
  // utworzenie obiektu Bitmap1
  Bitmap1 := TBitmap.Create;
  Bitmap1.Width:=ClientWidth;
  Bitmap1.Height:=30;
  //pobranie prostokątnego wycinka formularza - obszaru, po którym będzie się poruszało //kółko
  for x:=0 to ClientWidth-1 do
    for y:=0 to 29 do
      Bitmap1.Canvas.Pixels[x,y]:=Form1.Canvas.Pixels[x,y+100];
  Timer2.Enabled:=true;  //w Inspektorze Obiektów zablokuj Timer2
end;

// procedura obsługi przerwania od Timera - rysowanie i kasowanie obiektu co 200 ms
//wypełnianie formularza bitmapą
// procedura FormDestroy zwalnia pamięć
// zajmowaną przez bitmapy
procedure TForm1.FormCreate(Sender: TObject);
begin
//W procedurze FormCreate należy przeczytać bitmapę z pliku.
  Bitmap:=TBitmap.Create;
  Bitmap.LoadFromFile('wzorek.bmp');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   Bitmap.Free;
   Bitmap1.Free;

end;

procedure TForm1.FormPaint(Sender: TObject);
var x, y: Integer;
begin
   y := 0;
   while y < Height do
   begin
       x := 0;
      while x < Width do
      begin
         Canvas.Draw(x, y, Bitmap);
          x := x + Bitmap.Width;
      end;
      y := y + Bitmap.Height;
   end;
end;

{$J+}
procedure TForm1.Timer2Timer(Sender: TObject);
const x1:integer=0;
       y1:integer=100;
       krok:integer=5;
var   x,y:integer;
begin
  //jeśli zwiększymy rozmiar formularza, to trzeba w procedurze obsługi zdarzenia
  //OnResize jeszcze raz pobrać bitmapę
   Canvas.Draw(0,y1,Bitmap1);  //wyświetlenie wcześniej pobranego paska formularza,
                               //kasowanie obiektu
   //rysowanie kółka
   Canvas.Ellipse(x1,y1,x1+30,y1+30);
    x1:=x1+krok;
    if x1+29>=Clientwidth then krok:=-krok;
    if x1<=0 then krok:=-krok;

end;

end.
