パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
ランダムファイルを使った実例集 (準備中)
--------------------------------------------------------------------------------
Visual Basicでランダムファイルを使ったアプリを作ってみます。
VBにおけるランダムファイルの操作については固定長文字列とランダムファイルをご参照下さい。
旧BASICにおけるランダムファイルの扱いについては、N88互換BASIC For Win95の
場合についてファイルの操作(ランダムファイル)にて書いています。
--------------------------------------------------------------------------------
本の書籍名、著者、出版社、本の種類などを管理できるようなランダムファイルを作ってみることにします・
ここまでやると、RDBで作ったほうが管理が楽そうですが。とりあえず検索機能もないシンプルなものです。
このプログラムでは、標準モジュール(Module1)、Form1, Form2の3つのモジュール、Formを持っています。
標準モジュールでは、書籍の構造体の宣言をしています。
Form2は一覧表示の表示用なので特別な設定やコードは何もありません。
Form1に以下のようなコントロールを配置しました。
メニューは、開く(open)とクローズ(close)のみ
コマンドボタンを3つ。オープンしたファイルから@データを読み込む、Aデータを書き込む、Bデータの一覧表示
前のデータに行ったり、後ろのデータに行ったりするためのスクロールバー
ラベルを7個とTextBoxを6個
Text1はレコード番号を表示します。このText1に表示されたレコード番号のデータを読み込んだり、書き込んだり
します。
レコード番号はスクロールバーの操作で変化しますが、ユーザが自分で直接書き換えることも可能です。
本の種類選択のためのListBox
あとはファイルのオープンのための機能を使うためコモンダイアログ
Form1上のコントロールはほとんど配置しただけで、プロパティはデフォルト設定す。
TextBoxのText5だけ、プロパティを MultiLine True ScrollBar 2 (垂直) にしています。
Text5のプロパティは以下の通りです。
Begin VB.TextBox Text5 Height = 975 Left = 1200 MaxLength = 100 MultiLine = -1 'True ScrollBars = 2 '垂直 TabIndex = 9 Top = 2760 Width = 4695 End
メニューは以下の通りです。
Begin VB.Menu file Caption = "ファイル" Begin VB.Menu open Caption = "開く" End Begin VB.Menu close Caption = "クローズ" End End
Booklistという書籍に関する構造体(レコード)を宣言しています。
VBでは構造体の宣言にTypeを使います。
構造体(レコード)のメンバーとして、書籍名(name)、著作者(author)、publisher(出版社)
備考(remark)、本の種類(type)があります。
あとは、いくつかの変数をPublicで宣言しました。標準モジュールでPublicで宣言した変数は
プログラムのどこででも使える大域変数(グローバル変数)になります。
Type BookList name As String * 30 author As String * 20 publisher As String * 20 remark As String * 100 type As String * 20 End Type Public bl As BookList Public rec As Integer Public fname As String
メニューの開く(open)とクローズ(close)は以下の通りです。
ファイルのオープンはCommonDialogコントロールを使っています。
CommonDialog1.ShowOpen でファイルを開くためのダイアログが開きます。
このダイアログで選択されたファイル名は、CommonDialog.filename で取得できます。
取得したファイル名はfnameという変数に保存します。
Open fname For Random As #1 Len = Len(bl)
でランダムファイルとしてopenします。
ランダムファイルのopenは固定長文字列とランダムファイルをご参照下さい。
HScroll1.Min とHScroll1.Max はスクロールバーの最小値と最大値を設定します。
ランダムファイルの場合、LOF()でランダムファイルのファイルサイズが取得できます。
Len()では1レコードのサイズを取得できるので、
LOF(1) \ Len(bl) という割り算でレコード数を算出することができます。
このファイルに存在するレコード数をHScroll1.Max に設定します。
クローズ(close)のほうはファイルをCloseしているだけです。
Private Sub open_Click() CommonDialog1.ShowOpen fname = CommonDialog1.filename Open fname For Random As #1 Len = Len(bl) HScroll1.Min = 1 HScroll1.Max = LOF(1) \ Len(bl) End Sub Private Sub close_Click() Close #1 End Sub
レコードの読み込み(Command1)、レコードの書き込み(Command2)のコードです。
@レコードの読み込み(Command1)
レコードの読み込みはGetを使います。
Get #1, rec, bl
でrecで指定されたレコード番号のデータを、構造体変数blに読み込みます。
その後、読み込んだレコードの書籍名、著者名などの情報をText2〜Text6に代入します。
エラー処理
If fname = "" Then
r = MsgBox("ファイルが開かれていません", 0, "エラー")
Exit Sub
End If
の個所は、ファイルが開かれていない場合の処理です。
もうひとつ、ファイルがクローズされてからレコードの読み込みを行うと、これもエラーが発生するので
そのエラー処理をしています。
On Error GoTo ErrHandler
......
ErrHandler: If Err = 52 Then
r = MsgBox("ファイルがクローズされています", 0, "エラー")
End If
このエラーが発生した場合は、そのままEnd Sub へ移行し、Subプロシージャが終了します。
正常にレコードの読み込みが行われた場合は、 ErrHandler: というラベルの前にある Exit
Sub で
Subプロシージャを抜けます。
Aレコード書き込み
レコードの書き込みにはPutを使います。
Text2〜Text6の各データを構造体変数blに保存し
Put #1, rec, bl
でrecで指定されたレコード番号に書き込みます。
エラー処理は読み込みとほぼ同じです。
Put, Getの使い方については、固定長文字列とランダムファイルをご参照下さい。
Private Sub Command1_Click() On Error GoTo ErrHandler If fname = "" Then r = MsgBox("ファイルが開かれていません", 0, "エラー") Exit Sub End If rec = Val(Text1.Text) Get #1, rec, bl Text2.Text = bl.name Text3.Text = bl.author Text4.Text = bl.publisher Text5.Text = bl.remark text6.Text = bl.type Exit Sub ErrHandler: If Err = 52 Then r = MsgBox("ファイルがクローズされています", 0, "エラー") End If End Sub Private Sub Command2_Click() On Error GoTo ErrHandler If fname = "" Then r = MsgBox("ファイルが開かれていません", 0, "エラー") Exit Sub End If rec = Val(Text1.Text) bl.name = Text2.Text bl.author = Text3.Text bl.publisher = Text4.Text bl.remark = Text5.Text bl.type = text6.Text Put #1, rec, bl Exit Sub ErrHandler: If Err = 52 Then r = MsgBox("ファイルがクローズされています", 0, "エラー") End If End Sub
(1) ListBox
ListBox(List1)で本の種類を選択すると、本の種類(Text6)に反映するようにしてあります。
FormのLoad時に、List.AddItemでListBoxにアイテムを追加しています。
ListBoxのアイテムをクリックした時の処理は、List1_Click()というイベントプロシージャに
記述します。
List1.TextにListBoxで選択されたアイテムが格納されますので
Text6.Text = List1.Text
でText6に反映させます。
Private Sub Form_Load() List1.AddItem "PC" List1.AddItem "車" List1.AddItem "その他" rec = 1 End Sub Private Sub List1_Click() Text6.Text = List1.Text End Sub
(2) スクロールバー
スクロールバーを左右に変化させると、その変化した値がHscroll1.Valueに格納されます。
この値をHScroll1_Change()のイベントプロシージャでText1に反映させます。
Private Sub HScroll1_Change() Text1.Text = Str(HScroll1.Value) End Sub
全レコードデータを一覧表示します。書籍名っと本の種類のみ表示します。
一覧表示用にFORM2を用意しています。
Form2のプロパティは、マルチライン、縦横両方のスクロールバー付きとするため
以下のようにしています。
MultiLine = -1 'True
ScrollBars = 3 '両方
実行例
レコード番号1からMax番号(recmax)までForループの中で順番にレコードをGetで読み込んで
Form2に表示します。
For i=1 To recmax
Get #1, i, bl
....
....
Next
途中、データが入力されていないレコードはスキップするために
n$ = Trim$(bl.name)
If LenB(n$) > 0 Then.
.....
として書籍名が0文字のレコードはスキップしています。
Trim$()は文字列から空白を取り除く関数です。
ランダムファイルの各文字列データは固定長文字列型を使っているため、空白を含んでいるので
Trim$()で空白を取り除いてから、LenB()で文字列の長さ(バイト数)をチェックしています。
エラー処理は、読み取り、書き込みの部分と同じです。
Private Sub Command3_Click() On Error GoTo ErrHandler If fname = "" Then r = MsgBox("ファイルが開かれていません", 0, "エラー") Exit Sub End If recmax = HScroll1.Max nl$ = Chr$(13) + Chr$(10) Form2.Show Form2.Text1.Text = "" For i = 1 To recmax Get #1, i, bl n$ = Trim$(bl.name) If LenB(n$) > 0 Then Form2.Text1.Text = Form2.Text1.Text + Trim$(bl.name) + " : " + Trim$(bl.type) + nl$ End If Next Exit Sub ErrHandler: If Err = 52 Then r = MsgBox("ファイルがクローズされています", 0, "エラー") End If End Sub
念のため、プログラムが終了するときにファイルをcloseするようにしています。
Private Sub Form_Terminate()
Close
End Sub
コモンダイアログ(CommonDialog)はコントロールを配置しただけです。
コモンダイアログの機能はメニューの「開く」、つまり Private Sub open_Click() の
イベントプロシージャにある
CommonDialog1.ShowOpen
fname = CommonDialog1.filename
で使っています。
(->「3.メニュー」参照)