Так это ж просто. Создай экземпляр класса TBitmap, который будет выполнять роль Z-буфера, и рисуй на нем. Пример:
Код:
var
Form1: TForm1;
bm: TBitmap;
...
procedure TForm1.FormCreate(Sender: TObject);
var
i, x, y, Radius: integer;
begin
bm := TBitmap.Create;
bm.Width := PaintBox1.Width;
bm.Height := PaintBox1.Height;
for i := 1 to 20 do
begin
Radius := Random( 15 );
x := Random( PaintBox1.Height );
y := Random( PaintBox1.Width );
bm.Canvas.Ellipse( x, y, x+2*Radius, y+2*Radius );
end;
end;
После этого уже не нужно вновь пересчитывать и строить гравик, достаточно отрисовать на PaintBox содержимое bm.
Код:
procedure TForm1.FormPaint(Sender: TObject);
begin
// Можно так
// PaintBox1.Canvas.Draw( 0, 0, bm );
// Но лучше так
BitBlt( PaintBox1.Canvas.Handle, 0, 0, bm.Width, bm.Height, bm.Canvas.Handle, 0, 0, SRCCOPY );
end;
Не забудь уничтожить Z-буфер при закрытии программы.
Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
bm.Free;
end;