模式窗口中CloseQuery事件无响应

无聊的猪 2019-11-27 02:49:04
今天遇到个奇怪的问题,代码如下。


procedure TForm2.btn1Click(Sender: TObject);
var
i: Integer;
begin
i := 0;
Runing := True;
while Runing do
begin
edt1.Text := IntToStr(i);
Inc(i);
Application.ProcessMessages;
Sleep(50);
end;
end;

procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Runing := False;
end;


用模式窗口打开,Form2.ShowModal后,再点击btn1开始循环,循环的时候点击窗体的关闭按键,CloseQuery事件就没反应了。
如果只是普通的Form2.Show,这样是正常没问题的。
...全文
181 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
天行归来 2019-11-28
  • 打赏
  • 举报
回复
做了测试,貌似 ProcessMessages 并未捕获到 WM_CLOSE 消息。所以导致无法关闭。 可以这么做,重载 procedure WndProc(var message:Tmessage); 在这里实现关闭窗体,并且 CloseQuery 恢复触发


procedure TForm2.WndProc(var message: TMessage);
begin
  if Visible then
  begin
    if message.Msg=WM_CLOSE then
    begin
      Runing := false;
      //Close;
    end;
  end;
  Inherited WndProc(message);
end;

BlueStorm 2019-11-27
  • 打赏
  • 举报
回复
应该用timer事件,而不是用While+sleep

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧