我的程序结构大致如下:
在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不管是二进制兼容还是工程兼容都报错,“对象变量为定义” 。
在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不管是二进制兼容还是工程兼容都报错,“对象变量为定义” 。
(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">'在这里看看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> <BR><SPAN style="FONT-WEIGHT: bold; COLOR: #006699">next</SPAN> <SPAN style="COLOR: #000000">i</SPAN><BR></DIV>
(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
你的回复乱码了,看不明白。
class1 有count、item、key属性,add方法。
msgbox x1 is nothing
在调试的时候是false
编译后是true
这怎么会这么诡异呢?
dim x as new class1
...
set xxx =x.yyy(参数)
end function
那你看看xxx返回的是不是nothing
如果xxx本身invalid那么肯定不成啊你编译状态下count是多少?你可以把yyy函数完整的贴出来看看
在调试的环境下不是nothing,count=0
编译后就变成nothing了
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
'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
'往集合中添加查询结果
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
你按我这么做也没有问题的话就说明执行到yyy里面去了,那么你对你的yyy函数先全部删掉,然后只执行到me.clear,然后看看怎么回事
然后再慢慢往里面添东西
也就是这段代码是可以不管的都应该正常执行的。
你具体是怎么试的?是严格按下面这样做的么?“在 DLL 的工程属性中要选用二进制兼容方式,并且先编译 dll,再编译 exe。”
...
Set Find = Me
...
End Function
你这个函数的返回值有什么意义?
发神经啊!而且访问数据库不进行错误处理,你怎么保证exe运行时对象未定义的错误不是在你函数内发生的?
骂起人来了,。
对象未定义的错误不是你函数内,我用msgbox一行行检测执行的。
你在函数里加上on error goto来抓错误,这样错误就不会再运行期间溜掉了
...
set c2 = c1.Find()
必须通过对象 c1 才能调用 Find(),执行结果 c2 就是 c1,这是必定的,有什么意义?
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 ,你未编译时可执行?????????????????????????????????????
同时编译之后连公用的数据连接都变成nothing了,我简直百思不得其解。
我本是想利用自己的集合来返回数据的。
所有对 c2 的访问都能直接用 c1 访问!
按你的逻辑应该怎么修改呢?
在调试的时候,如果能查询到值时,是可以返回整个集合的,count>0,
如果sql语句查询不到值时,count=0
'按输入的参数查询,并返回一个集合类
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
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方法,做了许多不该由他来完成的事
估计你的工程没有设置二进制兼容方式编译,根本无法创建对象。
编译后就是了
竟然连X2都是NOTHING啊。那就是你的DLL链接有问题了。我对DLL不熟,帮不了你,深表同情……