tagCANDY CGI VBレスキュー(花ちゃん) - ユーザ定義型の比較(VB6.0) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
ユーザ定義型の比較(VB6.0)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

ユーザ定義型の比較(VB6.0) [No.28の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2009/12/27 15:28
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                             *
* キーワード:構造体,型変換,ユーザ定義型,,,                                    *
***********************************************************************************

--------------------------------------------------------------------------------
No.4132 RE:ユーザ定義型の比較   投稿者:NAO★ [2002/03/20(水)16:28分]
--------------------------------------------------------------------------------

すみません。再修正です。
IntegerやLongが使えると分かったので
比較用のユーザー定義型を固定長文字列からByte配列に変更しました。

Option Explicit

Private Type Testdat
    aaa1 As Integer
    aaa2 As Date
    aaa3 As String * 20
    aaa4(5) As String * 5 '配列でも大丈夫
    aaa5(5) As Byte
    aaa6 As Boolean
    aaa7 As Long
    aaa8 As Single
   'Err1 as String ←可変長なのでエラー
   'Err2 as Variant ←バリアント型はエラー
   'Err3 as Object ←オブジェクト型はエラー
End Type

'比較用ユーザー定義型
Private Type CompWk
    data(256) As Byte  '大きめに確保しておく
End Type

Private hoge(3) As Testdat

Private Function StructComp(a1 As Testdat, a2 As Testdat) As Boolean
Dim Struct1 As CompWk
Dim Struct2 As CompWk
Dim i As Long
    'ユーザー定義型(Testdat型)を別のユーザー定義型(CompWk型)にコピーする
    LSet Struct1 = a1
    LSet Struct2 = a2
    
    'バイト毎に比較
    For i = 0 To Len(Struct1) - 1
        If Struct1.data(i) <> Struct2.data(i) Then
            '不一致
            StructComp = False
            Exit Function
        End If
    Next
    '一致
    StructComp = True
End Function

Private Sub Command1_Click()
Dim i As Integer
    For i = 1 To 2
        If StructComp(hoge(0), hoge(i)) = True Then
            Debug.Print "テスト" & i & ":hoge(0) = hoge(" & CStr(i) & ")"
        Else
            Debug.Print "テスト" & i & ":hoge(0) <> hoge(" & CStr(i) & ")"
        End If
    Next
End Sub

Private Sub Form_Load()
Dim i As Integer
    hoge(0).aaa1 = 123
    hoge(0).aaa2 = CDate("2001/03/20")
    hoge(0).aaa3 = "TEST"
    hoge(0).aaa8 = 123.45
    hoge(1) = hoge(0)
    hoge(2) = hoge(0)
    hoge(2).aaa8 = 234.56
End Sub
メンテ

Page: 1 |

ユーザ定義型の比較(VB6.0)_1  (No.1の個別表示) [スレッド一覧へ]
日時: 2011/04/05 11:20
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                             *
* キーワード:構造体,型変換,ユーザ定義型,,,                                    *
***********************************************************************************

----------------------------------------------------------------------------
No.4135 Re:ユーザ定義型の比較  投稿者:ゆう(U) [2002/03/20(水)18:23分]
----------------------------------------------------------------------------

「LSet ステートメント」ヘルプより
あるユーザー定義型から別のユーザー定義型に変数をコピーすると、
その領域の要素に対して指定されているデータ型に関係なく、一方の
変数のバイナリ データだけが他方のメモリ領域にコピーされます。

大きめに確保したユーザ定義型の残りの部分にゴミが入る
可能性はありませんか?
※同サイズにした方が良いと思います

改良コード)
Private Function StructComp2(a1 As Testdat, a2 As Testdat) As Boolean
Dim Struct1 As CompWk
Dim Struct2 As CompWk
Dim strTemp1 As String
Dim strTemp2 As String
Dim i As Long

  'ユーザー定義型(Testdat型)を別のユーザー定義型(CompWk型)にコピーする
  LSet Struct1 = a1
  LSet Struct2 = a2

  '有効部分を文字列型へ転記する
  'サイズが同じならLeftB、LenBは不要になります
  strTemp1 = LeftB$(Struct1.data, LenB(a1))
  strTemp2 = LeftB$(Struct2.data, LenB(a2))

  '比較
  If StrComp(strTemp1, strTemp2, vbBinaryCompare) = 0 Then
  '一致
    StructComp2 = True
  Else
  '不一致
    StructComp2 = False
  End If
End Function


可変長文字列の事もあるので、私は比較用のプロシージャを
作成してしまう事をお薦めします。

サンプル)
Private Type myType
  Item1 As Long
  Item2 As String
  Item3 As String * 5
End Type
Prvate Function myTypeComp(ByRef Type1 as myType, _
                           ByRef Type2 As myType) As Boolean
  myTypeComp = False
  If Type1.Item1 <> Type2.Item1 Then Exit Function
  If StrComp(Type1.Item2, Type2.Item2, vbBinaryCompare) <> 0 Then Exit Function
  If StrComp(Type1.Item3, Type2.Item3, vbBinaryCompare) <> 0 Then Exit Function
  myTypeComp = True
End Function

メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ