如何使用 UBound < LBoond 制作 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。

那么,如何创建一个具有LBound0和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数组。我不能很好地将字符串从一个数组单独复制到另一个数组中的Variants,因为0到-1等等。

有人知道如何在不使用SCRRUN的情况下,用LBound 0和UBound-1生成这样一个数组Variant()吗。DLL?最好也只使用内置的VB6东西,但如果你能做到,如果你被允许使用一些外部的东西(除了SCRRUN.DLL),我会洗耳恭听。谢谢

您可以使用Array函数:

Dim K()
K = Array()
MsgBox UBound(K)

好的,回答我自己的问题(但使用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)

相关内容

  • 没有找到相关文章

最新更新