ユーザ定義型から動的配列を含むユーザ定義型へ格納するには?

解決


ねぐ  2007-12-05 07:46:26  No: 99878

VB6についてお聞きしたいのですが、
ユーザ定義型からユーザ定義型へのデータの格納で
LSetを用いたいのですが、このユーザ定義型に動的配列
が含まれている場合は「型が一致しません」とエラーがでてしまいます。

色々と参考にさせて頂いて、ユーザ定義同士でも
CopyMemoryを用いれば動的配列があっても格納できると発見し
試してみましたが、格納内容がLSetのものと多少異なります。

理想はLSetと同じ格納内容をしたいのですが、手法が間違えています
でしょうか?以下にソースを記載しますので、ご教授下さい。

ユーザ定義型はString型からByte型の動的配列に格納です。

***実行確認結果**********************************************

=CopyMemoryで格納した場合=
Uss1.by1(1) = 49  <"1">
        (2) = 49  <"1">
        (3) = 49  <"1">
        (4) = 32  <Space>
        (5) = 32  <Space>

=LSetで格納した場合(こちらが理想の格納内容です)=
Uss1.by1(1) = 49  <"1">
        (2) = 0   <NULL>
        (3) = 49  <"1">
        (4) = 0   <NULL>
        (5) = 49  <"1">
        (6) = 0   <NULL>
        (7) = 32  <Space>
        (8) = 0   <NULL>
        (9) = 32  <Space>
        (10)= 0   <NULL>

*************************************************************

***ソース****************************************************
'LSetで格納する場合、CopyMemoryで格納する場合を以下に記載します

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
  (destination As Any, source As Any, ByVal length As Long)

Private Type byteUser
'■■■LSetで格納する場合■■■
'    by1(1 To 500) As Byte
'    by2(1 To 500) As Byte

'■■■CopyMemoryで格納する場合■■■
    by1() As Byte
    by2() As Byte

End Type
Dim Uss1 As byteUser

Private Type strUser
    st1  As String * 100
End Type
Dim Stt1 As strUser

Private Sub Form_Load()

    Stt1.st1 = "111"
    
'■■■LSetで格納する場合■■■
'    LSet Uss1 = Stt1

'■■■CopyMemoryで格納する場合■■■
    ReDim Uss1.by1(1 To 500) As Byte
    ReDim Uss1.by2(1 To 500) As Byte
    Call CopyMemory(Uss1.by1(1), Stt1, LenB(Stt1.st1))

End Sub

*************************************************************


GOD  2007-12-05 08:38:55  No: 99879

sttの値を一旦別の配列に格納してみてはどうですか?

Private Sub Command1_Click()
    Dim strStt As String * 100
    Dim bytArray() As Byte

    strStt = "111"
    bytArray = strStt
End Sub


ねぐ  2007-12-06 07:40:03  No: 99880

GODさん、ご回答ありがとうございます。
できました!
なんか LSetにこだわり過ぎていたような気がします・・・。


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

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






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