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では関数のオーバーロードがサポートされた。
|