我做了个多文档窗体,子窗体中有一段代码要执行几十分钟的时间,当我想结束正在运行的子窗体时,自然用按了关闭按键,也同时看到unload事件被触发,其中的代码也被执行,但是窗体的Terminal事件从未发生(我在其中设了断点)。表面看来,窗体已经关闭,跟踪程序发现,在程序执行到Doevents时,窗体响应了关闭事件,从而引发了unload事件,其中将当前窗体的对象变量设为nothing,并释放其他的对像变量,但在unload事件结束后又返回到Doevents后面的语句。这是怎么回事?我怎样才能引发Terminal事件?看来将窗体的对像变量设为nothing只是清除了这个对像变量对程序代码内存区的索引,实际的代码仍在内存中运行,如何终止?

解决方案 »

  1.   

    在窗体的unload事件中写上:set 窗体名=nothing
      

  2.   

    在设置窗体的对象变量为nothing之后,再加一句End.
      

  3.   

    加上End 就什么都不要管了。
      

  4.   

    don't use "unloadme" ,use "end"
      

  5.   

    各位?我只是关闭一个子窗体而已,主窗体还在运行,用END后主窗体不也就关闭了?以上的方法我都知道,大家集思广议看看有没有什么更好的办法。
      

  6.   

    关闭相关连接,结束循环,关闭窗体,相关过程不要模块级,Set .... = Nothing,再有运行的东西就奇怪了,有调用外部程序?
      

  7.   

    我解决了这个问题,但方法却不是很满意。其实即使运行一个很简单的循环也会出现这样的问题,我做了实验,在一个简单窗体名为test,是一个MDI窗体的子窗体,只用简单的循环代码 
    for i=50000
    for j=5000
    doevents
    next j
    next i就这么简单,在窗体的unload事件中加入set test=nothing,当我关闭窗体的时候,表面看来,窗体关闭了,新打开一个同样的窗体执行同样的操作也很正常。但是可以监视一下CPU的运行情况,当我关闭这个窗体时,其中的循环代码仍在运行,CPU竟然在100%的运行!所以,这里没有引用其它的对象变量,关闭窗体后代码仍在运行的情况同样是存在的,这是一个很普通的问题。解决办法:在test窗体上定义一个变量,如formisover as boolean ,在doevents后面判断一下此变量的状态,为true则exit sub,在test窗体的unload事件种,设定formisover=true。
    也就是说,关闭窗体后一定要将运行中的过程结束,这样,terminate事件终于被触发,窗体真的没了,CPU被释放。
      

  8.   

    试一试这样:
    dim unloadtag as boolean在unload之前
    unloadtag = True在循环中这个值,为真时退出循环,为假时不退出。
    for i=50000
      for j=5000
        if unloadtag then exit sub
      next j
    next i
      

  9.   

    New 一个窗体,用完成之后,使用 Set = Nothing 释放掉,看看行不行。
      

  10.   

    用API。得到正在运行窗体的线程。在线程里面杀。不止BASIC这样,DELPHI也一样在运行大量循环中关闭不了。这跟WINDOW底层有关。
      

  11.   

    通常,在整个程序没有完全结束时,子窗体的Terminate是不会执行,Unload事件只是使整个窗个被卸载,但是窗体的变量区却不会被失效,Terminate也不会执行,如果想要强制Terminate被执行,那么,你可以像如下做法,比如你的子窗体名为frmChild,那么,请如下做:
    frmChild.Show
    set frmChild=Nothing
    另外,请不要随便执行End,因为使用End,那么你的窗体中的Unload都不会被执行,整个程序就会结束。