'====================================================
'VB6 ランダムアクセスファイル を使ったキュークラス
'====================================================
'VisualStudio 6.0 サービスパック6がインストールされてないと
'VBのバグにより実行できない可能性があります。
'開発環境でクラスモジュールに Queue という名前で保存します
'
'値を追加
'Private Sub Command1_Click()
'    Dim obj As New Queue
'    obj.init ("C:\test.txt") 'ファイル名を指定(無ければ新規作成)
'    obj.push ("testData") '終端に値を追加
'    Set obj = Nothing
'End Sub
'
'値の取り出し
'Private Sub Command3_Click()
'    Dim obj As New Queue
'    obj.init ("C:\test.txt") 'ファイル名を指定(無ければ新規作成)
'    If obj.getEmpty Then '値が存在したら
'        MsgBox (obj.front) '先頭の値を取得
'        obj.pop '先頭の値を削除
'    End If
'    Set obj = Nothing
'End Sub
'
'----------------------------------------------
Option Explicit

'値を読み書きする構造体
Private Type ByteData
    byteArr(0 To 1023) As Byte
End Type

Private data As ByteData
Private filenum As Integer
Private filename As String

'**********************************************
'クラスの初期化
'**********************************************
Public Sub init(FilePath As String)
    filename = FilePath
End Sub

'**********************************************
'値がたまっているかどうかの確認
'**********************************************
Public Function getEmpty() As Boolean
    Call connect
    If MaxNo = 0 Then getEmpty = False Else getEmpty = True
    Call unconnect
End Function

'**********************************************
'終端に値を追加
'**********************************************
Public Sub push(data As String)
    Call connect

    Dim i As Long
    i = MaxNo + 1
    
    Put #filenum, i, toByteData(data)

    Call unconnect
End Sub

'**********************************************
'先頭の値を取り出し
'**********************************************
Public Function front() As String
    Call connect
    '先頭の値を返す
    Get #filenum, 1, data
    
    front = toString(data)
    Call unconnect
End Function

'**********************************************
'先頭の値を削除
'**********************************************
Public Sub pop()
    Call connect
    '値を前に詰める
    Dim i As Long
    For i = 1 To MaxNo - 1
        Get #filenum, i + 1, data
        Put #filenum, i, data
    Next i

    Put #filenum, i, toByteData("")
    Call unconnect
End Sub

'**********************************************
'終端の値を取り出し
'**********************************************
Public Function back() As String
    Call connect
    '先頭の値を返す
    Get #filenum, MaxNo, data
    back = toString(data)
    Call unconnect
End Function

'----------------------------------------------
'接続
'----------------------------------------------
Private Sub connect()
    filenum = FreeFile
    Open filename For Random As #filenum Len = Len(data)
End Sub

'----------------------------------------------
'切断
'----------------------------------------------
Private Sub unconnect()
    Close #filenum
End Sub

'----------------------------------------------
'現在の値の数を返します
'----------------------------------------------
Private Function MaxNo() As Long
    MaxNo = 0
    Dim count As Long
    count = LOF(filenum) / Len(data) '現在のレコ−ド数を計算

    Dim i As Long
    For i = 1 To count
        Get #filenum, i, data
        If Not (toString(data) = "") Then
            MaxNo = i
        Else
            Exit Function
        End If
    Next i
End Function

'----------------------------------------------
'文字列を構造体に変換
'----------------------------------------------
Private Function toByteData(str As String) As ByteData
    Dim bytes() As Byte
    'Shift_jisに変換
    bytes = StrConv(str, vbFromUnicode)
    
    Dim i As Long
    '構造体をスペースで初期化
    For i = 0 To UBound(data.byteArr)
        data.byteArr(i) = AscB(Space(1))
    Next i
    '構造体にバイト配列を複製
    For i = 0 To UBound(bytes)
        data.byteArr(i) = bytes(i)
    Next i
    
    toByteData = data
End Function

'----------------------------------------------
'構造体を文字列に変換
'----------------------------------------------
Private Function toString(ByteDataPos As ByteData) As String
    '構造体から、文字列に変換
    toString = Trim(StrConv(ByteDataPos.byteArr, vbUnicode))
End Function



▲トップページ > Visual BASIC と C#