4.ランダムファイルの簡単なサンプル |
1.ランダムファイルの簡単なサンプル 2. 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6) Option :[Option Explicit] 参照設定:追加なし 使用 API:なし その他 : : |
1.ランダムファイルの簡単なサンプル |
下記のように各コントロールを配置しておいて下さい。 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. |
検索キーワード及びサンプルコードの別名(機能名) |