Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード

Spacer

*

カスタム ダイアログ ボックスを作成する方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。ユーザーに 2 つのオプションを提示して、ユーザーが選択したオプションに応じて適切なサブルーチンを実行するカスタム ダイアログ ボックスを作成する方法はありますか。

-- AM

SpacerHey, Scripting Guy! AnswerScript Center

AM さん、こんにちは。今日は今日の風が吹く。結構なことです。昨日はこのスクリプティングの世界は、少なくとも野球やソフトボールのような大事なイベントに関しては、お祝いムードとは縁遠い日でした。たとえば昨日の朝、編集者が参加しているソフトボールのチームは、めった打ちに遭い、14-2 で 4 回コールド負けを喫しました。厳しい結果でした。編集者はちょっとばかり実力があるので、この敗北がおもしろくありません。そんな中でも良かったことを考えると、彼女はこの試合では、すばらしい眺望を楽しみました。特に、彼女が、本来なら二塁の塁審が立っている位置で守備についていたために、ゴロを取り損ねたときの眺望はすばらしいものだったに違いありません。さいわい、彼女は負傷はしませんでした。というのも、彼女はゴロのボールが当たるような位置までたどり着けなかったからです。

編集者への注 : これは、スポーツをネタにした冗談で、悪意はありません。私たちが、どれだけ編集者のことを敬愛してるかはご存知ですよね。

編集者注 : "ゴロが取れそうもないところにいた" という部分は事実ではありません。その証拠に、編集者のすねには、試合でできたあざがまだ残っています。スポーツをネタにした悪意のない冗談については、どうでしょうか。私は、スクリプティング チームのメンバにどう思われているのか、よくわかっています。気持ちは通じ合っているので、安心してください。

昨日はその後、Scripting Guy の息子が参加している野球のチームも、ダブルヘッダーで 7-0 と 9-1、2 試合とも完敗しました。Scripting Guy の息子はゴロを取り損ねたわけではありませんが、残念なことに、彼と彼のチームが試合でうまくできたのは、ゴロの処理だけでした (野球にさほど興味のない方のために、少しだけご説明しますと、2 試合のヒットの総数が 5 本というのは、ダブルヘッダーを勝ち抜くのにお勧めの方法とはとても言えません)。

結局どうなったかというと、編集者は昼間ずっと機嫌が悪く、あまり口を開かなかったので、このコラムを執筆している Scripting Guy は文章の不備を指摘されることなく 1 日が過ぎました。その晩、Scripting Guy の息子は機嫌が悪く、あまり口を開かなかったので、このコラムを執筆している Scripting Guy は正しくない行動を指摘されることなく一晩が過ぎました。

振り返ってみると、そう悪い日ではなかったかもしれません。

もちろん、何もかもが最悪なときに頼りになるものが 1 つだけあります。天上の存在の力です。天上の存在の力とは、たとえば、ユーザーに 2 つのオプションを提示して、ユーザーが選択したオプションに応じて適切なサブルーチンを実行するカスタム ダイアログ ボックスを作成する方法を説明する、このコラムを執筆している Scripting Guy です。

Set objExplorer = CreateObject("InternetExplorer.Application")

objExplorer.Navigate "file:///c:\scripts\test.htm"
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width = 400
objExplorer.Height = 250
objExplorer.Visible = 1

Do While (objExplorer.Document.All.ButtonClicked.Value = "")
    Wscript.Sleep 250
Loop

strSelection = objExplorer.Document.All.ButtonClicked.Value

objExplorer.Quit

Wscript.Sleep 250

Select Case strSelection
    Case "Option 1" 
        Wscript.Echo "You selected Option 1."
    Case "Option 2" 
        Wscript.Echo "You selected Option 2."
    Case "Option 3" 
        Wscript.Echo "You selected Option 3."
    Case "Cancelled"
        Wscript.Quit
End Select

このスクリプトのしくみは、この後すぐに説明します。ただその前にお話ししておきたいことがいくつかあります。まず、VBScript と Windows Script Host では、どちらもカスタム ダイアログ ボックスを作成する組み込みの方法は提供していません。ちょっとしたメッセージ ボックスなら作成できますが、その場合も限られた組み合わせのボタンしか使用できません。そのため、少しズルをする必要があります。オプションを表示する HTML ファイルを作成して、カスタム ダイアログ ボックスの代わりに、この HTML ファイルをスクリプトから呼び出す必要があります。これを行うのが次のコード行です。

objExplorer.Navigate "file:///c:\scripts\test.htm"

これについて少しご説明しましょう。とりあえず、この HTML ファイル (C:\Scripts\Test.htm) の内容を見てみましょう。

<SCRIPT language="VBScript">
    Sub OKClicked
        If UserOption(0).Checked Then
            ButtonClicked.Value = "Option 1"
        End If
        If UserOption(1).Checked Then
            ButtonClicked.Value = "Option 2"
        End If
        If UserOption(2).Checked Then
            ButtonClicked.Value = "Option 3"
        End If
    End Sub

    Sub CancelClicked
        ButtonClicked.Value = "Cancelled"
    End Sub
</SCRIPT>

<BODY>
    <input type="radio" name="UserOption" checked=True>Option 1<BR>
    <input type="radio" name="UserOption">Option 2<BR>
    <input type="radio" name="UserOption">Option 3<P>
    <input type="Button" value="OK" onClick="OKClicked">
    <input type="Button" value="Cancel" onClick="CancelClicked">
    <input type="hidden" name="ButtonClicked">
</BODY>

これは、3 つのオプション ボタンを表示する HTML ファイルです。このボタンを表示するのが、次の HTML タグです。

<input type="radio" name="UserOption">Option 1<BR>
<input type="radio" name="UserOption">Option 2<BR>
<input type="radio" name="UserOption">Option 3<P>

ご参考までに、オプション ボタンを選んだ理由は、柔軟性が高いからという単純なものです (クリックするボタンをたくさん追加するよりも、オプション ボタンを追加する方が、ユーザー インターフェイスがすっきりします)。必要なオプションは 2 つだけかもしれませんが、問題ありません。その場合は、3 つ目のオプション ボタンのタグ (Option 3 というラベル テキストを使用しているもの) を削除するだけです。オプションが 4 つ必要な場合も問題ありません。その場合は、Option 3 のタグをコピーしてリストの最後に貼り付けて、ラベル テキストを Option 4 にします。やってみれば結構簡単ですよね。

: HTML に慣れていなければ、この作業は、それほど簡単ではないかもしれません。その場合は、HTA Developers Center で HTML の概要を学習することをお勧めします。

オプション ボタン以外にも、[OK] と [Cancel] という 2 つの一般的なボタンも配置しました。

<input type="Button" value="OK" onClick="OKClicked">
<input type="Button" value="Cancel" onClick="CancelClicked">

ご覧のように、[OK] ボタンがクリックされると OKClicked という名前のサブルーチンを実行し、[Cancel] ボタンがクリックされると CancelClicked という名前のサブルーチンを実行します。心配は無用です。この 2 つのサブルーチンの説明はすぐに終わります。

けれども、その前に、次のコードについて説明する必要があります (それにしても今日のコラムは寄り道だらけですね)。

<input type="hidden" name="ButtonClicked">

ここでは、HTML ページに非表示のコントロールを追加しています。このコントロールは画面上では表示されませんが、値を代入することはできます。なぜ、このページで非表示のコントロールが必要なのでしょうか。厳密には、必要ありません。この問題は、別の方法で解決することも可能です。ただ、非表示のコントロールを使用すると、このタスク全体の遂行が大幅に簡略化されます。ここでは、非表示のコントロールには値を設定していません。後でご説明しますが、スクリプトでは、この非表示のコントロールの値を定期的に確認します。このコントロールに値が代入されると、ダイアログ ボックスでオプションが選択されたことがスクリプトに伝わり、選択されたオプションに応じて処理が行われます。

これについても、後でご説明します。

このダイアログ ボックスを画面上に表示するスクリプトをユーザーが実行し、ユーザーが任意のオプション ボタンを選択して、[OK] をクリックしたとします。するとどうなるのでしょうか。

既に説明したとおり、[OK] ボタンがクリックされると、OKClicked サブルーチンが実行されます。このサブルーチンでは、選択されたオプション ボタン (HTML 用語で言い換えれば、チェックされたボタン) を特定する一連の If Then ステートメントが実行されます。

If UserOption(0).Checked Then
    ButtonClicked.Value = "Option 1"
End If

このコードのしくみを不思議に思っていらっしゃる方のためにご説明しますと、ここでは同じ名前のオプション ボタンを使用しています。そのため、すべてのオプション ボタンを 1 つのグループとして扱えるのです。また、グループに含まれる各ラジオ ボタンには、自動的にインデックス番号が割り当てられます。グループの最初のボタンは 0、2 番目のボタンは 1、のようにインデックス番号が割り当てられます。ここまでにやったことをまとめると、次のようになります。最初のボタンがチェックされた場合は、非表示のコントロール (ButtonClicked) に Option 1 という値を代入し、各オプションについて、同じコードを繰り返し実行します。

では、ユーザーが [Cancel] ボタンをクリックした場合はどうなるのでしょう。その場合は、別のサブルーチン (CancelClicked) を実行して、 非表示のコントロールには Cancelled という値を代入します。

Sub CancelClicked
    ButtonClicked.Value = "Cancelled"
End Sub

HTML ファイルについての処理は基本的にこれで終わりです。さて、お待たせしました。いよいよスクリプトの説明に移ります。まず、InternetExplorer.Application オブジェクトのインスタンスを作成します。

Set objExplorer = CreateObject("InternetExplorer.Application")

Internet Explorer のインスタンスを作成したら、Navigate メソッドを使用して C:\Scripts\Test.htm ファイルを開きます。Internet Explorer ウィンドウのサイズを構成して (ここではツール バーとステータス バーは非表示にします)、画面に表示されるものについては Visible プロパティの値を 1 に設定します。

objExplorer.Navigate "file:///c:\scripts\test.htm"
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width = 400
objExplorer.Height = 250
objExplorer.Visible = 1

ここで、やっと本来の処理の説明に入れます。まず、ユーザーが HTML ファイル上でオプションを選択するまでスクリプトが一時停止するようにする必要があります。その点に留意しながら、次のコード行を使って ButtonClicked コントロールの値を定期的に確認します。

Do While (objExplorer.Document.All.ButtonClicked.Value = "")
    Wscript.Sleep 250
Loop

ButtonClicked コントロールに値が設定されていない場合 (つまり、値が "" という空の文字列である場合) は、単純にスクリプトを 250 ミリ秒間停止して、再試行します。この処理は、ユーザーが [OK] ボタンか [Cancel] ボタンをクリックするまで続行します。

: ユーザーが何もせずに Internet Explorer ウィンドウを閉じた場合はどうなるのでしょう。この場合はエラーが生成され、スクリプトは停止します。スクリプトをもう少し上品に終了させるには、そのような条件に対応して実行するエラー処理を追加できます。ただし、それは今日の作業範囲を超えてるので、説明は割愛します。

ButtonClicked コントロールの値が変更されると、その値を strSelection という名前の変数に格納し、Quit メソッドを呼び出して、Internet Explorer のインスタンスを終了します。

strSelection = objExplorer.Document.All.ButtonClicked.Value

objExplorer.Quit

その後、(Internet Explorer を終了するための時間として) 250 ミリ秒間停止して、次の Select Case ブロックを使用して、ユーザーが選択したオプションに基づいて処理を実行します。

Select Case strSelection
    Case "Option 1" 
        Wscript.Echo "You selected Option 1."
    Case "Option 2" 
        Wscript.Echo "You selected Option 2."
    Case "Option 3" 
        Wscript.Echo "You selected Option 3."
    Case "Cancelled"
        Wscript.Quit
End Select

これは、わくわくするような処理ではありませんが、この処理は、もちろんお好みのコードに差し替えていただいてかまいません。

おわかりいただけたでしょうか、AM さん。少し回り道もしましたし、本物のカスタム ダイアログ ボックスを作成した場合より洗練されたものではありません。でも、機能します。

とにかく、Scripting Guy の息子が、またダブルヘッダーの試合をするので、これから Stanwood 高校に向います。Scripting House は、もの静かな夜を迎えることになるのでしょうか。結果はすぐにわかることでしょう。

それから、編集者のチームに雪辱を晴らす機会があるかどうかという話は、ここではしないことにします。時には、天上の存在の力が及ばないこともありますから。


ページのトップへページのトップへ