パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

ランダムファイルを使った実例集 (準備中)

--------------------------------------------------------------------------------
Visual Basicでランダムファイルを使ったアプリを作ってみます。
VBにおけるランダムファイルの操作については固定長文字列とランダムファイルをご参照下さい。
旧BASICにおけるランダムファイルの扱いについては、N88互換BASIC For Win95の
場合についてファイルの操作(ランダムファイル)にて書いています。
--------------------------------------------------------------------------------

本の書籍名、著者、出版社、本の種類などを管理できるようなランダムファイルを作ってみることにします・
ここまでやると、RDBで作ったほうが管理が楽そうですが。とりあえず検索機能もないシンプルなものです。

1.GUI(画面)の設計

このプログラムでは、標準モジュール(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

2.標準モジュール

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

3.メニュー

メニューの開く(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




4.レコードの読み込み、書き込み

レコードの読み込み(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


5.ListBox(本の種類)とスクロールバー

(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

6.一覧表示

全レコードデータを一覧表示します。書籍名っと本の種類のみ表示します。
一覧表示用に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



7.その他

念のため、プログラムが終了するときにファイルをcloseするようにしています。

Private Sub Form_Terminate()
Close
End Sub


コモンダイアログ(CommonDialog)はコントロールを配置しただけです。
コモンダイアログの機能はメニューの「開く」、つまり Private Sub open_Click() の
イベントプロシージャにある
CommonDialog1.ShowOpen
fname = CommonDialog1.filename
で使っています。
(->「3.メニュー」参照)

Top page | Visual Basic&Excel活用研究目次