在窗体的onclose事件输入以下代码:
if (messagebox(handle,'您确定要关闭程序吗?','标题',MB_YesNo)=ID_no) then
 close;疑问1.当关闭程序时,会弹出确认对话框确认你是否退出,我点‘是’为什么就退出程序了?我这里不是……YesNo)=ID_no了吗,我的理解是点否才退出程序   为什么啊??~~~
疑问2:当关闭程序时,会弹出确认对话框确认你是否退出,我点‘否’ 结果死循环  元芳,如何解这个死循环?

解决方案 »

  1.   

    在onclose无论写什么代码窗口都会关闭,正确写法是在onclosequery事件写这段代码,并把self.close改为CanClose:=true;就可以了
      

  2.   

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if MessageDlg('你真的要关闭窗口吗?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
        Action := caFree //caHide,caMinimize
      else
        Action := caNone;
    end;
    或者:
    procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      if MessageDlg('你真的要关闭窗口吗?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
        CanClose := True
      else
        CanClose := False;
    end;
      

  3.   

    先回答问题二:Close;这句代码会触发OnClose事件……所以点关闭后,提示框出来了,选择了No,然后代码里面执行Close语句,便触发OnClose事件,之后提示框再次出来,选择No,再执行Close代码……知道为何死循环了吧?
    问题一:由上面知道OnClose事件里不能写Close;那如何写呢?楼上的给出了答案……是通过设置OnClose事件中参数Action来操作的,Action的默认值是caHide(隐藏),改为caFree就是真正的关闭,改为caNone,就是什么都不做
      

  4.   

    喂,应该写在Ooclosequery事件中吧。。
      

  5.   

    应该这样写
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if (MessageBox(Handle, '您确定要关闭程序吗?', '标题', MB_YESNO) <> ID_YES) then
      begin
        Action:= caNone;
        Exit;
      end;
    end;
      

  6.   

    我个人认为应该这样:procedure TForm1.FormCloseQuery(Sender: TObject;CanClose: Boolean);
    begin
      if Application.MessageBox('您确定要关闭程序吗?', '标题', MB_YESNO)<>ID_YES) then
      begin
        CanClose:=true;
        exit;
      end
      else //Do other things.
    end;书上说,这样才是对的。。
      

  7.   

    vcl对form的事件触发时间的设置,非常重要
    楼主的问题,应该是closequery还有一些时机,vcl并没有很好的提供事件,比如form初次稳定显示时,此时需要初始化信息,重新调整各个可见控件的位置
    现在只能靠通用的active(但必须是初次)及resize
      

  8.   

    是楼主没有处理好,在closequery中若想关闭窗口不是调用close而是CanClose:=true;就行了