VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

リンク元へ戻ります。 ファイル入出力関係のメニュー
1.テキストファイル読み書き色々
2.CSV ファイルの読み書き色々
3.固定長テキストファイルの読込
4.ランダムファイルの簡単なサンプル
5.FileSystemObject の TextStream オブジェクトを使っての読み書き色々
6.ADOを使ってCSVファイルをMSHFlexGridに表示する
7.テキストファイル同士の結合
8.テキストファイルの最後の数行を取得する
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.その他、当サイト内に掲載のファイル入出力に関するサンプル


4.ランダムファイルの簡単なサンプル
1.ランダムファイルの簡単なサンプル
2.
3.
4. 
5. 
6. 

 下記プログラムコードに関する補足・注意事項 
動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6)
Option :[Option Explicit]
参照設定:追加なし
使用 API:
なし
その他 :
    :
このページのトップへ移動します。 1.ランダムファイルの簡単なサンプル

 下記のように各コントロールを配置しておいて下さい。

  Random1.gif


Option Explicit  
'SampleNo=241  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 上でもあまり見かけないので参考になればと思い読み書き部分だけを掲載して見ました。

このページのトップへ移動します。 2.


このページのトップへ移動します。 3.


このページのトップへ移動します。 4.


このページのトップへ移動します。 5.


このページのトップへ移動します。 6.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)





このページのトップへ移動します。