![]() |
|
|
#1
|
|||
|
|||
|
Подскажите пожалуйста как можно построить график не мгновенно, а чтобы график строился "во времени" - т.е. плавное построение графика....
Данная программа строит график мгновенно и несколько раз, подскажите пожалуйста как построить плавно по точкам Код:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
ExtCtrls, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
x0, y0 : integer;
h, w : integer;
dx, dy : integer;
x, y : integer;
cross : integer;
dcross : integer;
lx, ly : real;
dlx,dly: real;
i : integer;
a,b: integer;
xg, yg : array[0..12] of integer;
implementation
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled:=false;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
x0:=30; y0:=420;
h:=400; w:=520;
dx:=40; dy:=40;
dcross:=1;
dlx:=1.0; dly:=1.0;
with form1.Canvas do
begin
pen.Color:=clBlack;
cross:=dcross;
moveto(x0,y0); lineto(x0,y0-h);
moveto(x0,y0); lineto(x0+w,y0);
//засечка, сетка и оцифровка по оси Х
x:=x0+dx;
lx:=dlx;
repeat
moveto(x, y0-3); lineto(x, y0+3);
cross:=cross-1;
if cross = 0 then
begin
textout(x-8,y0+5,floattostr(lx));
cross:=dcross;
end;
pen.style:=psdot;
moveto(x, y0-10); lineto(x, y0-h);
pen.style:=pssolid;
lx:=lx+dlx;
x:=x+dx;
until(x>x0+w);
y:=y0-dy;
ly:=dly;
repeat
moveto(x0-3, y); lineto(x0+3, y);
textout(x0-20,y,floattostr(ly));
pen.style:=psdot;
moveto(x0+3, y); lineto(x0+w, y);
pen.style:=pssolid;
y:=y-dy;
ly:=ly+dly;
until(y<y0-h);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
for i:=0 to 12 do
begin
xg[i]:=i;
yg[i]:=random(10);
end;
// построение графика
with canvas do
begin
pen.Style:=psSolid;
pen.Color:=clRed;
x:=trunc(x0+xg[0]*dx/dlx);
y:=trunc(y0-yg[0]*dy/dly);
moveto(x,y);
for i:=1 to 12 do
begin
x:=trunc(x0+xg[i]*dx/dlx);
y:=trunc(y0-yg[i]*dy/dly);
lineto(x,y);
end;
end;
//i:=i+1;
end;
initialization
{$I unit1.lrs}
end.
|
|
#2
|
||||
|
||||
|
Цитата:
|
|
#3
|
||||
|
||||
|
В имидж медленно рисует, лучше уж PaintBox.
|
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
||||
|
||||
|
Извиняй, читал по диагонали.
|
|
#6
|
|||
|
|||
|
Цитата:
а чем плохо рисовать просто на форме? |
|
#7
|
||||
|
||||
|
тем, что уведи за границу экрана форму и верни назад, рисунок сотрется.
|
|
#8
|
||||
|
||||
|
В таком случае и в PaintBox потеряет картинку, нужно обновлять.
|
|
#9
|
||||
|
||||
|
рисовать в OnPaint
|
|
#10
|
||||
|
||||
|
рисовать по таймеру на "буферном" битмапе, отрисовывать битмап в OnPaint контрола.
|