就是组件的事件不响应,就是当应用程序和组件都是源代码形式调试时,事件能够响应。当两者是EXE和DLL文件存在时,事件也相应了,但是当组件编译后,应用程序用源代码调试时,不能响应事件。

解决方案 »

  1.   

    我们遇到了好几次这样的问题,我这几天编一个业务数据对接的组件,开始的时候我是用一个工程组进行调试,一切OK,当我把组件编译出来,单独用应用程序的源代码调试的时候,组件能够正常初始化和运行,但是在我的应用程序中不能够捕获到组件的事件,所有的组件的事件都没有响应,但当我把应用程序也编译成EXE时,系统又能够响应其组件的事件。
      

  2.   

    '窗体中
    Option Explicit
    Dim SystemName As String
    Dim UserName As String
    Dim HDbc As String
    Dim TableName As String
    Dim FieldName As String
    Dim bFlag As Boolean
    Dim MediaFlag As Boolean
    Dim OrderBM As String
    Public Event AfterSelect(OrderBM As String, MediaFlag As Boolean)Private Sub CM_Cancel_Click()
    RaiseEvent AfterSelect(OrderBM, MediaFlag)
    Unload MeEnd SubPrivate Sub CM_OK_Click()
    Dim i As Integer
    For i = 1 To ListView1.ListItems.Count
       If ListView1.ListItems(i).Checked = True Then
          OrderBM = OrderBM & ListView1.ListItems(i).Text & ","
       End If
       
    NextIf Len(OrderBM) > 0 Then
       OrderBM = Left(OrderBM, Len(OrderBM) - 1)
    End IfRaiseEvent AfterSelect(OrderBM, MediaFlag)
    Unload MeEnd SubPrivate Sub Form_Resize()
    If bFlag = False Then
      Frame1.Width = Me.Width
      Frame2.Visible = False
    End IfEnd SubPrivate Sub Option1_Click()
      MediaFlag = Option1.ValueEnd SubPrivate Sub Option2_Click()
      MediaFlag = Not Option2.Value
     
    End Sub
    Public Sub init(vSystemName As String, vUserName As String, vHDbc As Long, vTableName As String, vFieldName As String, sFlag As Boolean)
       SystemName = vSystemName
       UserName = vUserName
       TableName = vTableName
       FieldName = vFieldName
       bFlag = sFlag
       HDbc = vHDbc
       
       OrderBM = ""
       InitList
    End Sub
    '根据条件显示所有的单据号
    Private Sub InitList()
     Dim StrSQL As String
     Dim icount As Long
     Dim rhstmt As Long
     Dim strValue As String * 100
     Dim TempList As ListItem
     ListView1.ListItems.Clear
     StrSQL = "select Distinct " & FieldName & " from OA_Data.sysdba." & TableName & " where MA01='已审核'"
     If bFlag = True Then
        StrSQL = StrSQL & " and MA02='未送审'"
     Else
        StrSQL = StrSQL & " and (MA02='未送审' or ma02='审批同意') and MA03='未提交'"
     End If
       rhstmt = sysBufferTablePrepareGetData(HDbc, StrSQL)
        If rhstmt > 0 Then
            icount = sysBufferTableGetRecord(rhstmt)
            Do While icount > 0
                  strValue = String(100, Chr(0))
                  sysBufferTableGetData rhstmt, 1, strValue
                  icount = sysBufferTableGetRecord(rhstmt)
                  Set TempList = ListView1.ListItems.Add(Text:=Trim(vbStr(strValue)))
                  TempList.Tag = "0"
                  TempList.icon = 17
            Loop
        End If
        
    End Sub'类中
    Option Explicit
    Dim SystemName As String
    Dim UserName As String
    Dim HDbc As Long
    Dim TableName As String
    Dim FieldName As String
    Dim bFlag As Boolean
    Dim isChild As Boolean
    Public Event AfterSelect(OrderBM As String, sFlag As Boolean)Dim WithEvents frmsl As frm_DJselectPrivate Sub Class_Initialize()Set frmsl = New frm_DJselectEnd Sub
    Public Sub init(vSystemName As String, vUserName As String, ByVal vHDbc As Long, vTableName As String, vFieldName As String, sFlag As Boolean)
       SystemName = vSystemName
       UserName = vUserName
       TableName = vTableName
       FieldName = vFieldName
       bFlag = sFlag
       HDbc = vHDbc
       frmsl.init SystemName, UserName, HDbc, TableName, FieldName, sFlag
       
    End SubPublic Sub show()
    '    isChild = True
    '    If Not isChild Then
    '        SetParent frmsl.hWnd, vParenthwnd
    '        SetWindowLong frmsl.hWnd, -16, WS_CHILD Or WS_CLIPCHILDREN Or WS_CLIPSIBLINGS Or WS_TABSTOP
    '        frmsl.Top = 0
    '        frmsl.Left = 0
    '        Dim rt As RECT
    '        GetClientRect vParenthwnd, rt
    '        ParentResize rt.Right * 15, rt.Bottom * 15
    '        ShowWindow frmsl.hWnd, SW_SHOW
    '        isChild = True
    '        SetFocus vParenthwnd
    '    Else
           ' frm_SL.Caption = m_name
            frmsl.show vbModal
            isChild = False
    '    End IfEnd Sub
    Public Sub ParentResize(vwidth As Long, vheight As Long)
        frmsl.Top = 0
        frmsl.Left = 0
        frmsl.Width = vwidth
        frmsl.Height = vheight
    End SubPrivate Sub Class_Terminate()
    Unload frmsl
    If Not frmsl Is Nothing Then
    Set frmsl = Nothing
    End IfEnd SubPrivate Sub frmsl_AfterSelect(OrderBM As String, MediaFlag As Boolean)
     RaiseEvent AfterSelect(OrderBM, MediaFlag)
     
    End Sub'应用程序调用
    Dim WithEvents SBselect As ERP_ConfigSelect'在事件中初始化
      Set SBselect = New ERP_ConfigSelect
     SBselect.init SystemName, Username, hdbc, "MrPlan", "OR02", True
     SBselect.Show'调用事件 这个事件在组件编译后,用源代码调试程序不响应
    Private Sub SBselect_AfterSelect(OrderBM As String, sFlag As Boolean)
      MsgBox "fff"
    End Sub
    '上面说的是这个组件中很简单的一个类,一个选择单据号的窗体,这个组件中的其他类的事件也是同样的情况