我的函数用于替换任何对象属性中的撇号,即'。该函数使用TypeLib库来实现这一点,方法是遍历所有对象的成员,即
Public Function EscapeWildCards(ByRef obj As Object, _
Optional ByVal bEscape As Boolean = True) As Boolean
On Error GoTo EscapeWildCards_Err
Dim tTLI As TLIApplication
Dim tMem As MemberInfo
Dim tInvoke As InvokeKinds
Dim tName As String 'used as lower case....
Dim tString As String
1 Set tTLI = New TLIApplication
'... if True, we are setting else we are getting
2 tInvoke = IIf(bEscape, VbGet, VbLet)
3 If obj Is Nothing Then Exit Function
4 For Each tMem In TLI.InterfaceInfoFromObject(obj).Members
5 'tName = LCase$(tMem.Name)
6 If tMem.InvokeKind = tInvoke Then 'And tMem.Parameters.Count = 0
'could be object/something else that can't handle
On Error Resume Next
' get the oobject property value
7 tString = CallByName(obj, tMem.Name, VbGet)
8 If tInvoke = VbGet Then
9 If IndexOf(tString, "'") > 0 Then
10 tString = Replace$(tString, "'", "`")
11 CallByName obj, tMem.Name, VbLet, tString
End If
Else
'... set data replacing aposthrophe
12 If IndexOf(tString, "'") > 0 Then
13 tString = Replace$(tString, "`", "'")
14 CallByName obj, tMem.Name, VbLet, tString
End If
End If
'Debug.Print tName, " = ", tString
On Error GoTo EscapeWildCards_Err
End If
Next
Exit Function
EscapeWildCards_Err:
ErrReport Err.Description, "modCommon.EscapeWildCards", Erl
Resume Next
End Function
当我在IDE中测试代码时,我没有收到任何错误。但是当我编译并测试为EXE时,我得到以下错误:
Object doesn't support this action. LineNo 4
Object variable or With block variable not set. LineNo 5
Object variable or With block variable not set. LineNo 6
For loop not initialized. LineNo 14
为什么我的应用程序在IDE中运行时没有出现任何错误,但是在编译时我会这样做?有人可以指点我做错了吗?
答案 0 :(得分:2)
首先,您没有通过错误处理来帮助自己。做一个简历接下来没有做某种形式的检查实际错误是一个混乱和bug城市的一站式方法。你的标题是误导性的 - 这不是造成问题的“For Each”声明。它是:
TLI.InterfaceInfoFromObject(obj).Members
确切地说,会员财产失败了。 (哦,你显然没有做过直接复制和粘贴,因为我认为“TLI”应该是“tTLI”。)。原因可能是您尝试使用的对象没有在类型库中注册的公共接口。
我的猜测是你正在尝试使用内部VB类,例如Form或私有类。在运行时,VB IDE动态创建运行时类型库信息(您认为如何在运行时使用未编译的DLL项目?)。在IDE中,VB会为您的类创建类型的lib信息。但是在编译时,这些信息不存在,因而就是错误。
如果是这种情况,则必须通过创建暴露您要使用的接口的DLL来手动为您的私有类创建接口。然后,该接口将实现到私有类中。遗憾的是,你无法使用Form实例。