大
大文
Unregistered / Unconfirmed
GUEST, unregistred user!
本人用一个TIMAGE装入一个图片,然后用代码动态更改该IMAGE的位置从而实现动画的效果(将图片在屏幕上移动即可),动画是出来可问题也来了。
问题:用普通代码作动画完全正常,改在多线程中就出现花屏了,除了调用的方式不同其他完全一样!
求解:还是以TIMAGE基础如何排除此问题(请别建议让我将TIMAGE放在TPANEL之类的方式,因为我自己已经实现了)。
代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons, Mask;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
Image2: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
tthread1=class(tthread)
public
caller:Tcustomform;
img:TComponent;
constructor create(ACaller:tcustomform;Aimg:TComponent=nil);
destructor destroy;override;
procedure execute;override;
end;
procedure tdemo(caller:tcustomform;img:TComponent=nil);
var
Form1: TForm1;
implementation
{$R *.dfm}
{ thread1 }
procedure tdemo(caller:tcustomform;img:TComponent=nil);
var i:integer;
begin
i:=0;
while i<caller.Width -50 do //将图片从左至右慢慢移动
begin
TImage(img).left :=i; //更改图片的位置
sleep(10);
i:=i+4;
end;
end;
constructor tthread1.create(ACaller:tcustomform;Aimg:TComponent=nil);
begin
inherited create(true);
Caller:=ACaller; //form
img:=Aimg; //image object
FreeOnTerminate :=true;
resume;
end;
destructor tthread1.destroy;
begin
inherited;
end;
procedure tthread1.execute;
begin
tdemo(caller,img); //在线程中调用例子
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
tthread1.create(self,image1); //用线程调用例子(出现花屏)
tthread1.create(self,image2);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
tdemo(Self,image1); //直接调用例子(正常)
tdemo(Self,image2);
end;
end.
问题:用普通代码作动画完全正常,改在多线程中就出现花屏了,除了调用的方式不同其他完全一样!
求解:还是以TIMAGE基础如何排除此问题(请别建议让我将TIMAGE放在TPANEL之类的方式,因为我自己已经实现了)。
代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons, Mask;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
Image2: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
tthread1=class(tthread)
public
caller:Tcustomform;
img:TComponent;
constructor create(ACaller:tcustomform;Aimg:TComponent=nil);
destructor destroy;override;
procedure execute;override;
end;
procedure tdemo(caller:tcustomform;img:TComponent=nil);
var
Form1: TForm1;
implementation
{$R *.dfm}
{ thread1 }
procedure tdemo(caller:tcustomform;img:TComponent=nil);
var i:integer;
begin
i:=0;
while i<caller.Width -50 do //将图片从左至右慢慢移动
begin
TImage(img).left :=i; //更改图片的位置
sleep(10);
i:=i+4;
end;
end;
constructor tthread1.create(ACaller:tcustomform;Aimg:TComponent=nil);
begin
inherited create(true);
Caller:=ACaller; //form
img:=Aimg; //image object
FreeOnTerminate :=true;
resume;
end;
destructor tthread1.destroy;
begin
inherited;
end;
procedure tthread1.execute;
begin
tdemo(caller,img); //在线程中调用例子
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
tthread1.create(self,image1); //用线程调用例子(出现花屏)
tthread1.create(self,image2);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
tdemo(Self,image1); //直接调用例子(正常)
tdemo(Self,image2);
end;
end.