打开一个窗口,执行一些任务,在任务完成后,会给这个窗体发一个消息。但在任务的执行过程中,用户可能会关闭这个窗体。这种情况下,PostMessage消息时,因为窗体的Handle对应的这个窗体已经关闭,会报一个内存错误。有没有什么方法,可以通过窗体的Handle来判断这个窗体是否有效?

解决方案 »

  1.   

    FindWindow如果窗体存在返回值为窗体handle,如果不存在返回为nil可以将PostMessage改为SendMessage
    发出去就不管了,管它存不存在,不过不建议这样
      

  2.   

    试了一下IsWindow,跟踪到IsWindow(frm.Handle),这一步就报错了,00000180内存无法访问,好像窗口关闭后,frm.Handle就不能访问。
      

  3.   

    还是用Assigned判断窗体实例是否可用吧,如果frm都不存在了,frm.Handel肯定出错
      

  4.   

    先判断frm是否为nil,再将frm.Handle用try括起来(如果引发异常,说明frm对象已无效),最后再用IsWindow判断frm.Handle
      

  5.   

    用try捕捉异常就可以了,出异常就是窗口关闭了,进入相应流程
      

  6.   

    因为窗体已经关闭并释放,调用前IsWindow(frm.Handle)时,frm对象已经释放,肯定会抱错,建议两个方法,请选择其中一个:
    1。frm释放时,即ondestroy时,将frm引用设置为nil,这样你就可以通过判断frm=nil,得出窗口已经被释放;
    2。在窗口对象创建时候,获取窗口的句柄,并通过isWindow进行判断;至于楼上说的通过异常处理,我各个人觉得也可以;
      

  7.   

    我用IsWindow()判断出了窗体是否有效。