为什么直接在FORM上画图的动态效果出来,而在IMAGE上是一起出来,请看代码(100分)

  • 主题发起人 主题发起人 yuki11111111
  • 开始时间 开始时间
Y

yuki11111111

Unregistered / Unconfirmed
GUEST, unregistred user!
unit a1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
procedure Drowline1(z:timage;xx1,yy1,xx2,yy2:integer);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
x,y:integer;
begin
canvas.Pen.Style :=psInsideFrame ;

canvas.MoveTo(0,100);
for x:=0 to 314 do
begin
y:=round(sin(x/100)*100);
canvas.lineto(x,100-y);
sleep(60);
end;
end;

procedure TForm1.Drowline1(z:timage;xx1,yy1,xx2,yy2:integer);
var
i,j,i1,j1 ,y0:integer;
x,y,b:real; //
k11,k22:variant ;
k :real;
x1,x2,y1,y2:integer; //real; //
begin
x1 :=xx1;
y1 :=yy1;
x2 :=xx2;
y2 :=yy2;
k11 :=(y2-y1)/(x2-x1);
k :=k11;
k22 :=y1-k*x1;
b :=k22;
z.canvas.Pen.Color :=clblue;
z.canvas.MoveTo(x1,y1);
x:=x1;
k11 :=abs(x2-x1);
j :=k11;
k11 :=x2-x1;
i1 :=k11;
for i:=0 to j do begin
k11 :=x;
j1 :=k11;
if i1 < 0 then begin
y:=k*(j1-i)+b;
k11 :=y;
y0 :=k11;
z.canvas.lineto(j1-i,y0);
end else begin
y:=k*(x+i)+b;
k11 :=y;
y0 :=k11;
z.canvas.lineto(j1+i,y0);
end;
sleep(100);

end;



end;
procedure TForm1.Button2Click(Sender: TObject);
var
i,j,i1,j1 ,y0:integer;
x,y,b:real; //
k11,k22:variant ;
k :real;
x1,x2,y1,y2:real; //integer;
begin
canvas.Pen.Style :=psInsideFrame ;
x1:=90;
y1:=80;
x2:=20;
y2:=210;
k11 :=(y2-y1)/(x2-x1);
k :=k11;
k22 :=y1-k*x1;
b :=k22;
canvas.Pen.Color :=clblue;
canvas.MoveTo(90,80);
x:=90;
k11 :=abs(x2-x1);
j :=k11;
k11 :=x2-x1;
i1 :=k11;
for i:=0 to j do begin
k11 :=x;
j1 :=k11;
if i1 < 0 then begin
y:=k*(j1-i)+b;
k11 :=y;
y0 :=k11;
canvas.lineto(j1-i,y0);
end else begin
y:=k*(x+i)+b;
k11 :=y;
y0 :=k11;
canvas.lineto(j1+i,y0);
end;
sleep(100);

end;


end;

procedure TForm1.Button3Click(Sender: TObject);
begin
canvas.Pen.Color :=clred;
canvas.MoveTo(130,30);
canvas.lineto(270,170);


end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Drowline1(image1,130,30,270,170);
// Drowline1(image1,30,50,170,270);
end;

end.
 
可能是Image的刷新方式和窗体不同,Image在函数执行时无法自动刷新,需要用在sleep(100);前加z.repaint;刷新
 
self.DoubleBuffered := true;
你把窗体设为双缓冲试试
 
不止是image控件如此,大部分的控件都是如此,打个比方form1上有N个edit为edit1/edit2---edit N,外加一个button
如果执行下面的点击炒作
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to N do
begin
TEdit(FindComponent('edit'+inttostr(i))).Text := TEdit(FindComponent('edit'+inttostr(i))).Text+'*';
//TEdit(FindComponent('edit'+inttostr(i))).Repaint;
sleep(300);
end;
end;
如果没有注释的那句刷新,你会看到*会在操作全部执行完才一起显示,而如果有那句,*则是一个一个的加上去,当然用refresh效果一样
 
问题已经解决 :z.update 就可以啦
 
后退
顶部