我的目的很简单,在窗体的OnShow中检测一些条件,如果条件不成立则关闭该窗体。
在OnShow中直接调用Close不行,我使用PostMessage(Self.Handle,WM_Close,0,0);
可以关闭。但有缺陷:
PostMessage后,如果再调用ShowMessage之类的过程,或者发生Exception时
(有出错提示)则PostMessage就无效,也就是说窗体关不掉。
不知道PostMessage的消息是不是被丢掉了。另外把PostMessage换成SendMessage或
self.perform也不行。
有什么方法能够正确关闭窗体呢?各位能给我点提示吗?谢谢!

解决方案 »

  1.   

    是不是要关闭整个程序:
    application.terminate
      

  2.   

    no, 只关闭窗体。
    也别告诉我在外面判断完之后在Show窗体。
      

  3.   

    在窗体的OnShow事件里判断是否应关闭窗体,赋给窗体级全局变量F_Close: Boolean;
    利用一个定时器,检测到F_Close=True就Close;
      

  4.   

    我试过没问题呀!
    Form1代码:procedure TForm1.Button1Click(Sender: TObject);
    var
      AFrm : Tform;
    begin
      AFrm := TForm2.Create(application);
      AFrm.Show;
      Afrm.free;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      showmessage('Hello');
    end;Form2代码:
    procedure TForm2.FormShow(Sender: TObject);
    begin
      PostMessage(handle,wm_close,0,0);
    end;
      

  5.   

    To: Wnyu(能)
    你把 showmessage('Hello'); 写到 TForm2.FormClose 事件里试试。
      

  6.   

    To: DDGG(叮叮当当) 
    没问题呀
    Form2的Close永远不会执行! 它只会执行Destroy.
      

  7.   

    同意movingboy(movingboy)的说法。这样写才是一个职业的程序员。从技术上讲,是可以实现的, 实际上OnShow的执行窗体已经显示了,去了解以下Delphi的窗体创建和各个属性和事件的执行顺序吧,就找到答案了。
      

  8.   

    一点解释
      show只是post了一个paint消息,这个消息只会加到消息队列,不一定会立刻执行,也就是说这时候窗体还不一定画出来,你用close是肯定不行的。
      你用PostMessage(Self.Handle,WM_Close,0,0),也只是post了一个close消息,然后排队,他排在了paint的后面,因为paint首先得到处理,然后才处理close,所以你能够关闭。如果发生异常,窗口不会继续porcessmessage,所以你post的close不一定得到处理,就象sleep函数。
      如果你是要结束整个应用,可以用application.terminate;
      
      我是个菜鸟,你的问题我再想想
      

  9.   

    ID可以是中文了?
    ()000o
    (    )
     )  /
    (__/
      

  10.   

    谢谢各位的回复!
    我认为设置Timer方法可以实现,但表现上不太好。
    最后我的应用还是把判断放在Show之前(经管有两个窗体都要Show同一个form)。
    同意movingboy(movingboy)和wengj()的建议,另外特别感谢:lws0472(天外飞仙) 的解释。
    虽然结贴,但讨论继续……有更好的方法希望相互交流!
      

  11.   

    我想到了一个好办法,与大家共享:
    1. 在窗体formX中定义公共方法,如Open
    public
      procedure Open;procedure formX.Open;
    begin
      // 进行需要的判断
      // ....
      if True then Self.Show;
    end;
    2. 需要formX显示时,调用formX.Open;看懂了吗?
    如果需要ShowModal, 将procedure改为function并返回
    Result := Self.ShowModal;
    万无一失!