程序原来不是这样的,后来不知是什么时候开始的,我的程序里如果有错误,比如变量未定义,数组溢出等问题的时候,vb会提示出错误的原因,然后点停止程序按钮,整个vb就退出了.很苦恼啊,有时候还没保存就点运行然后出问题后vb退出,白编了,而新建一个工程,就不会退出!高手帮忙解答一下

解决方案 »

  1.   

    是否拦截了窗口的消息,用自己的过程处理消息?
    是否用了api直接操控内存?   
    我只遇到过这2种直接退出的情况。
    其他还有什么会导致,就不知道了
      

  2.   

    on error goto next '如果错误继续运行
    建议用if语句,或错误捕捉.
      

  3.   

    最近在程序里新加了一个控制窗口到达一定尺寸时,拖动操作不管用的模块,没有用普通的方法处理,因为普通的方法会使窗口闪烁,难道是这个模块的原因?'控制窗体最小限定的代码
    '新建一个标准模块.
    '代码如下
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
      (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
     Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
      (ByVal hWnd As Long, ByVal nIndex As Long) As Long
     Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
      (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, _
       ByVal wParam As Long, ByVal lParam As Long) As Long Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
       lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
     Public Const GWL_WNDPROC = (-4)
     Public Const WM_GETMINMAXINFO = &H24
     Type POINTAPI
            x As Long
            y As Long
     End Type
     Type MINMAXINFO
            ptReserved As POINTAPI
            ptMaxSize As POINTAPI
            ptMaxPosition As POINTAPI
            ptMinTrackSize As POINTAPI
            ptMaxTrackSize As POINTAPI
     End Type
     Public preWinProc As Long Public Function wndproc(ByVal hWnd As Long, ByVal Msg As Long, _
                             ByVal wParam As Long, ByVal lParam As Long) As Long
     Dim lwd As Long, hwd As Long
     If Msg = WM_GETMINMAXINFO Then
         Dim maxmin As MINMAXINFO
         CopyMemory maxmin, ByVal lParam, Len(maxmin)
         'maxmin.ptMaxTrackSize.x = 1000 '设定最大Resize的宽度
         'maxmin.ptMaxTrackSize.y = 800'设定最大Resize的高度
         maxmin.ptMinTrackSize.x = 800 '设定最小Resize的宽度
         maxmin.ptMinTrackSize.y = 600 '设定最小Resize的高度
         CopyMemory ByVal lParam, maxmin, Len(maxmin)
     Else
        wndproc = CallWindowProc(preWinProc, hWnd, Msg, wParam, lParam)
     End If
     End Function
      

  4.   

    然后在load 和unload 里有如下代码
    Private Sub MDIForm_Load()
    frmSplash.Show
    DoEvents
    Call MDIfrmMainInit
    TimerMain.Enabled = True
    Unload frmSplash'控制窗体最小限定的代码
    Dim ret As Long
    preWinProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
    ret = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf wndproc)
    '控制窗体最小限定的代码
    End SubPrivate Sub MDIForm_Unload(Cancel As Integer)
    TimerMain.Enabled = False
    '控制窗体最小限定的代码
    Dim ret As Long
    ret = SetWindowLong(Me.hWnd, GWL_WNDPROC, preWinProc)
    '控制窗体最小限定的代码
    End Sub
      

  5.   

    偶觉得楼主在没有查明原因前要设置在每次运行调试前自动保存程序,如二楼所说,一些api错误和内存溢出会导致ide崩溃
      

  6.   

    ret = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf wndproc)你这就是拦截窗口消息自己处理嘛。就是这个导致的。
    不信就把setwindowslong,getwindowslong三句注释掉,保准出错也不会直接退出ide了。如果消息的制造者是自己的另一个程序,那倒可以把消息替换成不常用的事件,然后在事件里面写处理代码。这个方法我屡试不爽,环保又卫生。
    但如果无法控制消息产生,比如要实现鼠标在非标题区也能拖动窗体,就没法了。
      

  7.   

    这个没办法,因为消息是windows产生的,修改不了.
      

  8.   

    不要亂用API﹐都是API惹得禍~~