MyImage: TImage; MyImage.Create(Self);这两句写在线程里就会出错???写在主程序里,就没有问题。 ( 积分: 100 )

  • 主题发起人 主题发起人 lizi_you
  • 开始时间 开始时间
L

lizi_you

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在程序中,开启了一个线程,并将原程序拷到这个开启的线程,就会出错!
MyImage: TImage;//
MyImage.Create(Self);//程序一运行到这里就会出错!
为什么,在线程中不能创建MyImage对象呢???
 
我现在程序中,开启了一个线程,并将原程序拷到这个开启的线程,就会出错!
MyImage: TImage;//
MyImage.Create(Self);//程序一运行到这里就会出错!
为什么,在线程中不能创建MyImage对象呢???
 
改为
MyImage:= TImage。create 试试。
或 MyImage.Create(Nil);//
 
真是晕拉!!
你的写法就有问题!!
正确的写法如下:
var
MyImage: TImage;
begin
MyImage:=TImage.Create(Self);//此处不能用MyImage.Create(Self),因为此时MyImage是nil,所以调用它的任何方法都会出错!
try
//处理过程。。。。。。
finally
MyImage.Free;
end;
end;
 
MyImage:=TImage.Create(Self);
//这样话就不用手工释放,恐怕不可以在线程里用吧
MyImage:=TImage.Create(nil);
//这样话就要用手工释放,可以在任何地方用
 
MyIMage := TImage.Create(Self);
//此句是不能放到线程中使用;
但是,我现在需要在窗体上创建一个Image对象.
如果,使用MyImage:=TImage.Create(nil),那么这个MyImage是建立在窗体上的吗?
 
不行的,既然MyImage没有上面特别的,就可以调用form上的方法来建立,也就是说TImage需要建立在Form,MyImage是Form的一个成员
有个概念,如果你在Form上放一个按钮,这个按钮的Click事件就是建立一个
TImage,你可以这样
with TImage.Create(nil)do
begin
parent := Form1;// 很重要
width := xx;
height := xx;
left := xx;
top := xx;
show;
end;

或者按你说的
MyImage = TImage.Create(nil);
with MyImagedo
begin
/// 和上面相同
end;
这个时候Create后面的参数关系不是很大,

你的方法可以这样,你看看行不行
TForm1 = class(TForm)
……
private
MyImage : TImage;
……
public
……
procedure CreateImage(ALeft, ATop, AWidth, AHeight);
end;

procedure CreateImage(ALeft, ATop, AWidth, AHeight);
begin
MyImage := TImage.Create(nil);
// 后面都一样
end;

……
在线程里面就用
Sysxxxxxxxx(Form1.CreateImage(xx,xx,xx,xx))(单词记不住了)
看看行不行
 
MyImage:=TImage.Create(Form1.handle),这个MyImage是建立在窗体上的.
 
线程中可以创建MyImage,至于你说的不能在线程中创建,是由于你创建的线程函数的返回值的类型所导致的。
 
多人接受答案了。
 
后退
顶部