Visual Basic 初級講座
VB.NET 2002 対応 VB.NET 2003 対応 VB2005 対応

 

Visual Basic 中学校 > 初級講座 >

第37回 Myの用法

VB2005の新機能である「My」について説明します。VB.NET2002、VB.NET2003では使えない機能ですのでVB.NET2003以前をお使いの方で時間に余裕がない方は今回は飛ばしても構いません。しかし、どのような方でも一度目を通しておくと展望が開けます。

概要

・VB2005から新しく導入された機能「My」を使うと、いろいろなことがとても簡単にできる。

・Myは「簡単」が特徴。

・My.Applicationを使うと、開いているすべてのフォームにアクセスしたり、ハンドルしていないすべての例外をキャッチしたりできる。

・My.Computerを使うと、ファイルやフォルダを簡単に制御したり、レジストリにアクセスしたりできる。

 

1.Myの力点

My」(読み方:My = マイ)はVB2005から新しく導入された機能です。これは高度な機能を簡単に使用するための機能で、特に「簡単に」というところに力点が置かれています。

従来新しい機能が追加されるたびに「高度な機能が簡単に使用できる」というような宣伝がされてきましたが、ほとんどの場合「高度な機能」の方に重点が置かれていて「簡単に」という方はまぁそこそこだったのですが、Myの場合は「簡単に」の方に重点が置かれているのが特徴です。

Myを使用して実現できる機能の多くはMyを使用しなくても比較的簡単に実現できることです。しかし、Myを使うことによりさらに簡単に実現することができます。

VB(やC#)は.NET Frameworkの豊富な機能を利用してプログラムできる反面、どこにどういう機能があるのかわかりにくいという難点がありました。たとえば、通常の機能でユーザー名を取得するには次のように記述します。

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


TextBox1.Text = Environment.UserName
 

■リスト1:従来の方法でのユーザー名の取得

ご覧のように従来の機能を使ってもユーザー名の取得はかなり簡単です。これをMyを使うと次のようになります。

VB2005対応


TextBox1.Text = My.User.Name
 

■リスト2:Myを使用したユーザー名の取得

実際にはMyを使用した場合はドメイン名も返すので、上の2つの例は異なる結果を返すのですがここではそのことは考えないでおきます。そうすると、どちらも同じようなものに見えてMyのメリットが見えてこないかもしれませんが、まぁ何も知らない人の立場になって考えてみてください。

従来の例はEnvironmentというクラスの存在を知らなければありえないプログラムですが、Myを使った方はとりあえず「My.」と打つとVBのインテリセンス機能によってヒントが表示されるので細かい知識がなくてもなんとかなるのです。

■画像1

これからは困ったときには「My.」と打つプログラマが増えることでしょう。

今度はwavファイルを再生する例で比較して見ます。従来は次のように記述する必要がありました。

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

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
Const SND_FILENAME = &H20000

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を利用すると次のように記述することができます。

VB2005対応

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 = サウンドプレイヤー)を使っても簡単に再生することができます。

 

2.Myの機能

 

では、もう少し整理してMyの機能を眺めて見ましょう。

WindowsアプリケーションではMyには次の機能があります。

オブジェクト 読み方 機能
クラス Application アプリケーション 現在のアプリケーションに関する情報の取得や操作を提供します。
クラス Computer コンピュータ コンピュータに関する情報の取得や操作を提供します。
クラス Forms フォームズ プロジェクト内のフォームに階層的にアクセスします。
クラス User ユーザー ユーザーに関する情報、特にユーザーの権限を返します。
クラス WebService ウェブサービス  

■表1

コンソールアプリケーションやWebアプリケーションなどのプロジェクトの形態によってMyの機能は変化します。たとえば、WebアプリケーションにはフォームがないのでFormsは使用できませんが、Responseオブジェクト(読み方:Response = レスポンス)などが使用できるようになります。

初級講座ではWindowsアプリケーションを主眼においているのでここではWindowsアプリケーションに場合に限って説明を進めます。

ここからはMyに属するオブジェクトのうち特に機能の豊富なApplicationComputerをとりあげて説明しますが、これらの詳細な機能 はMSDNライブラリを見ていただくことにして、ダイジェスト的にMyの利点が伝わってきそうな機能をいくつかピックアップして説明するにとどめます。

MSDNライブラリも近頃は親切に書いてありますから、初級レベルの方でも恐れずに目を通してみてください。

 

3.My.Applicationオブジェクト

 

My.Applicationは現在のアプリケーションに関する情報の取得や操作を提供します。

主な機能は次の通りです。

メンバ 読み方 機能
プロパティ CommandLineArgs コマンドラインオーグス コマンドラインを区切ってコレクションとして表す。
プロパティ Info インフォ 現在のアセンブリに関する情報を表す。
プロパティ Log ログ ログへの書き込みを行う。
プロパティ OpenForms オープンフォームズ 開いているすべてのフォームへアクセスする。
プロパティ DoEvents ドゥーイベンツ  
イベント UnhandledException アンハンドルドエクセプション 未処理の例外が起こったときに発生するイベント。

■表2:My.Applicationの主なメンバ

CommandLineArgsプロパティはコマンドラインを自動的に区切ってくれるので、同じくコマンドラインを取得するEnvironment.CommandLineプロパティよりも使い勝手が良いです。コマンドラインとはアプリケーションを起動するときに使用されるオプションのことです。コマンドライン自体については別の機会に取り上げようと思います。

次の例では、最初のコマンドラインをテキストボックスに表示します。

VB2005対応


TextBox1.Text = My.Application.CommandLineArgs(0)
 

■リスト5:一番目のコマンドラインの取得

次の例では、すべてのコマンドラインをリストボックスに表示します。

VB2005対応


ListBox1.Items.AddRange(ArrayList.Adapter(My.Application.CommandLineArgs).ToArray)
 

■リスト6:すべてのコマンドラインをリストボックスに表示

 

Infoプロパティを使うと現在のアセンブリに関する情報を取得することができます。これらの情報の多くはexeファイルのプロパティ画面に表示されている類の情報です。

次の例ではアセンブリの位置を表示します。

VB2005対応


TextBox1.Text = My.Application.Info.DirectoryPath
 

■リスト7:アセンブリのパスの取得

 

Logプロパティはログを書き込むための便利なオブジェクトを表しています。でもこれはちょっと使いにくいです・・・。

たとえば、C:\Test\フォルダにアプリケーションからログを書き込むためにはまず、アプリケーション構成ファイルで設定する必要があります。アプリケーション構成ファイルはapp.configというファイル名で、自分でプロジェクトに追加しなければなりません。ソリューションエクスプローラでプロジェクトを右クリックして、「app.config」という名前のテキストファイルを新規に追加してください。

そして、そのファイルに次の通りに記述します。

VB2005対応

<?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>
            <
add name="DefaultSwitch" value="Information" />
        </
switches>

        <sharedListeners>
            <
add name="FileLogListener"
             type="
Microsoft.VisualBasic.Logging.FileLogTraceListener,
             Microsoft.VisualBasic, Version=8.0.0.0,
             Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
"
             initializeData="FileLogListenerWriter"

            
location="Custom"
             customlocation="c:\Test\"
/>
        </
sharedListeners>
    </
system.diagnostics>
</
configuration>

■リスト8:app.configの記述例

この設定がすめば後は簡単です。次のようにプログラムすると見事にログが出力されます。

VB2005対応


My
.Application.Log.WriteEntry("ログに書けたかな?")
 

■リスト9:ログへの書き込み。対象となるログはapp.configに依存します。

ログの確認はプログラムの実行を終了してから行ってください。プログラム実行中は確認できない場合があります。

単にテキストファイルに書き込むだけならこの機能だけのためにapp.configをいじるのが面倒なのですが、実はこの機能にはもっといろいろなログを出力する機能があって、使いこなせばなかなか便利そうです。この機能だけで1つの記事が書けそうです。今回はさわりだけで終わりますが興味のある方は調べてみてください。

 

OpenFormsプロパティは現在開いているすべてのフォームを表す便利なプロパティです。

次の例では、2番目に開いたフォームを閉じます。

VB2005対応

Form2.Show()

MsgBox("今開いたフォームを閉じます。", MsgBoxStyle.Information)

My.Application.OpenForms(1).Close()

■リスト10:2番目に開いたフォームを閉じる。

ここではかなりシンプルに書きましたが、このOpenFormsはどこにでもかけるので便利です。従来のVB.NET2002およびVB.NET2003ではフォームを表す変数のスコープに気を配る必要がありましたが、OpenFormsを使えばそのような瑣末なことに気を使う必要はありません。

次の例では、開いているフォームの数を表示します。

VB2005対応

Dim f As Form2
Dim FormCount As
Integer

f = New Form2
f.Show()

f = New Form2
f.Show()

FormCount = My.Application.OpenForms.Count

MsgBox(FormCount & "個のフォームが開いています。", MsgBoxStyle.Information)

■リスト11:開いているフォームの数を表示する。

この例では、最初に開いたForm2を表している変数が別のフォームを開くために流用されているので、最初のForm2にアクセスする手段がなくなってしまうようにも思えますが、この場合でもOpenFormsプロパティを使用することですべてのフォームにアクセス可能です。

次の例では、すべての開いているフォームを最小化します。

VB2005対応

For Each f As Form In My.Application.OpenForms
    f.WindowState = FormWindowState.Minimized
Next

■リスト12:開いているすべてのフォームを最小化する。

 

UnhandledExceptionイベントはハンドルされていない例外が発生したときに呼び出される便利なイベントです。従来はいつ例外が発生してもよいようにあらゆるところにTryCatchOn Errorを記述していましたが、VB2005では、こういった記述をしなくてもUnhandledExceptionイベントが発生してくれます。

このイベントを使用するには少し手順が必要です。

まず、プロジェクトのプロパティ画面で、[アプリケーション]タグの[アプリケーションイベントの表示]ボタンをクリックします。

■画像2

そうすると、ApplicationEvents.vbというファイルがプロジェクトに追加されます。

■画像3

このファイルは最初次のような内容になっています。

VB2005対応

Namespace My

    ' 次のイベントはMyApplication に対して利用できます:
    '
    ' Startup: アプリケーションが開始されたとき、スタートアップフォームが作成される前に発生します。
    ' Shutdown: アプリケーションフォームがすべて閉じられた後に発生します。このイベントは、通常の終了以外の方法でアプリケーションが終了されたときには発生しません。
    ' UnhandledException: ハンドルされていない例外がアプリケーションで発生したときに発生するイベントです。
    ' StartupNextInstance: 単一インスタンスアプリケーションが起動され、それが既にアクティブであるときに発生します。
    ' NetworkAvailabilityChanged: ネットワーク接続が接続されたとき、または切断されたときに発生します。
   
Partial Friend Class MyApplication

    End Class

End Namespace

■リスト13:空のApplicationEvents.vb

後は通常のイベントを追加する手順でUnhandledExceptionイベントを追加すればよいのですが、下のコードをコピー&貼り付けしても結果は同じです。ここでは、テストのためのサンプルコードを追加しておきました。

VB2005対応

Namespace My

    ' 次のイベントはMyApplication に対して利用できます:
    '
    ' Startup: アプリケーションが開始されたとき、スタートアップフォームが作成される前に発生します。
    ' Shutdown: アプリケーションフォームがすべて閉じられた後に発生します。このイベントは、通常の終了以外の方法でアプリケーションが終了されたときには発生しません。
    ' UnhandledException: ハンドルされていない例外がアプリケーションで発生したときに発生するイベントです。
    ' StartupNextInstance: 単一インスタンスアプリケーションが起動され、それが既にアクティブであるときに発生します。
    ' NetworkAvailabilityChanged: ネットワーク接続が接続されたとき、または切断されたときに発生します。

    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イベントの追加

このコードにより未処理の例外が発生すると、メッセージが表示されます。

このコードを試すために、次のプログラムを実行してみてください。

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

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でリリースビルドを手軽に試すにはどうしたらよいのでしょうか…。

 

4.My.Computerオブジェクト

 

My.Computerオブジェクトはコンピュータに関する様々な情報や機能にアクセスできます。たとえば、ファイルシステムの操作や、キーボード・マウス・オーディオの操作ができます。

主な機能は次の通りです。

メンバ 読み方 機能
プロパティ Audio オーディオ wavファイルを再生する。
プロパティ Clipboard クリップボード コピー&貼り付けをサポートする。
プロパティ FileSystem ファイルシステム ファイル・フォルダを制御する。
プロパティ Info インフォ メモリの状況などを調べる。
プロパティ Keyboard キーボード キーボードの情報を表す。
プロパティ Registry レジストリ レジストリに簡単にアクセスする。

■表3:My.Computerの主なメンバ

Audioプロパティは文字通りサウンドを制御する機能を表しています。残念ながらここで制御できるサウンドの機能は再生と停止だけで、しかもwavファイルしか操作できません。それでも従来のVBのサウンド機能に比べれば大きな一歩です。次期バージョンではこの機能がさらに拡張されることを願います。

以下は使用例です。

VB2005対応


My
.Computer.Audio.Play("C:\Test.wav")
 

■リスト16:wavファイルの再生

なお、前述したSoundPlayerクラスを使っても同じように簡単に音楽を再生することができます。

 

Clipboardプロパティはクリップボードの簡単な制御を提供します。次の例はクリップボードを利用したコピーと貼り付けです。

VB2005対応

'クリップボードへコピー
My.Computer.Clipboard.SetText("捕らぬ狸の皮算用")

'クリップボードから貼り付け
TextBox1.Text = My.Computer.Clipboard.GetText

■リスト17:クリップボードのコピー&貼り付け

従来のClipboardクラスを利用しても同じことはできます。このメリットはやはりMyを利用して階層的に機能が見つけられることにあるのでしょう。

 

FileSystemプロパティはファイルシステムへの便利で簡単なアクセスを提供します。今後のVBではこの手法を利用したファイル操作が主流となりそうです。ファイルのコピー・削除など基本的な機能はもちろん従来は面倒だったフォルダのコピーも一撃でできてしまいます。

VB2005対応

'フォルダのコピー

My.Computer.FileSystem.CopyDirectory("C:\Test", "C:\Test2005")

■リスト18:フォルダのコピー

次の例ではテキストファイルの内容をテキストボックスに表示します。

VB2005対応


TextBox1.Text = My.Computer.FileSystem.ReadAllText("C:\Test.txt")
 

■リスト19:テキストファイルの読み込み

次の例ではデスクトップフォルダのパスを表示します。

VB2005対応

Dim Desktop As String

Desktop = My.Computer.FileSystem.SpecialDirectories.Desktop

MsgBox(Desktop)

■リスト20:デスクトップフォルダのパスを取得

念のために従来の方法でのデスクトップフォルダの取得方法も載せておきます。

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

Dim Desktop As String

Desktop = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)

MsgBox(Desktop)

■リスト21:デスクトップフォルダのパスを取得

簡単さについてはどちらも同じように見えるかもしれませんが、従来の方式ですとEnvironmentクラスというものが存在して、このような機能があるということをあらかじめ知っていなければ使用できないのに対し、Myを使った方法ではとりあえず、「My.」と打てばなんとなくできてしまうところが強みです。

 

Infoプロパティはコンピュータに対する基本的な情報を返します。メモリとOSに関する低レベルな情報が中心のようです。次の例ではOSの名前を表示します。

VB2005対応

Dim OSName As String

OSName = My.Computer.Info.OSFullName

MsgBox(OSName)

■リスト22:OSの名前の取得

Infoプロパティで取得できる情報はあまり多くありません。CPUやハードディスクの情報も取得できるようになったら便利なのですが、将来に期待です。

 

Keyboardプロパティはキーボードに関する情報を提供します。たとえば、CapsLockがONになっているか、NumLockがOnになっているか等です。残念ながら情報を返すだけで、キーの情報をセットする機能はありません。

次の例はNumLockがONになっているか調べます。

VB2005対応

If My.Computer.Keyboard.NumLock Then

    MsgBox("NumLockがONです。")

End If

■リスト23:NumLockの状態を調べる

 

RegistryプロパティはWindowsレジストリへの簡単なアクセスを提供します。ようやく手軽にレジストリにアクセスできる機能が備わって嬉しい限りです。

次の例は、レジストリに値を書き込みます。

VB2005対応

Dim KeyName As String

KeyName = "HKEY_CURRENT_USER\Software\VBSchool\Test"

My.Computer.Registry.SetValue(KeyName, "ValueName2005", "Hello")

■リスト24:レジストリへの書き込み

レジストリの設定は削除するか変更するまで残っていますから、アプリケーションの設定を保存するのにうってつけです。

次の例は保存した値を読み込みます。

VB2005対応

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:レジストリの読み込み

 

5.これからのMy

 

Myは登場したばかりの機能なので具体的にどのような使われ方をしていくかわかりませんが、今回紹介したダイジェストをみて食指が動く方も多いのではないでしょうか。

私は積極的にMyの機能を利用していくつもりです。また、将来はMyの機能がさらに拡張されてますます便利になっていくものと予想します。

最後にMyのデメリットについても少し考えておきましょう。Myで実現できる機能の多くはMyがなくても簡単に実現できる機能です。このことからMyはプログラマに混乱をもたらすことでしょう。

また、MyはVBでの利用のみを想定しているのに対し、従来の手法はVBやC#など.NET言語に共通であるものがほとんどです。ということはMyばかり使っているプログラマは応用が利かなくなる可能性があります。

このようなデメリットにもかかわらずMyが主流になっていくものと私は予想していますが、さて、どうなるでしょうか。