MENU > HOME VB.NET VB6 VBA ソフトウェア リンク サイト情報
VB.NET> VB.NET 突撃レポート > 1  2  3  4  5  6  7  8  9  10  11  12 
PART3: メッセージボックスの使い方 (2003年3月24日)

前回のアプリケーションをさらに拡張し、終了時にメッセージボックスを表示し、確認を行うという機能を追加します。

まずは使い慣れたMsgBox関数です。

コーディングを行う前に関数の使用方法が違うといけませんので、事前に文法をチェックしてみることにします。

Function MsgBox(Prompt As Object, [Buttons As Microsoft.VisualBasic.MsgBoxStyle = MsgBoxStyle.DefaultButton1] , [Title As Object = Nothing]) As Microsoft.VisualBasic.MsgBoxResult

引数の型が多少違うところはあるものの、ほぼ以前と使い方は変わらないようです。
では、コーディングに移りたいと思います。

今回の仕様では、タイトルバーに"終了確認"、表示メッセージに"本当に終了してもよろしいですか?"、
アイコンは"?"、"はい"ボタンと"いいえ"ボタンとし、"はい"ボタンが押された場合のみフォームを閉じることとします。

以下のようにFormのClosingイベントにコーディングしてみます。


特に問題は無さそうなので、実行してみることにします。

このように仕様通りの動作を確認できたと思います。

でも先程のコード、実は間違っています。

MsgBox関数の第2引数(波線部分)で MsgBoxStyle.Question + MsgBoxStyle.YesNo と記述している部分、
実はこれ算術演算で計算結果は Integer なんです。
試しに、Form1.vbのコードの先頭に Option Strict On と記述し、型チェックを厳しくしてみると、


のように、IntegerからMsgBoxStyl型への暗黙的な変換ができない、つまり2番目の引数は
MsgBoxStyleである必要があるにもかかわらず、MsgBoxStyle.Information + MsgBoxStyle.YesNo にて
算術演算を行った結果(Integer型)を指定していると叱られます。

よってここは MsgBoxStyle.Question Or MsgBoxStyle.YesNo といったように論理演算の記述に変更してみましょう。
ビルドエラーはなくなったと思います。

早速でてきた新しいオプションのSTRICT 型チェック、VB.netではデフォルトでOffになってはいますが、
私はこのオプションをOnでコーディングすることをものすごくお勧めします。

極端な例ですが、以前のバージョンでは以下のようなコーディングを行ってもコンパイル時にはエラーとなることはなく、
このエラーは実行してみるまで発見できませんでした。
Dim intVal As Integer
intVal = "A"

これを Option Strict On と記述することにより、コーディング時に型チェックが行われるため、実行時に予期せずして
発生する可能性あるコードを事前にある程度つぶしておくことができ、型保証を向上させることができます。

実はメッセージボックスを表示させる手段はもうひとつあります。
Windows.Forms の MessageBox クラスを使用する方法です。
この MessageBox クラスの Show メソッドを実行するとメッセージボックスが表示されます。
先ほどのコードと差し替えてみます。

いつものようにツールヒントが表示されますが、ふとよく見てみると、上下矢印と1/12と表示されていますね。
キーボードの上下キーを押してみます。すると...





次々とShowメソッドに関するツールヒントがでてきますが、全く同じ名前のShowメソッドで引数の違うものが12個ある事がわかります。
これを関数のオーバーロードといいます。C/C++等ではおなじみなんですが、今回のバージョンアップでVBでも正式に
関数のオーバーロード(引数の型が異なる同じ名前を持つSub、Functionを作成する)がサポートされました。
自前で作成する関数に関しても例外ではなく、同様に関数のオーバーロードを行うことができます。

話を戻します。
今回の仕様では3番目に表示された Show メソッドが対象になります。(文法は以下)

Function Show(text As String, caption As String, _
  buttons As System.Windows.Forms.MessageBoxButtons, icon As System.Windows.Forms.MessageBoxIcon) As System.Windows.Forms.DialogResult

よって、Windows.Forms.MessageBoxクラスを使用した場合のコードは

If MessageBox.Show("本当に終了してもよろしいですか?", _
                            "終了確認", _
                            MessageBoxButtons.YesNo, _
                            MessageBoxIcon.Question) <> DialogResult.Yes Then
    e.Cancel = True
End If

となります。同じく最初の仕様どおりにメッセージボックスの動作を確認できたと思います。

さて、これら2つのメッセージボックスの方法、どちらを今後は使うべきなのでしょうか?
私の考えでは、Windows.FormsはVS.NETでウィンドウアプリケーションを作成する上でのベースになるものですから、
VB独自のMsgBox関数を使用するよりも他言語と親和性のあるMssageBoxクラスを使っていこうと思います。
(ただし、MsgBox関数はVBの関数ではあるが、C#等で使えないというわけではない。)


今日の収穫
1.Option Strict On / Option Strict Off で厳密な型チェックを行うオプションを切り替える事ができる。
2.メッセージボックスの表示はMsgBox関数のほかにWindows.FormsのMessageBoxクラスを利用する方法がある。
3.VB.NETでは関数のオーバーロードがサポートされた。


Copyright©Sugi. All rights reserved.。