我正试图摆脱VB6应用程序中对SCRRUN.DLL的依赖。目前正在使用的一件事是它的Dictionary类。 Dictionary类有一个Keys函数,它应该返回字典中键的数组。我做了一些实验,看看如果字典中没有键会发生什么:
Dim D As Dictionary
Set D = New Dictionary
Dim K() As Variant
K = D.Keys
MsgBox LBound(K) & ", " & UBound(K)
我期待“下标超出范围”或类似的东西,但我被告知LBound为0而UBound为-1。
那么,我如何创建一个具有LBound 0和UBound -1的Variant数组?
我尝试过使用未初始化的变体数组:
Dim K() as Variant
MsgBox LBound(K) & ", " & UBound(K)
但是,正如我所料,当然会抛出“下标超出范围”。擦除未初始化的数组也是如此:
Dim K() as Variant
Erase K
MsgBox LBound(K) & ", " & UBound(K)
擦除初始化数组:
Dim K() As Variant
ReDim K(0 To 0)
Erase K
MsgBox LBound(K) & ", " & UBound(K)
我也尝试重新调整为0和-1,这似乎很奇怪:
Dim K() As Variant
ReDim K(0 To -1)
MsgBox LBound(K) & ", " & UBound(K)
但这也使“下标超出范围”。
在网上逛了一下,我找到了以下技巧:
Dim K() As String
K = Split(vbNullString)
MsgBox LBound(K) & ", " & UBound(K)
实际上这确实给出了LBound 0和UBound -1的数组!不幸的是,它是一个String数组,而我需要一个Variant数组。我不能很好地将Strings从一个数组复制到另一个数组中的Variants,因为,0到-1都是。
有没有人知道如何使用LBound 0和UBound -1制作这样的数组Variant(),而不使用SCRRUN.DLL?最好也只使用内置的VB6东西,但是如果你能够使用一些外部的东西(除了SCRRUN.DLL)你可以这样做,我都是耳朵。感谢。
答案 0 :(得分:5)
您可以使用Array
功能:
Dim K()
K = Array()
MsgBox UBound(K)
答案 1 :(得分:1)
好的,回答我自己的问题(但是使用OLEAUT32.DLL;我仍然对任何纯内置VB6的解决方案感兴趣):
Private Declare Function SafeArrayCreateVector Lib "OLEAUT32.DLL" ( _
ByVal vt As VbVarType, ByVal lLbound As Long, ByVal cElements As Long) _
As Variant()
Private Const VT_VARIANT As Long = 12
(...)
Dim K() As Variant
K = SafeArrayCreateVector(VT_VARIANT, 0, 0)
MsgBox LBound(K) & ", " & UBound(K)