Hey, Scripting Guy!花が咲き、ダイアログが開き、春が来た

Microsoft Scripting Guys

春が来ました。 かつてないほどの喜びです。記録的な雨量、アイス ストーム、雪嵐、暴風雨に見舞われた冬を経て、ついに春がやってきました (ある嵐では、大木が Scripting Guys の 1 人の裏庭に倒れ込みました。ぎりぎりのところで家屋に被害はありませんでしたが、Scripting Dog はソファーの後ろに逃げ込みました)。今は、ひんやりとした雨を楽しんでいます。これが過ぎると、夏の太平洋岸北西地区の温かい雨に変わります。

外の小雨を眺めているとき、スクリプトでちょっとした冒険をして、HTML アプリケーション (HTA) を見てみるいい機会だと思いました。冒険というからには、そのとおり本気で冒険します。ここでは初歩的な説明はしません。読者が HTA とは何かや、HTA の作成方法を既に理解していることを前提にします。このような知識をお持ちでなければ、スクリプト センターの HTA Developers Center を参照してください。特に、「初心者向け HTA」の 2 つの記事を一読することをお勧めします。それさえ済めば、必要な知識が揃い、この記事をお読みいただけます。

今回のコラムでは、ダイアログ ボックスの作成方法を説明します。さらに、メインの HTA とダイアログ ボックス間で情報をやりとりする方法についても説明します。本当に春のすがすがしい空気の中で、野心的になっていますね。今のうちに楽しんでおきましょう。

ご存じかもしれませんが、ダイアログ ボックスには 2 種類あります。モーダルとモードレスです。違いは、モーダル ダイアログ ボックスを開くと、そのダイアログ ボックスを閉じるまで、ダイアログ ボックスを開いたメイン ウィンドウに戻ることができません。モードレス ダイアログ ボックスを開いた場合は、ウィンドウ間を移動できます。ただし、メイン ウィンドウを閉じると、モードレス ダイアログ ボックスも閉じられます。

モーダル ダイアログ ボックスとモードレス ダイアログ ボックスの作成方法はまったく同じです。唯一の違いは、モーダル ダイアログ ボックスを作成する場合は ShowModalDialog 関数を呼び出し、モードレス ダイアログ ボックスを作成する場合は ShowModelessDialog 関数を呼び出すことだけです。どちらの関数も、同じパラメータを受け取ります。まず、モーダル ダイアログ ボックスを開く簡単な HTA を見てみましょう (図 1 参照)。

Figure 1 出発点となる簡単なダイアログ

<html> 
<head> 
<title>Modal Example</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”MainModal”>
</head>

<script language=”VBScript”> 
Sub ShowDialog 
 intReturn = _
    ShowModalDialog(“modaldialog.hta”) 
 textbox.Value = intReturn
End Sub
</script> 

<body> 
<button onclick=”ShowDialog”>
 Show Dialog Box</button> <p>
<input type=”text” name=”textbox”>
</body> 
</html>

ここでは、"Modal Example" という名前の HTA を作成しました。HTA の <body> 領域には、2 つの要素を追加しています。"Show Dialog Box" というラベルのボタンと、textbox という名前のテキスト ボックスです。これらについては、図 2 を参照してください。ボタンをクリックすると、ShowDialog サブルーチンが実行されます。

図 2 実際の HTA モーダル ダイアログ

図 2** 実際の HTA モーダル ダイアログ **

ShowDialog サブルーチンは、実に単純です。ShowModalDialog 関数を呼び出し、モーダル ダイアログ ボックスとして表示する HTA ファイル名 (ここでは modaldialog.hta) をパラメータとして渡しています (modaldialog.hta は、この HTA と同じフォルダにあると仮定しています。違う場合は、ここに完全なファイル パスを含める必要があります)。

また、ShowModalDialog からの戻り値 (intReturn) をキャプチャしています。この値をテキスト ボックスに表示します。この戻り値を取得する方法については、この後すぐに説明します。重要な点は、モーダル ダイアログ ボックスが閉じられるまで、ShowModalDialog への呼び出しから戻らないことです。つまり、ダイアログ ボックスが閉じられないと、戻り値がテキスト ボックスに割り当てられません。

では、modaldialog.hta を見てみましょう。これは、呼び出し元の HTA によって開かれるダイアログ ボックスです (図 3 参照)。この HTA では、2 つの要素を作成しました。listbox という名前のリスト ボックスと、"OK" というラベルのボタンです (図 4 参照)。リスト ボックスには、"Option 1"、"Option 2" のようにラベルを付けた項目を 4 項目追加し、項目ごとに対応する値 (1 ~ 4) を関連付けました。[OK] ボタンをクリックすると、CloseWindow サブルーチンが実行されます。

Figure 3 modaldialog.hta

<html> 
<head> 
<title>Modal Dialog Box</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”ModalDialog”>
</head>

<script language=”VBScript”> 
Sub CloseWindow
  window.returnValue = listbox.Value
  window.Close 
End Sub
</script> 

<body> 
<select size=”3” name=”listbox”>
 <option value=”1”>Option 1</option>
 <option value=”2”>Option 2</option>
 <option value=”3”>Option 3</option>
 <option value=”4”>Option 4</option>
</select>
<p>
<input type=”button” id=”idBtn” value=”OK” onclick=”CloseWindow”> 
</body> 
</html>

図 4 モーダル ダイアログ ボックスを表す HTA

図 4** モーダル ダイアログ ボックスを表す HTA **

CloseWindow サブルーチンも、実に単純です。まず、選択されたリスト ボックス内の項目の値を読み取り、この値を window.returnValue プロパティに割り当てています。たとえば、ユーザー が [Option 2] を選択すると、値 2 が window.returnValue に割り当てられます。その後、window.Close メソッドを呼び出して、ダイアログ ボックスを閉じます。

この時点で、制御がメインの HTA に戻ります。ShowModalDialog への呼び出しを再度見てみましょう。

intReturn = _
  ShowModalDialog(“modaldialog.hta”) 

intReturn に割り当てられる戻り値は、ダイアログ ボックス HTA で window.returnValue に割り当てた値です。したがって、ダイアログ ボックスで [Option 2] を選択すると、値 2 が window.returnValue に割り当てられるため、intReturn は 2 になり、その後のコードによってこの値がテキスト ボックスに表示されます。

textbox.Value = intReturn

ダイアログ ボックスから値を取得する方法を説明したので、次はダイアログ ボックスに値を渡す方法について説明します。今度は、モードレス ダイアログ ボックス (図 5 参照) を使用しますが、モーダルでもモードレスでも機能は同じなので、モーダル ダイアログ ボックスでも同じプロセスを使用します。

Figure 5 モードレスに挑戦

<html>
<head>
<title>Modeless Example</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”ModelessMain”>
</head>

<script language=”VBScript”>
Sub ShowDialog
  intReturn = _
    window.ShowModelessDialog _
    (“modelessdialog.hta”, _
    lstServers.Value, _
    “dialogHeight:400px;dialogWidth:300px”)
End Sub
</script>

<body>
<select size=”1” name=”lstServers”>
 <option value=”server1”>Server1</option>
 <option value=”server2”>Server2</option>
 <option value=”server3”>Server3</option>
 <option value=”server4”>Server4</option>
</select>
<p>
<input type=”button” value=”Retrieve Processes” onclick=”ShowDialog”>
</body>
</html>

図 7 モードレス ダイアログに渡されるデータ

図 7** モードレス ダイアログに渡されるデータ **

ここでは、lstServers という名前のドロップダウン リスト ボックスを作成しています (サイズが 1 なのでドロップダウンであることがわかります)。また、"Retrieve Processe" というラベルのボタンもあります。このボタンをクリックすると、ShowDialog サブルーチンが実行されます。ShowDialog サブルーチンは、以下に示すように、window.ShowModelessDialog 関数への呼び出しの 1 行のみです。

intReturn = _
  window.ShowModelessDialog _
  (“modelessdialog.hta”, _
  lstServers.Value, _
  “dialogHeight:400px;dialogWidth:300px”)

この関数に渡す最初のパラメータは、ダイアログ ボックスで実行する HTA の名前であり、ここでは modelessdialog.hta です。2 番目のパラメータは、リスト ボックスの Value プロパティです。もうおわかりのように、Value プロパティには、リスト ボックス内で選択した値が保持されます。したがって、ユーザーがリストボックスから [Server2] を選択すると、Value は "server2" になります。このパラメータは、ダイアログ ボックスにどのように情報を渡すかを示しています (複数の値を渡す場合は、配列またはコレクションとしてこのパラメータに渡すことができます)。

ダイアログ ボックスがこのパラメータ値をどのように受け取るかについては、すぐに説明します。しかし、まず、3 番目のパラメータを用意していることに注目してください。

“dialogHeight:400px;dialogWidth:300px”

このパラメータは、ダイアログ ボックスの高さと幅を指定する文字列を保持します。この場合は、高さを 400 ピクセル (400px)、幅を 300 ピクセルに指定しています。モーダルの例で説明したように、このパラメータは空のままにすることもでき、その場合はコンピュータの既定のサイズでダイアログ ボックスが表示されます。

では、modelessdialog.hta (図 6) に移り、このダイアログ ボックスが、渡された値をどのように読み取るかを見てみましょう。

Figure 6 modelessdialog.hta

<html>
<head>
<title>Modeless Dialog</title>
<HTA:APPLICATION 
  APPLICATIONNAME=”Processes”>
</head>

<script language=”VBScript”>
Sub window_onLoad
  strComputer = window.dialogArguments
  Set objWMIService = GetObject(“winmgmts:” _
    & “{impersonationLevel=impersonate}!\\” _
    & strComputer & “\root\cimv2”)
  Set colProcesses = objWMIService.ExecQuery   _
    (“Select * from Win32_Process”)

  strHTML = “<h1>” & strComputer & “</h1><p>”
  For Each objProcess in colProcesses
    strHTML = strHTML & objProcess.Name & _
       “<br>”
  Next

  DataArea.InnerHTML = strHTML
End Sub
</script>

<body>
<span id=”DataArea”></span>
</body>
</html>

この HTA で指定している唯一の要素はスパンであり、これはダイアログ ボックスの全領域を保持します。ここでのスクリプト セクションでは、window_onLoad サブルーチンを定義しています。このサブルーチンは、(ここでは ShowModelessDialog への呼び出しにより) HTA が開かれるとすぐに実行されます。このサブルーチンの 1 行目を見てください。

strComputer = window.dialogArguments

変数 strComputer にプロパティ window.dialogArguments の内容を代入しています。さて、このプロパティは何だと思いますか。ほら、読者の皆さんも春と共にお目覚めのようですね。そうです、これは ShowModelessDialog への呼び出しの 2 番目のパラメータに渡された値です。メイン ウィンドウで [Server2] が選択されると、値 "server2" が strComputer に保持されます。

このサブルーチンの残りの部分では、単に strComputer からすべてのプロセスを取得し、これらをスパン領域に表示しています。この操作の結果は図 7 のようになります。

これでめでたく、この夏は HTA ダイアログ ボックスで遊べるようになりました。といっても、もちろん、南半球にお住まいでなければの話ですが。南半球では冬が近づいていますね。こちらでこの冬経験したように、停電が多発するようなことになれば、冬場は大変な思いをされるかもしれません。

Microsoft Scripting Guysマイクロソフトの仕事をしています、というよりもマイクロソフトにより雇われています。野球をプレイしたり監督したり観戦したり (または他のさまざまな活動を) しているのでない限り、彼らは TechNet スクリプト センターを運営しています。詳細については、https://www.microsoft.com/japan/technet/scriptcenter/default.mspx を参照してください。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.