模态窗口为何如此表现???(200分)

  • 主题发起人 主题发起人 mayong
  • 开始时间 开始时间
M

mayong

Unregistered / Unconfirmed
GUEST, unregistred user!
程序中我需要经常弹出一个模态窗口,执行一些工作后自动关闭,为此我新建一个
窗口(需要时自己Create),设置关闭属性为CaFree,放置一个TTimer,其OnTimer
事件如下:

var
i,j,k : integer;
begin
Timer1.Enabled:=False; //事件只执行一次
for i:=0 to 10000 do // 只是示例,整个循环执行10秒左右
for j:=0 to 50000 do
k:=i+j;
Close; //关闭此窗口
end;

运行发现窗口刚执行时还是模态的,一秒以后,程序还在循环中,没有
执行到Close,但窗口已不是模态了,(点击主窗口的Button后,当时
没有反映,但弹出窗口到时关闭后,Button的OnClick事件被触发).

请赐教!谢谢!!!
 
Close; //关闭此窗口
把这句改为:
ModalResult := mrCancle;
试试
 
我试过如下语句,不行
ModalResult := mrok
 
同意楼上
 
我试了试还是不行!!!!!


Close; //关闭此窗口
把这句改为:
ModalResult := mrCancle;
试试
 
能否把你新建此窗口的代碼貼出來。
 
创建模态窗口
with Tform2.Create(self) do
showmodal;
 
try
form2:=tform2.create(nil);
form2.showmodal;
 
form2:=tform2.create(nil);
form2.showmodal;

试了,也同样的问题
 
show事件:
begin
if not assingned(form2) then
begin
Application.creatform(Tform2,form2);
try
form2。showmodal;
except
..............
end;
end
else
form2。showmodal;
end;

在关闭事件:
procedure Tform2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=cafree;
end;

procedure Tform2.FormDestroy(Sender: TObject);
begin
form2:=nil;
end;
 
for i:=0 to 10000 do // 只是示例,整个循环执行10秒左右
for j:=0 to 50000 do
k:=i+j;

这个过程没有处理消息,所以消息留给主窗口了,改成:

for i:=0 to 10000 do // 只是示例,整个循环执行10秒左右
for j:=0 to 50000 do
begin
k:=i+j;
Application.ProcessMessages();
end;

或者即使在关闭前仅执行一次都可以的:

for i:=0 to 10000 do // 只是示例,整个循环执行10秒左右
for j:=0 to 50000 do
k:=i+j;
Application.ProcessMessages();
Close;
 
一个建议,如此ShowModal你的窗体

在Button的onClick中

var
WindowList: Pointer;
begin
WindowList := DisableTaskWindows(YouWantShowForm.Handle);
try
YouWantShowForm.Show;
for i:=0 to 10000 do // 只是示例,整个循环执行10秒左右
for j:=0 to 50000 do
k:=i+j; //or换成 Sleep(5000);Application.ProcessMessages; 如果只是显示一个提示,几秒后关闭
finally
EnableTaskWindows(WindowList);
YouWantShowForm.Close;//or YouWantShowForm.Hide;
 
忘了在最前面加一句Create;
 
谢谢朋友们的支持,给予很多建议,我再说明以下:
1、上边的示例中For循环在实际中是西门子控制器的初始化程序,是
一个DLL函数调用,我无法加入Application.ProcessMessages();
2、不调用Application.ProcessMessages(); 当前Form就不是模态的?为什么?
建立时windows已知道它是模态的
3、在Timer事件中如果不加入Close语句,则此窗口表现一切正常,
4、加入Close语句后,就象程序先执行Close再延时似的
 
Close之前执行一次 Application.ProcessMessages() 也办不到吗?
西门子控制器的初始化程序 和 Close 之间没有消息处理的话,消息仍然在进程的消息队列中
没有取出来,关闭之后,队列的消息被主窗口处理。你在close之前 ProcessMessages 一下,
就把对列中的消息处理掉了
 
谢谢Pipi和wk_knife
Pipi的第一次解释就已很清楚了,是我没看明白,不好意思
问题解决了,再一次感谢所有给予回答的朋友,
分数有限,不能一一给份,谅解,有机会到徐州:事先发信:
yshboy@263.net (老出差,请提前几天),就说是大富翁的朋友就行
 
后退
顶部