動的配列の開放チェック

解決


シスコムーン  2003-04-05 03:18:40  No: 77579

動的な構造体の配列がEraseされているかどうか知る方法を教えてください。
If IsErase(udtArray) Then
みたいなのってありますでしょうか?
IsEmpty、Is Nothing等やってみたのですがエラーになります。
なんか基本中の基本っぽいのに知らないって言うのが恥ずかしいです><
皆様はどのようにやっていますか?


魔界の仮面弁士  2003-04-05 06:50:11  No: 77580

残念ながら、エラートラップで処理するしか無いのです。

一応、APIを使えば判定できますが、そこまでする必要があるかどうか…。

Option Explicit

Private Declare Function SafeArrayGetDim Lib "oleaut32" _
   (ByVal psa As Long) As Long

Private Declare Function VarPtrArray Lib "msvbvm60" _
   Alias "VarPtr" (ByRef var() As Any) As Long

Private Type MyType
    aaa As Long
    bbb As Integer
    ccc As Boolean
End Type

Private Sub Form_Load()
    Dim udtArray() As MyType

    'ReDim前   
    MsgBox IsEraseMyType(udtArray)

    'ReDim後
    ReDim udtArray(3)
    MsgBox IsEraseMyType(udtArray)

    'Erase後
    Erase udtArray
    MsgBox IsEraseMyType(udtArray)
End Sub

Private Function IsEraseMyType(ByRef MyTypeArray() As MyType) As Boolean
    IsEraseMyType = CBool(SafeArrayGetDim(VarPtrArray(MyTypeArray)) = 0)
End Function


シスコムーン  2003-04-07 18:02:52  No: 77581

なるほど。
確かにAPI使うまでもないかもしれません。
しかし参考になりました。長年の疑問が解決しました。
有難うございました。


魔界の仮面弁士  2003-04-07 18:17:08  No: 77582

良く考えたら、VarPtrArrayを使う必要は無かったかも。

Private Declare Function SafeArrayGetDim Lib "oleaut32" _
   (ByRef psa() As Any) As Long

と宣言して、
    If SafeArrayGetDim(udtArray) = 0 Then
         Debug.Print "ReDimされていない"
    End If
という感じで十分かな。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加