Visual Basic 入門講座
VB2005 対応

 

Visual Basic 中学校 > 入門講座 >

第11回 卒業制作 (VB2005)

 

この記事はVB2005を対象としています。VB.NET2002, VB.NET2003をご使用の場合はこちらをご覧ください。

概要

・いろいろなファイルを見ることができるアプリケーションを作る

・ファイルの一覧を保存・読み込みできるようにする

 

1.目標

 

入門講座の技術的な解説は前回で終了です。今回は実際に使えるアプリケーションを作っていく過程を紹介します。手順は1ステップごとに書いていきますので、是非、実際にVBを動かしながらアプリケーション作りを体感してください。

これから作るアプリケーションのプログラムではいままで解説しなかった知識やキーワードが登場します。そのため、多くの人はよく理解しないまま手順どおりに作っていくだけの作業になるでしょう。

しかし、今回の私の意図は、「細かい部分がよくわからなくても、とにかく実際のアプリケーションを作る手順を体感する」というものです。ですから、よくわからなくても順を 追ってアプリケーションを完成させることができた人は今回の目標を達成できたということになります。

私が目指しているのは、新しい発見や、知らなかった操作方法、まだ知らないテクニックにふれることの刺激を感じ取っていただくことです。

このような作業の経験は必ず身になります。

 

2.完成品

 

これから作るアプリケーションは次のようなものです。

完成品が動作しているところ。私が街で目撃したどーもくんを激写した瞬間です。

■画像1:完成品が動作しているところ。私が街で目撃したどーもくんを激写した瞬間です。

主な機能

・画像・テキスト・Excel・Word・Html. pdfなどさまざまな種類のファイルを見ることができる。

・左側のファイル一覧をクリックすると、そのファイルが右側に表示される。

・ファイル一覧にファイルを追加するには、ファイルをドラッグ&ドロップする。

・ファイル一覧に登録されている内容を保存することができる。保存した内容はあとで呼び出すことができる。

※Excel, WordのファイルはExcel, Wordがインストールされている環境でのみ正常に表示できます。その他のファイルも環境により表示できる場合とできない場合があります。少なくとも txt や bmp, jpg, gif 等はほとんどの環境で表示できるものと思います。

 

3.作成

 

それでは、いよいよ実際にプログラムを始めていきます。完成までの大まかな手順は次のようになります。

1.土台を作る。

フォームにコントロールを配置する。この時点では見かけだけ完成する。実際の機能はほとんどない。

2.左側のファイル一覧の機能をプログラムする。

この段階では、ファイル一覧にファイルを追加できるようになる。

3.ファイルを表示できるようにする。

4.ファイル一覧の保存・呼び出し機能をつける。

5.細部と整える。

 

3−1.土台を作る。

 

3−1−1.新しいプロジェクトの作成。

新しいプロジェクトを作成してください。この手順は説明するまでもないでしょう。

今までどおり、Windows アプリケーションを選択してください。

プロジェクト名は「MultiFileViewer」にしてください。

→この手順がわからない場合はこちらをご覧下さい。

プロジェクトを作成したら一度保存しておくことをお勧めします。

 

3−1−2.フォームにコントロールを配置。

次の手順に従ってフォームにコントロールを配置して、プロパティを設定してください。

 

▼手順1

SplitContainerコントロールをフォームに配置します。このSplitContainerコントロールの名前はSplitContainer1となります。

ツールボックス上ではSplitContainerは「コンテナ」というグループのところにありますので見つからない場合は、「コンテナ」グループをヒントにするとよいでしょう。下の画像も参考にしてください。

ツールボックス上のSplitContainerコントロール

■画像2:ツールボックス上のSplitContainerコントロール

配置すると自動的にフォーム全体に広がって下の画像のような状態になります。

SplitContainerコントロールをフォームに配置したところ

■画像3:SplitContainerコントロールをフォームに配置したところ

 

▼手順2

次に、 上の画像でPanel1と書いてある部分にSplitContainerコントロールをもう1つ配置します。このSplitContainerコントロールの名前はSplitContainer2となります。配置すると自動的にPanel1全体に広がります。

2つ目のSplitContainerコントロールの分割方向を変更する

■画像4:2つ目のSplitContainerコントロールの分割方向を変更する

ここで上の画像で赤くしるしをつけてある小さな左向きの三角ボタンクリックしてSplitContainerのタスク一覧を開き、[上下分割の方向]をクリックして下さい。

三角ボタンはSplitContainer2が選択されているときに表示されます。SplitContainer2を選択するにはPanel1Panel2の境目にある線の部分をクリックしてください。

[上下分割の方向]をクリックするとフォームは次のような状態になります。

2つ目のSplitContainerコントロールの配置完了

■画像5:2つ目のSplitContainerコントロールの配置完了

メモ  -  プロパティウィンドウで設定する方法

タスク一覧を使用しなくてもプロパティウィンドウを使って同じ設定をすることもできます。プロパティウィンドウを使って設定するにはSplitContainer2を選択して、タスクウィンドウのOrientationプロパティ(読み方:Orientation = オリエンテーション)の値をHorizontal(読み方:Horizontal = ホリゾンタル)にして下さい。

 

▼手順3

ListBoxコントロール(読み方:ListBox = リストボックス)をSplitContainer2Panel2に配置します。名前をlstFileNameにしてください。

ツールボックス上のListBoxコントロールとWebBrowserコントロール

■画像6:ツールボックス上のListBoxコントロールとWebBrowserコントロール

プログラム完成時にはこのListBoxコントロールにファイルの一覧が表示されます。

ListBoxコントロールを配置したところ

■画像7:ListBoxコントロールを配置したところ

配置したらlstFileNameDockプロパティをFillにしてください。そうするとlstFileNamePanel2全体に広がります。

また、AllowDropプロパティ(読み方:AllowDrop = アロゥドロップ)をTrueにしてください。これは後でこのListBoxコントロールにファイルをドロップをできるようにするための設定です。

 

▼手順4

WebBrowserコントロール(読み方:WebBrowser = ウェブブラウザー)をSplitContainer1Panel2に配置してください。

配置すると自動的にいっぱいに広がります。

WebBrowserコントロールを配置したところ

■画像8:WebBrowserコントロールを配置したところ

このWebBrowserコントロールについては何もプロパティを変更しないでおいてください。名前も初期状態のWebBrowser1のままで構いません。

 

3−1−3.確認

この段階で実行してみてください。マウスを使ってフォームの大きさを変えたり、ファイル一覧の部分の広さを変更できることを試してみてください。

 

3−1−4.解説

以上でこの作業は終了です。この作業の意味を簡単に説明します。

フォームに配置したSplitoContainerコントロールはフォーム上での配置を自動的に調節してくれるコントロールです。 このコントロールには次の2つの働きがあります。

SplitContainerコントロールの機能
実行時にマウスでフォームの大きさが変更されても、それに応じて自動的に広がる。
フォームを上下または左右の区画に分け、実行時には境界線をマウスでドラッグすることによりそれぞれの区画の広さを変更できるようにする。

このようにユーザーが自由にサイズを変更できるようにフォームを設計する場合はSplitContainerコントロールが大変役に立ちます。

 

3− 2.左側のファイル一覧の機能をプログラムする。

 

3−2−1.この段階の概要

この段階では、左側に配置したlstFileNameにファイルをドラッグ&ドロップできるようにします。ドロップしたファイルのファイル名がlstFileNameに追加されていくようにします。ドロップしたファイルのフルパスは別の方法でプログラム内部に保存します。

 

3−2−2.ドロップしたファイルのファイル名を追加する。

まず、ドロップされたファイルのフルパスを記憶するための変数を宣言します(※1)。コード入力画面に切り替えて、次のコードを追加してください。

※1:変数の宣言については入門講座では説明していません。ここでは、指示通りにコードを書いていただければ結構です。変数の宣言については初級講座で扱います。

VB2005対応

Public Class Form1

    Dim
FullPaths As New ArrayList

End Class

■リスト1

 

lstFileNameDragEnterイベントに次の リスト2のコードを追加します。

DragEnterイベントにコードを入力するには、クラス名ボックスに「lstFileName」が選択されている状態でメソッド名ボックスから「DragEnter」を選択します。

DragEnterイベントの生成

■画像9:DragEnterイベントの生成

ヒント:フォーム上で、lstFileNameをダブルクリックしてコード入力画面に切り替えるとはじめからクラス名ボックスに「lstFileName」が選択されているので楽です。

→この辺りの詳しい説明は入門講座第4回 「イベントを逃すな」をご覧下さい。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Private Sub lstFileName_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstFileName.DragEnter

    If e.Data.GetDataPresent(DataFormats.FileDrop) Then
       
e.Effect = DragDropEffects.Copy
   
Else
       
e.Effect = DragDropEffects.None
    End
If

End Sub

■リスト2:DragEnterイベント

同様にlstFileNameDragDropイベントに 次のリスト3のコードを追加します。

DragDropイベントの生成

■画像10:DragDropイベントの生成

VB.NET2002対応 VB.NET2003対応 VB2005対応

Private Sub lstFileName_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstFileName.DragDrop

    Dim FileName As String

    FileName = CType(e.Data.GetData(DataFormats.FileDrop), String())(0)

    FullPaths.Add(FileName)
    lstFileName.Items.Add(IO.Path.GetFileName(FileName))

End Sub

■リスト3:DragDropイベント

 

3−2−3.確認

ここまでの作業が完了しているか確認するために、プログラムを実行して、lstFileNameめがけてファイルをドラッグ&ドロップしてみてください。ファイルはどのような種類のものでも構いません。たとえば、デスクトップ上の適当なファイルをドロップしてみてください。

ドロップしたファイルのファイル名が次々にlstFileNameに追加されていくようなら正常です。

エラーになる場合は、もう一度コードを見直してください。

エラーにはならないが、正常に動作しない場合はコードを見直すとともにlstFileNameAllowDropプロパティがTrueになっているか確認してください。

 

3−2−4.解説

ここでのプログラムは入門講座のレベルを超えるものでしたが簡単に説明しておきます。

DragEnterイベントは、ドラッグされてきた何かが自分の上に来たときに発生します。この場合はlstFileNameの上に来たときに発生します。今回は、ドラッグされてきたものがファイルであれば、コピーOKの意思表示をするように命令しています。

DragDropイベントは、ドラッグされてきた何かが自分にドロップされたときに発生します。今回は、ファイルがドロップされてくるはずなので、ファイル名を取得して表示するようにしています。

次の部分は、プログラム内部でフルパスを保存する仕組みです。

FullPaths.Add(FileName)

ただし表示はファイル名のみで、フルパスは表示されないようにしています。ファイル名のみを表示しているのは以下の部分です。

lstFileName.Items.Add(IO.Path.GetFileName(FileName))

念のために用語について確認しておきますと、たとえば、「C:\Windows\隅田川.bmp」をドロップした場合、フルパスは「C:\Windows\隅田川.bmp」、ファイル名は「隅田川.bmp」となります。

 

3−3.ファイルを表示できるようにする

 

この段階では、ファイル一覧(=lstFileName)でクリックしたファイルが実際に右側のWebBrowser1に表示されるようにします。

本来ファイルを表示する機能をプログラムするのはとても大変です。ファイルの種類ごとに違った処理が必要となるからです。しかし今回はWebBrowserコントロールがすべてを自動的に処理してくれるので この作業はとても簡単になります。

lstFileNameSelectedIndexChangedイベントに次のコードを追加してください。

VB2005対応

Private Sub lstFileName_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstFileName.SelectedIndexChanged

    Dim FullPath As String

    FullPath = FullPaths(lstFileName.SelectedIndex)

    WebBrowser1.Navigate(FullPath)

    Me.Text = Application.ProductName & " - " & FullPath

End Sub

■リスト4

これだけで完成です。実行して確かめてみてください。

ファイル一覧(=lstFileName)に画像やhtmlファイルなどをドロップして、ファイル名をクリックするとちゃんとそれが表示されるのが確認できます。

SelectedIndexChangedイベントはlstFileNameの選択されている内容が変更されたときに発生します。今回は、このときにとっておいたフルパスを元にWebBrowser1Navigateメソッドを呼び出します。

NavigateメソッドはそれがなんであれWebBrowserコントロールで自動的に処理してくれる便利なメソッドです。

この辺りも入門講座では説明していない事柄ですが、もう1つ説明します。フルパスはFullPathsという変数に保存されています。この変数にFullPaths(0), FullPaths(1)、…のように指定すると1番目のフルパス、2番目のフルパス、…を取り出すことができます。

ここでは、lstFileNameで選択されている番号のフルパスを取り出します。現在選択されている番号はSelectedIndexプロパティでわかります。

 

3−4.ファイル一覧の保存・読み込み機能をつける

 

3−4−1.概要

この段階では、ファイル一覧の内容を保存する機能、および保存したファイル一覧を呼び出す機能をプログラムします。また、保存・読み込みを実行するためのボタンを配置します。

これにより、一度作成したファイル一覧を2回目以降は簡単に呼び出せるようになります。

 

3−4−2.ボタンの配置

まずツールバーに見立てて保存ボタンと読み込みボタンを作成します。本当のツールバー機能を実現することも可能なのですが今回はツールバー風にボタンを並べておくだけにします。

次のようにボタンを配置してください。

配置後の画面

■画像11:配置後の画面

 

プロパティの設定はプロパティウィンドウで行うことをお勧めします。

コントロール名   プロパティ
btnSave
(Button ボタン)
フォームの左上に配置してください。一番左に配置すると良いです。 Text
btnLoad
(Button ボタン)
フォームの左上でbtnSaveの右横に配置すると良いです。 Text

■表2

今回は、簡単に漢字で「保」や「読」などと表示するようにしました。かっこよくするためにはここに画像を表示するなどの工夫が必要でしょう。

博士のワンポイントレッスン  -  ボタンがちゃんと並ばない
V太 V太:博士〜。どんなにやってもボタンが並んでくれませんよ〜。大きさも変な大きさになっちゃいます…。
博士 博士: うーむ。VBの自動配置機能が働いておるのじゃな。VBではコントロールを配置する際に回りにあるコントロールと自動的に位置調節を行う機能があるのじゃ。
V太 その機能って便利なときもあるんですけど今回はやめて欲しいんですけど。何とかなりませんか?
B子 B子:とりあえずなんとかするにはプロパティウィンドウで直接コントロールの位置や大きさを数値で指定すると良いわ。これなら自動配置機能は働かないわ。

位置の微調整

■画像12:位置の微調整

博士 根本的な解決策としてはこの機能をオフにするということもありえる。この機能をオフにするには[ツール]メニューの[オプション]画面から、「Windows フォーム デザイナ」を選択して、LayoutModeSnapToGridに変更するのじゃ。

 

3−4−3.ファイル一覧を保存できるようにする

ファイル一覧を保存できるようにするために、btnSaveClickイベントに次のコードを追加してください。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click

    Dim
Dialog As New SaveFileDialog

    If Dialog.ShowDialog(Me) = Windows.Forms.DialogResult.OK
Then

        Dim Writer As New IO.StreamWriter(Dialog.FileName)

        For
Index As Integer = 0 To FullPaths.Count - 1
            Writer.WriteLine(FullPaths(Index))
       
Next

       
Writer.Close()

    End
If

End Sub

■リスト5

この段階で、このコードがうまく動くかテストしてみてください。正常に動作する場合は、ファイル一覧にいくつかのファイルを追加して、「保」ボタンをクリックすると、ファイル名を選択する画面になります。そこで適当なファイル名を入力し、「保存」をクリックすると、そのファイルにファイル一覧のファイルのフルパスが書き込まれます。

ファイル選択画面

■画像13:ファイル選択画面

保存したファイルの内容を確認しやすくするために、保存するときにファイルの拡張子にtxtを指定しておくとよいでしょう。

 

3−4−4.ファイル一覧を読み込めるようにする

今度は、3−4−3で作成したファイルを読み込めるようにします。btnLoadClickイベントに次のコードを追加してください。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click

    Dim Dialog As New OpenFileDialog

    If Dialog.ShowDialog(Me) = Windows.Forms.DialogResult.OK
Then

       
Dim Value As String
       
Dim Reader As New IO.StreamReader(Dialog.FileName)

        FullPaths.Clear()
        lstFileName.Items.Clear()

       
Do
           
Value = Reader.ReadLine
            If Value Is Nothing
Then
               
Exit Do
           
Else
               
FullPaths.Add(Value)
                lstFileName.Items.Add(IO.Path.GetFileName(Value))
            End
If
       
Loop

       
Reader.Close()

    End
If

End Sub

■リスト6

プログラムができたら、実際に実行して確認してみてください。正常に動作する場合は、「読」ボタンをクリックするとファイルを選択する画面が表示され、そこで選択したファイルの内容を読み込んで、ファイル一覧に表示します。

なお、無関係なファイルを選択するとエラーになったら異常な動作をしますので、かならず「保」ボタンで作成したファイルを選択するようにしてください。

本来は無関係なファイルが指定された場合のチェックをプログラムで行う必要があるのですが、今回は割愛します。というのもこのソフトは仮に異常終了した場合でもユーザーにはほとんどダメージがないからです。

 

3−5.細部を整える

 

3−5−1.概要

すでに基本的な機能はすべて完成しています。最後に少し手を加えて仕上げを行います。

このようにプログラムを作るときは、基本的な機能を完成させてから細かい点を仕上げていくというスタイルをお勧めします。はじめから細かいところを作りこんでいくとなかなかプログラムが進まないので退屈ですし、一通り出来上がってから見えてくる部分というものもあります。

ここでは、一番初めのタイトルバーの表示が Form1 となっているのが美しくないので直します。また、ファイル一覧にまったくファイルがない状態でも「保」ボタンが押せるのは妙だと思うのでこの場合は「保」ボタンをクリックできないようにします。

他にも目に付く点はあるのですが、それらは簡単に触れるに留め、今回はあまり欲張らないことにしましょう。

 

3−5−2.タイトルバーの表示

タイトルバーの表示に関しては、すでにlstFileNameSelectedIndexChangedイベントで、アプリケーション名とフルパスが表示されるようにプログラムしてあります。

以下の部分がそのコードです。

Me.Text = Application.ProductName & " - " & FullPath

これはこれでよいと思うのですが、一番初めにプログラムを開始した時点では「Form1」となっているのでこのときにアプリケーション名を表示するように改造します。

FormLoadイベントに次のコードを追加してください。

FormLoadイベントはデザイン画面でフォームのタイトルバーをダブルクリックすると自動的に生成されるので楽です。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Me.Text = Application.ProductName

End Sub

■リスト7

 

3−5−3.初めは「保」ボタンをクリックできないようにする

「保」ボタンはファイル一覧が空のときはクリックできないようにしてしまいましょう。

そのために、まずプロパティウィンドウでbtnSaveEnabledプロパティをFalseにしてください。

そして、次の2箇所にコードを追加してください。

1つ目はlstFileNameDragDropイベントです。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Private Sub lstFileName_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lstFileName.DragDrop

    (中略)

    btnSave.Enabled = True

End Sub

■リスト8

2つ目はbtnLoadClickイベントです。

VB.NET2002対応 VB.NET2003対応 VB2005対応

Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click

    (中略)

        Reader.Close()

        btnSave.Enabled = True

    End If

End Sub

■リスト9

 

3−5−4.見かけの問題

最後に私が一番気になっているのは見かけです。コントロールをぺたぺた貼っていっただけなので仕方ないのですが、このソフトは見かけが素敵ではありません。

この点の改良は個人のセンスの問題もありますし、技術的な問題もあります。ここでは簡単にヒントだけを示します。

まず、SplitContainer1のBorderStyleプロパティを変更すると全体的な質感が変わります。Fixed3Dなどにすると各領域がはっきりと表示されるようになります。

次になんといって「保」ボタンと「読」ボタンがださいです。ここを何とかするにはそれなりに知識が必要となってきますがやはりVBのツールバー機能を利用するとよいでしょう。ツールバーを配置するにはToolStripコントロールを使用しますが始めての方は苦労するかもしれません。ちょっとチャレンジしてみてください。

 

 

4.完成

 

お疲れ様です。以上でプログラムは完成しました。

多分、実際に作っていただいた方にはほとんどコードをコピー&貼り付けするだけの作業になってしまったのではないかと思いますが、それで良いのです。この作業を通して必ず得るものがあったはずです。冒頭にも書いたように新しい発見や、知らなかった操作方法、まだ知らないテクニックにふれることの刺激、そんなものを感じ取っていただければ私の意図は達成できたことになります。

また、VBのプログラミングはコントロールを貼り付けて、それぞれのイベントにプログラムしていくイベントドリブンという形式になっていることも理解していただけたのではないでしょうか。

ふりかえって今回作成したアプリケーションについて反省してみます。

まず、WebBworserコントロールの力を使うことにより、さまざまな種類のファイルを簡単に表示することができました。これはたいへん良いことだと思います。

悪い点ではファイル一覧の扱い方です。このファイル一覧は扱いにくいです。たとえば、間違って登録してしまったファイルを削除することができません。また、ファイルの順番を入れ替えることもできません。

もう一つ、このアプリケーションではファイルを見るだけで編集することができません。画像ファイルならそれでも満足できるのですが、テキストファイルの場合は編集したくなります。

さらに、このアプリケーションの可能性を考えて見ましょう。どのような機能を追加することができるでしょうか?

私が考えているのは、スライドショー機能です、一定時間ごとにファイルが自動的に切り替わっていけばそのままスライドショーができますね。プレゼンテーションに使うということもできそうです。

入門レベルでは、これらの反省点を元に具体的なコードの形で改造していくことは困難だと思います。いつかあなたの考えていることをそのままコードにかけるようになる日が来たら、そのときこそあなたの欲しい機能をどんどんプログラムして行こうではありませんか。現段階ではあせらないで一歩ずつ進んで行きましょう。