在线程中怎样ShowModle另外的一个窗体?我写的一个总有问题 ( 积分: 100 )

  • 主题发起人 主题发起人 dulei_115
  • 开始时间 开始时间
D

dulei_115

Unregistered / Unconfirmed
GUEST, unregistred user!
在Form1(不是MainForm,是MainForm中ShowModle来的)的线程中打开一个实现简单功能的窗体FormTest,总是报错,EInvalidOperation类型错误,Canvasdo
es not allow drawing
代码:
with TFormTest.Create(vOwner)do
//vOwner 是通过重写Thread的Create函数得到的Form1
begin
ShowModle;
Free;
end;

单独运行,不报任何错误,只是FormTest没有出来
在Delphi中运行时报上面的那个错误,错误停在TFormTest.Create处,而且按F9继续时程序不会显示错误,只是FormTest没有出来。
但是如果我在TFormTest.Create处设置断点,按F8一步步来调又不会报错,而且FormTest也会出来
谁能告诉我怎么回事,这个问题怎么解决?或者谁告诉我你们是怎么实现在线程中ShowModle其他窗体的。
 
在Form1(不是MainForm,是MainForm中ShowModle来的)的线程中打开一个实现简单功能的窗体FormTest,总是报错,EInvalidOperation类型错误,Canvasdo
es not allow drawing
代码:
with TFormTest.Create(vOwner)do
//vOwner 是通过重写Thread的Create函数得到的Form1
begin
ShowModle;
Free;
end;

单独运行,不报任何错误,只是FormTest没有出来
在Delphi中运行时报上面的那个错误,错误停在TFormTest.Create处,而且按F9继续时程序不会显示错误,只是FormTest没有出来。
但是如果我在TFormTest.Create处设置断点,按F8一步步来调又不会报错,而且FormTest也会出来
谁能告诉我怎么回事,这个问题怎么解决?或者谁告诉我你们是怎么实现在线程中ShowModle其他窗体的。
 
EInvalidOperation类型错误,Canvasdo
es not allow drawing
无效操作,画布没有允许绘画
应当和线程的调用有关系
 
有没有人知道,告诉我一声,在线等
 
Canvas,本身在线程里面就不能共用,一般要用是
要锁定,
Canvas.Lock
解锁 Canvas.UnLock
 
to lqcros
可以说清楚一点吗?是这样吗?试过还是出一样的错误
vOwner.Canvas.Lock;
with TFormTest.Create(vOwner)do
//vOwner 是通过重写Thread的Create函数得到的Form1
begin
ShowModle;
Free;
end;
vOwner.Canvas.UnLock;
 
这样试了吗?
with TFormTest.Create(vOwner)do
//vOwner 是通过重写Thread的Create函数得到的Form1
begin
vOwner.Canvas.Lock;
ShowModle;
vOwner.Canvas.UnLock;

Free;
end;
 
还是报错,出错时Delphi定位到with TFormTest.Create(vOwner)do
 
我在这里写过一个例子
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3265903
 
jlutt-sadan,你真是无所不能...
把我MAIL给你的csdn的那个回了吧,分本来就应当是你的
 
csdn上的分就不要了,
 
好吧,那我注册个小号去接自己的分...
 
to jlutt-sadan
不用消息行不行,而且我看过你的那个例子,功能和ShowModle有点出入
ShowModle是Show出来后直到用户关闭后再执行之后的代码,你的那个定时的
难道MainForm在Form3关闭后再发消息给线程,而线程循环等待??好麻烦,而且我又不会消息
 
不太明白你要的是什么功能:(。。
而且例子showmodal后也没让线程停掉的啊。
 
我要的功能就是
...
with TFormTest.Create(vOwner)do
begin
ShowModle;
Free;
end;
...
功能很简单,弹出一个窗体Form3直到该窗体关闭后线程才继续执行下面的代码。
而你的那个好像没有线程等待窗体关闭的过程。难道要MainForm在Form3关闭后再发消息给线程,而线程一直循环等待,知道收到消息后再继续下面的代码??
 
那直接在线程里面showmodal里没什么问题的啊?
procedure TFormThread.Execute;
var
i: Integer;
Form3: TForm3;
begin
FIndex := 0;
for i := 0 to 200do
begin
FIndex := FIndex + 1;
Synchronize(DoSend);
Sleep(5);
if i = 100 then
begin
Form3 := TForm3.Create(nil);
try
if not Form3.ShowModal=IDOK then
exit;
finally
Form3.Free;
end;
end;
//if not ShowForm3 then
exit;
if Terminated then
exit;
end;
end;
 
那你看看我的第一条的说明,没有问题我就不会问了,我就不懂
 
说明一下,create(nil),create(vOwner), create(application)我都试过,都是同样的问题
 
我的代码,Form1不是主窗体,是有另外一个窗体ShowModle来的,我就想ShowmodleForm3出来,可是总报错或者不出来
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMyThread = class(TThread)
private
fOwner: TForm;
protected
procedure Execute;
override;
public
constructor Create(vOwner: TForm);
destructor Destroy;
override;
end;
var
Form1: TForm1;
vMyThread: TMyThread;
implementation
uses Unit3;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
vMyThread := TMyThread.Create(Self);
end;

{ TMyThread }
constructor TMyThread.Create(vOwner: TForm);
begin
inherited Create(False);
fOwner := vOwner;
end;

destructor TMyThread.Destroy;
begin
fOwner := nil;
inherited;
end;

procedure TMyThread.Execute;
begin
inherited;
with TForm3.Create(fOwner)do
begin
ShowModal;
Free;
end;
end;
end.
 
拜托,所有界面相关的东东全部要放在主线程中操作
两个线程同时操作界面是有冲突的
用同步的方法,调用主线程中的方法来显示窗口吧
 
后退
顶部