Q
question
Unregistered / Unconfirmed
GUEST, unregistred user!
希望达到的功能:
在一个通用模块中使用类是 showWait 后弹出一个等待提示窗口,然后当前的程序继续运行,
运行完成后调用 CloseWait;方法就可以关闭这个等待窗口了,可现在的问题是,这个窗口
使用通常的方法,如:
procedure showWait;
begin
if not Assigned(Wait01) then
begin
Wait01 := TfrmWait.Create(Application);
end;
Wait01.Show;
Wait01.Update;
Application.ProcessMessages;
end;
可问题是这个窗口显示出来后就不能被更新了,除非程序中使用 wait01.update;
可在一个长时间查询数据库的时候(非异步),就没有刷新时间了,所以我希望将
这个等待窗口做成多线程的,这样他就能自己更新自己,不会被别的程序遮挡后无法还原。
我用如下代码作。可重出现错误。
unit ProgramWait_Unit;
interface
uses
Classes, Wait_Window;
type
ProgramWait = class(TThread)
private
{ Private declarations }
Wait01 : TfrmWait;
MustQuit : Boolean;
protected
procedure Execute;
override;
public
constructor Create;
destructor Destroy;
Override;
Procedure StopWin;
end;
implementation
{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure ProgramWait.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
}
{ ProgramWait }
uses Forms, ALL_DATA;
Procedure ProgramWait.StopWin;
begin
//Terminated := True;
MustQuit := True;
self.Terminate;
end;
constructor ProgramWait.Create;
begin
MustQuit := False;
if not Assigned(Wait01) then
begin
Wait01 := TfrmWait.Create(Application);
end;
//Wait01.Show;
inherited Create(False);
end;
destructor ProgramWait.Destroy;
begin
if not Assigned(Wait01) then
begin
Wait01.Close;
Wait01.Free;
Wait01:=nil;
end;
inherited Destroy;
end;
procedure ProgramWait.Execute;
begin
{ Place thread code here }
FreeOnTerminate := True;
Wait01.Show;
While Truedo
begin
if MustQuit then
Break;
if Terminated then
Break;
Application.ProcessMessages;
end;
Wait01.Close;
end;
end.
我将调用函数该城。
var
new : ProgramWait;
procedure showWait;
begin
new := ProgramWait.create;
end;
procedure hidewait;
begin
new.Terminate;
end;
调用可以出来,可一执行 hidewait 就出错。能解决吗?
在一个通用模块中使用类是 showWait 后弹出一个等待提示窗口,然后当前的程序继续运行,
运行完成后调用 CloseWait;方法就可以关闭这个等待窗口了,可现在的问题是,这个窗口
使用通常的方法,如:
procedure showWait;
begin
if not Assigned(Wait01) then
begin
Wait01 := TfrmWait.Create(Application);
end;
Wait01.Show;
Wait01.Update;
Application.ProcessMessages;
end;
可问题是这个窗口显示出来后就不能被更新了,除非程序中使用 wait01.update;
可在一个长时间查询数据库的时候(非异步),就没有刷新时间了,所以我希望将
这个等待窗口做成多线程的,这样他就能自己更新自己,不会被别的程序遮挡后无法还原。
我用如下代码作。可重出现错误。
unit ProgramWait_Unit;
interface
uses
Classes, Wait_Window;
type
ProgramWait = class(TThread)
private
{ Private declarations }
Wait01 : TfrmWait;
MustQuit : Boolean;
protected
procedure Execute;
override;
public
constructor Create;
destructor Destroy;
Override;
Procedure StopWin;
end;
implementation
{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure ProgramWait.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end;
}
{ ProgramWait }
uses Forms, ALL_DATA;
Procedure ProgramWait.StopWin;
begin
//Terminated := True;
MustQuit := True;
self.Terminate;
end;
constructor ProgramWait.Create;
begin
MustQuit := False;
if not Assigned(Wait01) then
begin
Wait01 := TfrmWait.Create(Application);
end;
//Wait01.Show;
inherited Create(False);
end;
destructor ProgramWait.Destroy;
begin
if not Assigned(Wait01) then
begin
Wait01.Close;
Wait01.Free;
Wait01:=nil;
end;
inherited Destroy;
end;
procedure ProgramWait.Execute;
begin
{ Place thread code here }
FreeOnTerminate := True;
Wait01.Show;
While Truedo
begin
if MustQuit then
Break;
if Terminated then
Break;
Application.ProcessMessages;
end;
Wait01.Close;
end;
end.
我将调用函数该城。
var
new : ProgramWait;
procedure showWait;
begin
new := ProgramWait.create;
end;
procedure hidewait;
begin
new.Terminate;
end;
调用可以出来,可一执行 hidewait 就出错。能解决吗?