Visual Basic 初級講座 |
Visual Basic 中学校 > 初級講座 >
第37回 Myの用法
VB2005の新機能である「My」について説明します。VB.NET2002、VB.NET2003では使えない機能ですのでVB.NET2003以前をお使いの方で時間に余裕がない方は今回は飛ばしても構いません。しかし、どのような方でも一度目を通しておくと展望が開けます。
概要 ・VB2005から新しく導入された機能「My」を使うと、いろいろなことがとても簡単にできる。 ・Myは「簡単」が特徴。 ・My.Applicationを使うと、開いているすべてのフォームにアクセスしたり、ハンドルしていないすべての例外をキャッチしたりできる。 ・My.Computerを使うと、ファイルやフォルダを簡単に制御したり、レジストリにアクセスしたりできる。 |
「My」(読み方:My = マイ)はVB2005から新しく導入された機能です。これは高度な機能を簡単に使用するための機能で、特に「簡単に」というところに力点が置かれています。
従来新しい機能が追加されるたびに「高度な機能が簡単に使用できる」というような宣伝がされてきましたが、ほとんどの場合「高度な機能」の方に重点が置かれていて「簡単に」という方はまぁそこそこだったのですが、Myの場合は「簡単に」の方に重点が置かれているのが特徴です。
Myを使用して実現できる機能の多くはMyを使用しなくても比較的簡単に実現できることです。しかし、Myを使うことによりさらに簡単に実現することができます。
VB(やC#)は.NET Frameworkの豊富な機能を利用してプログラムできる反面、どこにどういう機能があるのかわかりにくいという難点がありました。たとえば、通常の機能でユーザー名を取得するには次のように記述します。
TextBox1.Text = Environment.UserName |
■リスト1:従来の方法でのユーザー名の取得
ご覧のように従来の機能を使ってもユーザー名の取得はかなり簡単です。これをMyを使うと次のようになります。
TextBox1.Text = My.User.Name |
■リスト2:Myを使用したユーザー名の取得
実際にはMyを使用した場合はドメイン名も返すので、上の2つの例は異なる結果を返すのですがここではそのことは考えないでおきます。そうすると、どちらも同じようなものに見えてMyのメリットが見えてこないかもしれませんが、まぁ何も知らない人の立場になって考えてみてください。
従来の例はEnvironmentというクラスの存在を知らなければありえないプログラムですが、Myを使った方はとりあえず「My.」と打つとVBのインテリセンス機能によってヒントが表示されるので細かい知識がなくてもなんとかなるのです。
■画像1
これからは困ったときには「My.」と打つプログラマが増えることでしょう。
今度はwavファイルを再生する例で比較して見ます。従来は次のように記述する必要がありました。
Declare
Auto
Function PlaySound Lib
"winmm.dll" (ByVal
name As
String,
ByVal hmod
As
Integer,
ByVal flags
As
Integer)
As
Integer
Const
SND_ASYNC = &H1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim FileName As String = "C:\test.wav" PlaySound(FileName, Nothing, SND_FILENAME Or SND_ASYNC) End Sub |
■リスト3:従来の方法でのwavファイルの再生
Myを利用すると次のように記述することができます。
Private Sub
Button1_Click(ByVal
sender As
System.Object, ByVal
e As
System.EventArgs) Handles
Button1.Click Dim FileName As String = "C:\test.wav" My.Computer.Audio.Play(FileName) End Sub |
■リスト4:Myを使用したwavファイルの再生
この場合はどちらの方が簡単か一目瞭然ですね。ただし、VB2005では新しく導入されたSoundPlayerクラス(読み方:SoundPlayer = サウンドプレイヤー)を使っても簡単に再生することができます。
では、もう少し整理してMyの機能を眺めて見ましょう。
WindowsアプリケーションではMyには次の機能があります。
オブジェクト | 読み方 | 機能 |
Application | アプリケーション | 現在のアプリケーションに関する情報の取得や操作を提供します。 |
Computer | コンピュータ | コンピュータに関する情報の取得や操作を提供します。 |
Forms | フォームズ | プロジェクト内のフォームに階層的にアクセスします。 |
User | ユーザー | ユーザーに関する情報、特にユーザーの権限を返します。 |
WebService | ウェブサービス |
■表1
コンソールアプリケーションやWebアプリケーションなどのプロジェクトの形態によってMyの機能は変化します。たとえば、WebアプリケーションにはフォームがないのでFormsは使用できませんが、Responseオブジェクト(読み方:Response = レスポンス)などが使用できるようになります。
初級講座ではWindowsアプリケーションを主眼においているのでここではWindowsアプリケーションに場合に限って説明を進めます。
ここからはMyに属するオブジェクトのうち特に機能の豊富なApplicationとComputerをとりあげて説明しますが、これらの詳細な機能 はMSDNライブラリを見ていただくことにして、ダイジェスト的にMyの利点が伝わってきそうな機能をいくつかピックアップして説明するにとどめます。
MSDNライブラリも近頃は親切に書いてありますから、初級レベルの方でも恐れずに目を通してみてください。
My.Applicationは現在のアプリケーションに関する情報の取得や操作を提供します。
主な機能は次の通りです。
メンバ | 読み方 | 機能 |
CommandLineArgs | コマンドラインオーグス | コマンドラインを区切ってコレクションとして表す。 |
Info | インフォ | 現在のアセンブリに関する情報を表す。 |
Log | ログ | ログへの書き込みを行う。 |
OpenForms | オープンフォームズ | 開いているすべてのフォームへアクセスする。 |
DoEvents | ドゥーイベンツ | |
UnhandledException | アンハンドルドエクセプション | 未処理の例外が起こったときに発生するイベント。 |
■表2:My.Applicationの主なメンバ
CommandLineArgsプロパティはコマンドラインを自動的に区切ってくれるので、同じくコマンドラインを取得するEnvironment.CommandLineプロパティよりも使い勝手が良いです。コマンドラインとはアプリケーションを起動するときに使用されるオプションのことです。コマンドライン自体については別の機会に取り上げようと思います。
次の例では、最初のコマンドラインをテキストボックスに表示します。
TextBox1.Text = My.Application.CommandLineArgs(0) |
■リスト5:一番目のコマンドラインの取得
次の例では、すべてのコマンドラインをリストボックスに表示します。
ListBox1.Items.AddRange(ArrayList.Adapter(My.Application.CommandLineArgs).ToArray) |
■リスト6:すべてのコマンドラインをリストボックスに表示
Infoプロパティを使うと現在のアセンブリに関する情報を取得することができます。これらの情報の多くはexeファイルのプロパティ画面に表示されている類の情報です。
次の例ではアセンブリの位置を表示します。
TextBox1.Text = My.Application.Info.DirectoryPath |
■リスト7:アセンブリのパスの取得
Logプロパティはログを書き込むための便利なオブジェクトを表しています。でもこれはちょっと使いにくいです・・・。
たとえば、C:\Test\フォルダにアプリケーションからログを書き込むためにはまず、アプリケーション構成ファイルで設定する必要があります。アプリケーション構成ファイルはapp.configというファイル名で、自分でプロジェクトに追加しなければなりません。ソリューションエクスプローラでプロジェクトを右クリックして、「app.config」という名前のテキストファイルを新規に追加してください。
そして、そのファイルに次の通りに記述します。
<?xml
version="1.0"
encoding="utf-8"
?> <configuration> <system.diagnostics> <sources> <!-- This section configures My.Application.Log --> <source name="DefaultSource" switchName="DefaultSwitch"> <listeners> <add name="FileLogListener"/> </listeners> </source> </sources>
<switches>
<sharedListeners> |
■リスト8:app.configの記述例
この設定がすめば後は簡単です。次のようにプログラムすると見事にログが出力されます。
My.Application.Log.WriteEntry("ログに書けたかな?") |
■リスト9:ログへの書き込み。対象となるログはapp.configに依存します。
ログの確認はプログラムの実行を終了してから行ってください。プログラム実行中は確認できない場合があります。
単にテキストファイルに書き込むだけならこの機能だけのためにapp.configをいじるのが面倒なのですが、実はこの機能にはもっといろいろなログを出力する機能があって、使いこなせばなかなか便利そうです。この機能だけで1つの記事が書けそうです。今回はさわりだけで終わりますが興味のある方は調べてみてください。
OpenFormsプロパティは現在開いているすべてのフォームを表す便利なプロパティです。
次の例では、2番目に開いたフォームを閉じます。
Form2.Show() MsgBox("今開いたフォームを閉じます。", MsgBoxStyle.Information) My.Application.OpenForms(1).Close() |
■リスト10:2番目に開いたフォームを閉じる。
ここではかなりシンプルに書きましたが、このOpenFormsはどこにでもかけるので便利です。従来のVB.NET2002およびVB.NET2003ではフォームを表す変数のスコープに気を配る必要がありましたが、OpenFormsを使えばそのような瑣末なことに気を使う必要はありません。
次の例では、開いているフォームの数を表示します。
Dim
f As Form2 Dim FormCount As Integer
f = New
Form2 f = New
Form2 FormCount = My.Application.OpenForms.Count MsgBox(FormCount & "個のフォームが開いています。", MsgBoxStyle.Information) |
■リスト11:開いているフォームの数を表示する。
この例では、最初に開いたForm2を表している変数が別のフォームを開くために流用されているので、最初のForm2にアクセスする手段がなくなってしまうようにも思えますが、この場合でもOpenFormsプロパティを使用することですべてのフォームにアクセス可能です。
次の例では、すべての開いているフォームを最小化します。
For
Each f As Form
In My.Application.OpenForms f.WindowState = FormWindowState.Minimized Next |
■リスト12:開いているすべてのフォームを最小化する。
UnhandledExceptionイベントはハンドルされていない例外が発生したときに呼び出される便利なイベントです。従来はいつ例外が発生してもよいようにあらゆるところにTry 〜 CatchやOn Errorを記述していましたが、VB2005では、こういった記述をしなくてもUnhandledExceptionイベントが発生してくれます。
このイベントを使用するには少し手順が必要です。
まず、プロジェクトのプロパティ画面で、[アプリケーション]タグの[アプリケーションイベントの表示]ボタンをクリックします。
■画像2
そうすると、ApplicationEvents.vbというファイルがプロジェクトに追加されます。
■画像3
このファイルは最初次のような内容になっています。
Namespace
My
' 次のイベントはMyApplication
に対して利用できます: End Class End Namespace |
■リスト13:空のApplicationEvents.vb
後は通常のイベントを追加する手順でUnhandledExceptionイベントを追加すればよいのですが、下のコードをコピー&貼り付けしても結果は同じです。ここでは、テストのためのサンプルコードを追加しておきました。
Namespace
My
' 次のイベントはMyApplication
に対して利用できます: Partial Friend Class MyApplication Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException MsgBox("例外" & e.Exception.GetType.FullName & "ですよ!") End Sub End Class End Namespace |
■リスト14:UnhandledExceptionイベントの追加
このコードにより未処理の例外が発生すると、メッセージが表示されます。
このコードを試すために、次のプログラムを実行してみてください。
Private
Sub Button1_Click(ByVal
sender As System.Object,
ByVal e As System.EventArgs)
Handles Button1.Click Dim i As Integer i = CInt("こんにちは") End Sub |
■リスト15:未処理の例外を発生させる例
実は実行してもさきほどのイベントは発生しないで、VBの例外メッセージが表示されてしまいます。先ほどのコードを試すにはリリースビルドで実行する必要があるのですが、どうもVB2005 Expressでは手軽にリリースビルドを実行する方法が用意されていないようです。そこで、少し面倒ですがまず、プロジェクトを適当なフォルダに保存してから、[ビルド]メニューの[ビルド]をクリックしてください。
その後で、プロジェクトを保存したフォルダから[bin] - [Release]とフォルダをたどったところにある「WindowsApplication1.exe」というような名前のexeを直接ダブルクリック等して実行すると、今度は自作のメッセージが表示できることを確認できます。
それにしても、Express Editionでリリースビルドを手軽に試すにはどうしたらよいのでしょうか…。
My.Computerオブジェクトはコンピュータに関する様々な情報や機能にアクセスできます。たとえば、ファイルシステムの操作や、キーボード・マウス・オーディオの操作ができます。
主な機能は次の通りです。
メンバ | 読み方 | 機能 |
Audio | オーディオ | wavファイルを再生する。 |
Clipboard | クリップボード | コピー&貼り付けをサポートする。 |
FileSystem | ファイルシステム | ファイル・フォルダを制御する。 |
Info | インフォ | メモリの状況などを調べる。 |
Keyboard | キーボード | キーボードの情報を表す。 |
Registry | レジストリ | レジストリに簡単にアクセスする。 |
■表3:My.Computerの主なメンバ
Audioプロパティは文字通りサウンドを制御する機能を表しています。残念ながらここで制御できるサウンドの機能は再生と停止だけで、しかもwavファイルしか操作できません。それでも従来のVBのサウンド機能に比べれば大きな一歩です。次期バージョンではこの機能がさらに拡張されることを願います。
以下は使用例です。
My.Computer.Audio.Play("C:\Test.wav") |
■リスト16:wavファイルの再生
なお、前述したSoundPlayerクラスを使っても同じように簡単に音楽を再生することができます。
Clipboardプロパティはクリップボードの簡単な制御を提供します。次の例はクリップボードを利用したコピーと貼り付けです。
'クリップボードへコピー My.Computer.Clipboard.SetText("捕らぬ狸の皮算用")
'クリップボードから貼り付け |
■リスト17:クリップボードのコピー&貼り付け
従来のClipboardクラスを利用しても同じことはできます。このメリットはやはりMyを利用して階層的に機能が見つけられることにあるのでしょう。
FileSystemプロパティはファイルシステムへの便利で簡単なアクセスを提供します。今後のVBではこの手法を利用したファイル操作が主流となりそうです。ファイルのコピー・削除など基本的な機能はもちろん従来は面倒だったフォルダのコピーも一撃でできてしまいます。
'フォルダのコピー My.Computer.FileSystem.CopyDirectory("C:\Test", "C:\Test2005") |
■リスト18:フォルダのコピー
次の例ではテキストファイルの内容をテキストボックスに表示します。
TextBox1.Text = My.Computer.FileSystem.ReadAllText("C:\Test.txt") |
■リスト19:テキストファイルの読み込み
次の例ではデスクトップフォルダのパスを表示します。
Dim
Desktop As
String Desktop = My.Computer.FileSystem.SpecialDirectories.Desktop MsgBox(Desktop) |
■リスト20:デスクトップフォルダのパスを取得
念のために従来の方法でのデスクトップフォルダの取得方法も載せておきます。
Dim
Desktop As
String Desktop = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) MsgBox(Desktop) |
■リスト21:デスクトップフォルダのパスを取得
簡単さについてはどちらも同じように見えるかもしれませんが、従来の方式ですとEnvironmentクラスというものが存在して、このような機能があるということをあらかじめ知っていなければ使用できないのに対し、Myを使った方法ではとりあえず、「My.」と打てばなんとなくできてしまうところが強みです。
Infoプロパティはコンピュータに対する基本的な情報を返します。メモリとOSに関する低レベルな情報が中心のようです。次の例ではOSの名前を表示します。
Dim
OSName As
String OSName = My.Computer.Info.OSFullName MsgBox(OSName) |
■リスト22:OSの名前の取得
Infoプロパティで取得できる情報はあまり多くありません。CPUやハードディスクの情報も取得できるようになったら便利なのですが、将来に期待です。
Keyboardプロパティはキーボードに関する情報を提供します。たとえば、CapsLockがONになっているか、NumLockがOnになっているか等です。残念ながら情報を返すだけで、キーの情報をセットする機能はありません。
次の例はNumLockがONになっているか調べます。
If
My.Computer.Keyboard.NumLock
Then MsgBox("NumLockがONです。") End If |
■リスト23:NumLockの状態を調べる
RegistryプロパティはWindowsレジストリへの簡単なアクセスを提供します。ようやく手軽にレジストリにアクセスできる機能が備わって嬉しい限りです。
次の例は、レジストリに値を書き込みます。
Dim
KeyName As
String KeyName = "HKEY_CURRENT_USER\Software\VBSchool\Test" My.Computer.Registry.SetValue(KeyName, "ValueName2005", "Hello") |
■リスト24:レジストリへの書き込み
レジストリの設定は削除するか変更するまで残っていますから、アプリケーションの設定を保存するのにうってつけです。
次の例は保存した値を読み込みます。
Dim
KeyName As
String Dim Value As String KeyName = "HKEY_CURRENT_USER\Software\VBSchool\Test" Value = My.Computer.Registry.GetValue(KeyName, "ValueName2005", "(読み込み失敗)") MsgBox(Value) |
■リスト25:レジストリの読み込み
Myは登場したばかりの機能なので具体的にどのような使われ方をしていくかわかりませんが、今回紹介したダイジェストをみて食指が動く方も多いのではないでしょうか。
私は積極的にMyの機能を利用していくつもりです。また、将来はMyの機能がさらに拡張されてますます便利になっていくものと予想します。
最後にMyのデメリットについても少し考えておきましょう。Myで実現できる機能の多くはMyがなくても簡単に実現できる機能です。このことからMyはプログラマに混乱をもたらすことでしょう。
また、MyはVBでの利用のみを想定しているのに対し、従来の手法はVBやC#など.NET言語に共通であるものがほとんどです。ということはMyばかり使っているプログラマは応用が利かなくなる可能性があります。
このようなデメリットにもかかわらずMyが主流になっていくものと私は予想していますが、さて、どうなるでしょうか。