ランダムファイルの簡単な使用例
                                                         玄関へお回り下さい。
ランダムファイルの簡単な使用例   (241)
  
   下記のように各コントロールを配置しておいて下さい。

 


Option Explicit  
'SampleNo=241 WindowsXP VB6.0(SP5) 2003.01.28

'住所録データの構造体
Private Type Addressdat
  'この場合の 14 はVB上では14文字分で保存時は
  'LenB(StrConv(Text2.Text, vbFromUnicode)) で 14バイト分です。
  'VB上では全角文字で14文字ですが保存は7文字までしか保存出来ません。
  FullName As String * 14     '氏名      Text2
  TelNo  As String * 12     '電話番号   Text3
  PostNo  As String * 8     '郵便番号   Text4
  Address As String * 40     '住所      Text5
End Type

'使用変数の宣言
Private Add     As Addressdat 'Addressdat をAddに代入
Private lngRCNo   As Long    '指定のレコードNo
Private lngRCMax   As Long    '登録件数のMAX
Private intAddFileNo As Integer   '使用可能なファイルNo


Private Sub sDataOpen()
'データのOpen処理
  intAddFileNo = FreeFile   '使用可能なファイルNoを取得
  'カレントディレクトリからデータファイル
  'Address.DAT をオープンします
  Open App.Path & "\Address.dat" For Random As #intAddFileNo Len = Len(Add)
  '登録件数のMaxを取得します
  lngRCMax = LOF(intAddFileNo) \ Len(Add)
End Sub


Private Sub sAddressShow()
'データの表示
  Call sDataOpen   'ファイルをオープン
  '指定レコードのデータを表示
  'レコードNOのエラー防止
  If lngRCNo = 0 Then lngRCNo = 1
  '指定のレコードを開く
  Get #intAddFileNo, lngRCNo, Add
  With Add
    Text2.Text = .FullName   '氏名      Text2
    Text3.Text = .TelNo     '電話番号   Text3
    Text4.Text = .PostNo    '郵便番号   Text4
    Text5.Text = .Address    '住所      Text5
  End With
  '一旦ファイルを閉じる(すぐ開く必要がなければ)
  Close #intAddFileNo
End Sub


Private Sub sWrite()
'データの書込み処理
  Call sDataOpen
  Get #intAddFileNo, lngRCNo, Add
    '指定のレコードのデータを構造体の代入
  With Add
    '保存される時は LenB(StrConv(Text2.Text, vbFromUnicode)) で 14バイト
    '分しか保存できません。VB上で表示する場合は14文字です。
    .FullName = Text2.Text   '氏名      Text2
    .TelNo = Text3.Text     '電話番号   Text3
    .PostNo = Text4.Text    '郵便番号    Text4
    .Address = Text5.Text    '住所       Text5
  End With
  'ファイルに書込み保存
  Put #intAddFileNo, lngRCNo, Add
  '登録件数のMaxを再取得します
  lngRCMax = LOF(intAddFileNo) \ Len(Add)
  Close #intAddFileNo
  Call sAddressShow       '結果を再表示
End Sub


'起動時の処理
Private Sub Form_Load()
  lngRCNo = 1
  sAddressShow
End Sub


Private Sub Text1_LostFocus()
'指定のレコードNoを取得
  On Error Resume Next
  lngRCNo = CLng(Text1.Text)
  If Err.Number Then
    Beep
    Err.Clear
    Text1.SetFocus
    Exit Sub
  End If
  If lngRCNo > lngRCMax Then
    Beep
    Text1.SetFocus
    Exit Sub
  End If
  sAddressShow
End Sub


Private Sub Command2_Click()
'新規作成
  lngRCNo = lngRCMax + 1
  Text1.Text = lngRCNo
  sAddressShow
End Sub


Private Sub Command1_Click()
'書込み処理へ
  Call sWrite
End Sub
 
ランダムファイルを扱う上で一番問題になるのは、VBとシステムでファイル(文字)の扱いが違うと
いう点です。VBでは半角英数でも2バイトですが、システムでは1バイトになります。従って、半角と
全角が混在するようなフィルドは要注意です。
たとえば "あいうABC" はシステム上では9バイトでVB上では12バイト必要です。

Private Type Addressdat
  FullName As String * 12   

このように保存時は9バイトで保存できますが、表示する場合12バイト必要なので12バイトで宣言
すると、読込んだ時は3バイト分空白が付加されて取得する事になります。
その時に空白にvbNullChar が入ったりします。これがやっかいで、下手に文字列を連結する
と繋がらなくなったりします。

  With Add
    MyAddress=.FullName & .TelNo & .PostNo & .Address
  End With

この場合 MyAddress には ふりがなのデータの後ろに・・・・ がついてそれ以降のデータが表
示されません。(テキストボックスに一度入力すると取り除かれるようです)
又、下記のようにして取り除いておけば問題ありません。

Private Function fNullCut(ByRef myString As String) As String
  Dim i As Long
  i = InStr(myString, vbNullChar)
  If i > 0& Then
    fNullCut = Left$(myString, i - 1&)
  Else
    fNullCut = myString
  End If
End Function

このように保存時と表示時では同じ文字列でもバイト数の扱いが違うという事を理解して取り扱えば
ランダムファイルでの多くの問題点は解決できるかと思います。
以前、ランダムファイルを使った住所録の作成をプログラミング教室として掲載していたのですが
今は、掲載していないし、Web上でもあまり見かけないので参考になればと思い読み書き部分だけ
を掲載して見ました。
余分な部分やエラーチェックは省いております。以前プログラミング教室で使用していたサンプル
は、別途 駄作ソフト・サンプル集の方にUPしておりますので、興味があればDLして見て下さい。
但し、一部バグ・タイプミス等が未修正のままですが!





2003/02/04