今天遇到个奇怪的问题,代码如下。
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,这样是正常没问题的。

解决方案 »

  1.   

    应该用timer事件,而不是用While+sleep
      

  2.   

    做了测试,貌似 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;