金宏 和實(かねひろ かずみ)

 富山県高岡市 株式会社イーザー副社長。血圧が高めなので,夜に近所の公園を歩くようにしています。以前は人が一生懸命に歩いているのを見て,「しんどそうだな」と思っていたのですが,ある程度続けると,歩くとスッキリするようになりました。梅雨時は歩けない日が多いので,困ります。

 前回から,ライントレース競技会に参加するチームの情報と競技結果を記録するアプリケーションの作成を始めました。

 RaceTeamというクラスを作り,クラスを設計図としてオブジェクトを複数生成し,List(Of T)クラス(Listジェネリック・クラス)に登録しました(図1)。Visual Basic(VB)2005以前は,ArrayListにオブジェクトをコレクションしていくことが多かったのですが,VB 2005からは,Listジェネリック・クラスを利用します。

図1●RaceTeamクラス
図1●RaceTeamクラス

 その理由の一つはArrayListだと,ArrayListの中に間違って別のクラスのオブジェクトを混在させてしまうことがあったからです。同じ種類のオブジェクトだけが入っているものとたかをくくって順に処理をしていると,実行時に例外が発生してしまいます。

 Listジェネリック・クラスなら,List(Of T)とTに型を指定することができます。

Dim CompeData As New List(Of RaceTeam)

 この場合,CompeDataにRaceTeam型以外のオブジェクトを入れようとしたら,コンパイル・エラーとしてはじいてくれます。

 図2が今回,作成するアプリケーションのイメージです。Competitionクラスは,RaceTeamのListをプロパティとして持ち,登録/修正用のForm(フォーム)の要求に応えて,List上のRaceTeamオブジェクトをフォームとやり取りします。

図2●今回作成するアプリケーションのイメージ
図2●今回作成するアプリケーションのイメージ

バイナリファイルで永続化

 List上のオブジェクトを永続化するために,ハードディスクにバイナリファイルとして保存します。

 ファイルには,可視情報である文字だけのテキストファイルと,アプリケーション固有の情報を記録するバイナリファイルがあります。バイナリファイルには,制御コードを含むあらゆるデータを記録することができます。今回のアプリケーションでは,タイムは小数点以下まで扱えるようにDouble型にしたので,テキストファイルでは記録が困難です。

 データの永続化というと,データベースの利用が頭に浮かびますが,データ量が少なくて,セキュリティ上の問題がないときは,バイナリファイルはまだまだ便利な存在です。それにもまして,バイナリファイルに保存するときの考え方や感覚は,データベースを利用する前に身に付けておくと,データベースの学習時に役立ちます。

 バイナリファイルの中身を見るには,16進数でダンプ表示をするユーティリティ・プログラムが必要になります(図3)。フリーで利用できるものがありますので,興味のある方はダウンロードして使ってみてください。

図3●バイナリファイルの中身を見るには,16進数でダンプ表示するユーティリティが必要
図3●バイナリファイルの中身を見るには,16進数でダンプ表示するユーティリティが必要
[画像のクリックで拡大表示]

フォームの外観から

図4●フォームの外観
図4●フォームの外観

 まずは,フォームの外観の作成から進みましょう(図4)。図5は,フォーム上に配置したコントロールの一覧です。フォームの上部にはMenuStripを配置して,FileMenu(ファイル(F))とSortMenu(並べ替え(O))の下に各メニュー項目を作ります。

図5●フォーム上に配置したコントロールの一覧。メニューとGUIのそれぞれのコントロール
 
GUIコントロールの一覧
図5●フォーム上に配置したコントロールの一覧。メニューとGUIのそれぞれのコントロール
[画像のクリックで拡大表示]

 フォームの下部に配置したStatusStrip(ステータス・ストリップ)上には,コントロールを配置していません。ここには実行時にコードで追加します。

 入力項目はテキストボックスで作成しました。結果の表示は,編集する必要がないのでラベルを使います。1回目の出走順から,2回目の結果まではFlowLayoutPanel上に配置しました。FlowLayoutPanelはコントロールを左上から右下に向かって,流れるように配置します。

 [前へ][次へ]のボタン・クリック時の処理は,ファイル・メニューの「前のデータ(&P)」「次のデータ(&E)」の処理と同じです。

 このフォームに入力したデータを,RaceTeamオブジェクトとして生成しListに追加していくわけです。