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