我的程序结构大致如下: 
在dll中定义了两个类。 
class1中定义集合的属性和方法。 
public function yyy(参数)as class1 
  '数据写入集合 
end function class2的方法使用了class1的集合。 
public function xxx () as class1 
  dim x as new class1 
  ... 
  set xxx =x.yyy(参数) 
end function 用户端事件: 
private sub ttt() 
  dim x as new class2
  for i=1 to x.xxx.count  '这个地方在调试的时候是没有问题的,编译也行,但编译的exe运行时要报错,“对象变量为定义” 
  '读取集合 
  next 
end sub 请教怎么解决? 
我生成的dll不管是二进制兼容还是工程兼容都报错,“对象变量为定义” 。

解决方案 »

  1.   

    (1)class1有count属性么?
    (2)如果有,试试这样:<DIV class=source style="COLOR: #000000; FONT-FAMILY: 'Comic Sans MS','Lucida Console','Courier New','monospace'; BACKGROUND-COLOR: #f9f7ed" jQuery1241602327171="2"><SPAN style="FONT-WEIGHT: bold; COLOR: #006699">dim</SPAN> <SPAN style="COLOR: #000000">x1</SPAN> <SPAN style="FONT-WEIGHT: bold; COLOR: #000000">as</SPAN> <SPAN style="COLOR: #000000">class1</SPAN><BR><SPAN style="FONT-WEIGHT: bold; COLOR: #006699">dim</SPAN> <SPAN style="COLOR: #000000">x2</SPAN> <SPAN style="FONT-WEIGHT: bold; COLOR: #000000">as</SPAN> <SPAN style="COLOR: #000000">class2</SPAN><BR><BR><SPAN style="FONT-WEIGHT: bold; COLOR: #006699">set</SPAN> <SPAN style="COLOR: #000000">x2</SPAN> <SPAN style="COLOR: #555555">=</SPAN> <SPAN style="FONT-WEIGHT: bold; COLOR: #006699">new</SPAN> <SPAN style="COLOR: #000000">class2</SPAN><BR><SPAN style="FONT-WEIGHT: bold; COLOR: #006699">set</SPAN> <SPAN style="COLOR: #000000">x1</SPAN> <SPAN style="COLOR: #555555">=</SPAN> <SPAN style="COLOR: #000000">x2</SPAN><SPAN style="COLOR: #000000">.</SPAN><SPAN style="COLOR: #000000">xxx</SPAN> <BR><BR><SPAN style="FONT-WEIGHT: bold; COLOR: #006699">stop</SPAN> <SPAN style="COLOR: #0099ff; FONT-STYLE: italic">&#39;在这里看看x1是不是nothing</SPAN><BR><BR><SPAN style="FONT-WEIGHT: bold; COLOR: #006699">for</SPAN> <SPAN style="COLOR: #000000">i</SPAN><SPAN style="COLOR: #555555">=</SPAN><SPAN style="COLOR: #ff6600">1</SPAN> <SPAN style="FONT-WEIGHT: bold; COLOR: #006699">to</SPAN> <SPAN style="COLOR: #000000">x1</SPAN><SPAN style="COLOR: #000000">.</SPAN><SPAN style="COLOR: #000000">count</SPAN>&nbsp; <BR><SPAN style="FONT-WEIGHT: bold; COLOR: #006699">next</SPAN> <SPAN style="COLOR: #000000">i</SPAN><BR></DIV>
      

  2.   

    2楼贴乱了,作废。看这个(1)class1有count属性么? 
    (2)如果有,试试这样: dim x1 as class1
    dim x2 as class2set x2 = new class2
    set x1 = x2.xxx stop '在这里看看x1是不是nothingfor i=1 to x1.count  
    next i
      

  3.   


    你的回复乱码了,看不明白。
    class1 有count、item、key属性,add方法。 
      

  4.   


    msgbox x1 is nothing
    在调试的时候是false
    编译后是true
    这怎么会这么诡异呢?
      

  5.   

    你刚才那个帖子里tiger_zhao给你的建议你试了么?
      

  6.   

    public function xxx () as class1 
      dim x as new class1 
      ... 
      set xxx =x.yyy(参数) 
    end function 
    那你看看xxx返回的是不是nothing
    如果xxx本身invalid那么肯定不成啊你编译状态下count是多少?你可以把yyy函数完整的贴出来看看
      

  7.   


    在调试的环境下不是nothing,count=0
    编译后就变成nothing了
      

  8.   


    yyy函数如下:Public Function Find(Optional strMobile As String) As class1
        '按输入的参数查询,并返回一个集合类
        Dim rs As Recordset
        Dim strSql As String
        Dim i As Long
        Dim objDB As class2    '构造SQL语句
        '默认查询历史记录
        strSql = "..."    '清空当前集合
        Me.Clear    Set rs = g_Conn.Execute(strSql)
        
        '往集合中添加查询结果
        For i = 1 To rs.RecordCount
            Set objDB = New class2
            With objDB
                .属性1= rs("字段1").Value
                .属性2 = Trim$(rs("字段2").Value)
                .属性3= Trim$(rs("字段3").Value)
                .属性4= Trim$(rs("字段4").Value)
            End With
            Me.Add objDB
            Set objDB = Nothing
            rs.MoveNext
        Next    Set Find = Me
        Set rs = Nothing
    End Function
      

  9.   

    还真就奇怪了,
    'class1Option ExplicitDim mvar_Count As Integer
    Public Function Func() As Class1
        Set Func = New Class1
    End FunctionProperty Get Count() As Integer
        Count = mvar_Count
    End PropertyProperty Let Count(value As Integer)
        mvar_Count = value
    End Property'class2
    Option ExplicitPublic Function xxx() As Class1
      Dim x As New Class1  Set xxx = x.Func
    End Function'Form
    Option ExplicitPrivate Sub Command1_Click()
        Dim a As New Class2
        MsgBox a.xxx.Count
        
    End Sub
    我做了这个实验,无论做成exe还是编译状态下都可以。msgbox 显示 0
      

  10.   

    clear_zero :我也按你这么测试过是没有问题的,诡异的就是编译后会告诉我对象变量未定义。它根本都不会执行到yyy函数里面去。
      

  11.   

    按照你做的,我也没有问题估计你就是这段出错了,仔细debug看看吧  Me.Clear    Set rs = g_Conn.Execute(strSql)
        
        '往集合中添加查询结果
        For i = 1 To rs.RecordCount
            Set objDB = New class2
            With objDB
                .属性1= rs("字段1").Value
                .属性2 = Trim$(rs("字段2").Value)
                .属性3= Trim$(rs("字段3").Value)
                .属性4= Trim$(rs("字段4").Value)
            End With
            Me.Add objDB
      

  12.   


    你按我这么做也没有问题的话就说明执行到yyy里面去了,那么你对你的yyy函数先全部删掉,然后只执行到me.clear,然后看看怎么回事
    然后再慢慢往里面添东西
      

  13.   

    对象未定义,我压根都debug不到什么东西。并且逻辑上来讲第一次运行是绝对会count=0。
    也就是这段代码是可以不管的都应该正常执行的。
      

  14.   


    你具体是怎么试的?是严格按下面这样做的么?“在 DLL 的工程属性中要选用二进制兼容方式,并且先编译 dll,再编译 exe。”
      

  15.   

    编译 dll,编译 exe么?
      

  16.   

    Public Function Find(Optional strMobile As String) As class1
        ...
        Set Find = Me
        ...
    End Function
    你这个函数的返回值有什么意义?
    发神经啊!而且访问数据库不进行错误处理,你怎么保证exe运行时对象未定义的错误不是在你函数内发生的?
      

  17.   


    骂起人来了,。
    对象未定义的错误不是你函数内,我用msgbox一行行检测执行的。
      

  18.   


    你在函数里加上on error goto来抓错误,这样错误就不会再运行期间溜掉了
      

  19.   

    dim c1 as class1, c2 as class1
    ...
    set c2 = c1.Find()
    必须通过对象 c1 才能调用 Find(),执行结果 c2 就是 c1,这是必定的,有什么意义?
      

  20.   

    Set objDB = New class2
            With objDB
                .属性1= rs("字段1").Value
                .属性2 = Trim$(rs("字段2").Value)
                .属性3= Trim$(rs("字段3").Value)
                .属性4= Trim$(rs("字段4").Value)
            End With
            Me.Add objDB
            Set objDB = Nothing
            rs.MoveNext
    代码有错误。With objDB,此时objDb是nothing ,你未编译时可执行?????????????????????????????????????
      

  21.   

    我确实是在未编译时可以执行,一点问题都没有。
    同时编译之后连公用的数据连接都变成nothing了,我简直百思不得其解。
    我本是想利用自己的集合来返回数据的。
      

  22.   

    你的代码在For i = 1 To rs.RecordCount 这一行,始终返回0,所以你的count未编译时总能返回0,但是一旦这一行不为0,你的代码就通不过.
      

  23.   

    已经有了 c1,要 c2 做什么用?
    所有对 c2 的访问都能直接用 c1 访问!
      

  24.   


    按你的逻辑应该怎么修改呢?
    在调试的时候,如果能查询到值时,是可以返回整个集合的,count>0,
    如果sql语句查询不到值时,count=0
      

  25.   

    如果你先把me.clear后面的代码删除有什么结果?或者你在yyy里面添加on error goto ....Public Function Find(Optional strMobile As String) As class1
        '按输入的参数查询,并返回一个集合类
        Dim rs As Recordset
        Dim strSql As String
        Dim i As Long
        Dim objDB As class2
    on error goto ErrHandler
        '构造SQL语句
        '默认查询历史记录
        strSql = "..."    '清空当前集合
        Me.Clear    Set rs = g_Conn.Execute(strSql)
        
        '往集合中添加查询结果
        For i = 1 To rs.RecordCount
            Set objDB = New class2
            With objDB
                .属性1= rs("字段1").Value
                .属性2 = Trim$(rs("字段2").Value)
                .属性3= Trim$(rs("字段3").Value)
                .属性4= Trim$(rs("字段4").Value)
            End With
            Me.Add objDB
            Set objDB = Nothing
            rs.MoveNext
        Next
    ErrHandler:
        Set Find = Me
        Set rs = Nothing
    End Function
      

  26.   

    在使用with之前,你必须初始化对象 
    Set objDB = New class2
    objDB.属性1= rs("字段1").Value
            With objDB
                .属性2 = Trim$(rs("字段2").Value)
                .属性3= Trim$(rs("字段3").Value)
                .属性4= Trim$(rs("字段4").Value)
            End With另外,你的find方法,做了许多不该由他来完成的事
      

  27.   

    在 x2 创建后检查 x2 是否为 Nothing?
    估计你的工程没有设置二进制兼容方式编译,根本无法创建对象。
      

  28.   

    x2 是否为 Nothing?
      

  29.   

    调试下不是nothing
    编译后就是了
      

  30.   


    竟然连X2都是NOTHING啊。那就是你的DLL链接有问题了。我对DLL不熟,帮不了你,深表同情……