这是怎么回事?(100分)

  • 主题发起人 主题发起人 gaozhou
  • 开始时间 开始时间
G

gaozhou

Unregistered / Unconfirmed
GUEST, unregistred user!
有三个事件。
procedure form1show(sender:object);
begin
works;
end;
procedure form1close(sender:object);
begin
a1 := 0;
a2 := 0;
end;
procedure button1click(sender:object);
begin
close;
end;
procedure works
var
i:integer;
begin
for i:= 1 to 500 do
begin
application.postmessage;
sleep(1);
//这里做了一些动作
end;
end;
当点击button1时,应该退出系统,但是结果是执行到了sleep(1)这条语句。
谁能告诉我是为什么吗?
 
怀疑跟事件执行的顺序有关
 
不小心把button1的OnClick设成form1show了
 
看看Button的事件
 
是不是把works写在formclose里了??
 
上面说的都不是。
 

application.postmessage;
sleep(1);
//这里做了一些动作

这个过程太慢了,以至于在你点到Button1时它还没有结束...
 
单步运行跟踪一下看看...
 
很简单啊!
form1.show是窗体显示的时候触发的,当你按下鼠标的时候,鼠标会下陷吧?于是会导致应用程序
进行图形界面的重绘,以反映出这种变化,重绘完了,就会调用窗体的显示 Show 方法了,

理所当然,你的 works 过程就被执行了!!!

呵呵,,,清楚了吧!
 
楼上不大对,按下鼠标的时候不会触发form1.show的。
同意crystal,
for i:= 1 to 500 do
begin
application.postmessage;
sleep(1);
//这里做了一些动作
end;
----------------------->这个过程太慢了,你close时上循环还没结束。
不信你把500改成1,application.postmessage 去掉试试,肯定正常。

非要那样的话可定义一个全局变量 q:boolean;

代码改一下

procedure form1show(sender:object);
begin
works;
q:=False;
end;
procedure form1close(sender:object);
begin
a1 := 0;
a2 := 0;
end;
procedure button1click(sender:object);
begin
q:=True;
close;
end;
procedure works
var
i:integer;
begin
for i:= 1 to 500 do
begin
if not q then
begin
// sleep(1)
干嘛要睡觉?
//这里做了一些动作
application.postmessage;
end else break;
end
end;

包ok.
 
和WINDOWS消息传递有关吧。
for i:= 1 to 500 do
begin
application.postmessage;
sleep(1);
//这里做了一些动作
end;
向消息队列中投入消息,postmessage只管投送消息,立即返回(不管处理已否),然后
又投入了相同的消息。将导致CLOSE相应的消息得不到处理,没有实验代码,也许是这样
得吧?!!?你将postmessage换成sendmessage看看,如果CLOSE成功说明理解就没有错
了!
 
aaa:

是这样的吗?

我没去试?我只是想想的,,呵呵,,我看看,,,
 
呵呵,我试试!还没遇到过
 
多人接受答案了。
 
后退
顶部