0

私はすべてを試しましたが、すべてが型の不一致を引き起こします:

Type UserType
...
End Type

Dim SomeArray() As UserType
...
If SomeArray() Is Nothing Then <do smth>
If SomeArray() Is Empty Then <do smth>
If SomeArray Is Nothing Then <do smth>
If SomeArray Is Empty Then <do smth>

ユーザー定義型の配列に要素がない場合を知りたいです! VB6 の可能性を使用できる場合、追加の変数を使用したくないためです。

使います

Erase SomeArray

そのサイズ = 1 ( UBound(SomeArray) = 1) で、最後の要素を削除したい場合。

私が間違っていることは何ですか?XD

4

2 に答える 2

2

VB6 の「Is Nothing」は、VB6 配列ではなく、オブジェクトに適用されます。

「Ubound(myarray)」または「Ubound - LBound」は、VB6 で配列の現在の長さを決定する方法です。

参考までに、VB6コレクションを使用する方がはるかに優れている場合があります。

于 2016-02-04T19:04:07.450 に答える
0

ええと、VBForums「VB6 - Returning/Detecting Empty Arrays」からこの問題を解決する方法を見つけました。B)

(L/UBound は空の配列では機能しません。範囲外の添字を返します。;))

そう...

Private Declare Function ArrPtr Lib "msvbvm60" Alias "VarPtr" (Ptr() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)

Public Function Peek(ByVal lPtr As Long) As Long
    Call CopyMemory(Peek, ByVal lPtr, 4)
End Function

このサブルーチンを定義する前に、独自の変数を宣言することを忘れないでください! または、いくつかの奇妙な間違いが発生します (VB は突然、私の Exit Sub ステートメントを Exit Function に置き換えました!)。

それから私は使用しました

    If Peek(ArrPtr(SomeArray)) = 0 Then
        MsgBox "Looks like empty array SomeArray() before ReDim ^_^"
    End If

    Erase SomeArray

    If Peek(ArrPtr(SomeArray)) = 0 Then
        MsgBox "Looks like empty array SomeArray() after Erase ^_^"
    End If

そしてすべてがうまくいきます!

それほど単純ではありませんが、問題ありません。

皆さん、Thx コレクションという名前のこの連鎖リストを学習します。

特に VBForums に感謝します。彼らは本当にオタクです。

于 2016-02-04T20:05:54.637 に答える