Hey, Scripting Guy!

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

Hey, Scripting Guy!

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

詳細情報

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

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

Hey, Scripting Guy! ダウンロード

Spacer

*

HTA で自動更新テキスト ボックスを作成する方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。3 つのテキスト ボックスを使用している HTA があります。1 つ目のテキスト ボックスには名を、2 つ目のテキスト ボックスには姓を入力しますが、3 つ目のテキスト ボックスは、他のテキスト ボックスに入力された値に基づいて自動的に更新したいと思っています。たとえば、1 つ目のテキスト ボックスに「Ken」と入力したら、3 つ目のテキスト ボックスに Ken と表示し、2 つ目のテキスト ボックスに「Myer」と入力したら、3 つ目のテキスト ボックスに Ken Myer と表示されるようにする必要があります。このスクリプトを記述する方法を教えてください。

-- MH

SpacerHey, Scripting Guy! AnswerScript Center

MH さん、こんにちは。私たち Scripting Guys に最もよく寄せられる質問は「バルセロナの初期の歴史について少し教えてくれませんか」という内容のものです。しかし、残念ながら、私たちの答えは、ずっと前から変わらず「申し訳ありませんが、バルセロナの初期の歴史については、たいしたことをお伝えできません」というものです。この質問については前から気になっていたので、よく考えた結果、私たちの予算の大半を使って (TechEd IT Forum に参加するという名目で) スペインに行き、バルセロナの歴史について少しばかり調べることにしました。

何ですって。本を読んだり、インターネットで調べたりすればいいんじゃないか、ですって。なるほど。それは思い付きませんでした。まだ、旅行代金の払い戻しは受け付けてもらえるでしょうか。

とにかく、バルセロナの初期の歴史について知りたいと思っていた方のためにご説明しましょう。バルセロナは紀元前 3 世紀にローマ人によって建設されました (Hercules 自身が建設したという説もあります)。しかし、9 世紀の終わりごろに Wilfred the Hairy がいくつかの近隣諸国を占拠してカタロニア王国を設立するまで、バルセロナは有名ではありませんでした。

: なぜ Wilfred the Hairy と呼ばれていたのでしょうか。ある言い伝えによると、Wilfred の体毛は、普通なら毛が生えない場所にも生えていたそうです。どこに毛が生えていたのか、ですって。それについては言い伝えでは触れられていませんし、それについてはたずねていない、というのが正直なところです。

とにかく、Wilfred the Hairy が戦場で命を落とすという出来事以来、バルセロナでは興味深いことがほとんど何も起きていません。少なくとも Scripting Guys が現れて、HTML アプリケーション (HTA) のテキスト ボックスを自動更新できる次のようなスクリプトを記述するまでは、ということですが。

<html> 
<head> 
    <title>Self-Updating Text Box</title> 
</head> 
 
<SCRIPT Language="VBScript"> 
    Sub SetFullName 
        CombinedName.Value = FirstName.Value & " " & LastName.Value 
     End Sub 
</SCRIPT> 
 
<body> 
    <input type="text" name="FirstName" size="25" onChange="SetFullName"> 
    <input type="text" name="LastName" size="25" onChange="SetFullName"> 
    <input type="text" name="CombinedName" size="51" readOnly=True> 
</body>

では、このスクリプトが機能するしくみをご説明しましょう。ほとんどの HTA と同様、基本的には、<BODY> と <SCRIPT> という 2 つのセクションがあります。<BODY> セクションは、すべてのコントロールを配置する場所で、<SCRIPT> セクションは、ご想像のとおり、すべてのスクリプトを配置する場所です。ここではデモンストレーションを目的としているので、<BODY> セクションの内容は非常にコンパクトです。このセクションは 3 つのテキスト ボックスで構成されていて、各テキスト ボックスには FirstName、LastName、および CombinedName という名前が付いています (スクリプトのおとぎ話のようですよね)。

<input type="text" name="FirstName" size="25" onChange="SetFullName"> 
<input type="text" name="LastName" size="25" onChange="SetFullName"> 
<input type="text" name="CombinedName" size="51" readOnly=True>

ご覧のとおり、最初の 2 つのテキスト ボックス (FirstName と LastName) の HTML タグはよく似ています。type="text" パラメータが設定された <input> タグがあります。このパラメータは、テキスト ボックスを他の入力コントロール (ボタン、チェック ボックス、オプション ボタンなど) と区別するためのものです。また、name パラメータ (と、このテキスト ボックスに付けられた一意な名前) と size パラメータ (これは単にテキスト ボックスの幅を指定するもので、ここでは 25 文字を指定しています) も設定されています。

さらに、onChange="SetFullName" というパラメータもあります。このパラメータは、自動更新テキスト ボックスが正しく動作するのに必要です。1 つ目または 2 つ目のテキスト ボックスのどちらかの値が変更されると、onChange イベントが発生します (厳密には、このイベントは、テキスト ボックスに変更が加えられ、テキスト ボックスからフォーカスが移動した後に発生します)。HTA の 1 つ目と 2 つ目のテキスト ボックスの onChange イベントが発生したときに必ず行われる処理は、どのような処理かというと、お察しのとおり、SetFullName サブルーチンの実行です。

お気付きかもしれませんが、3 つ目のテキスト ボックス CombinedName には、onChange イベントは設定されていません。その理由は、このテキスト ボックスは他の 2 つのテキスト ボックスに入力された値に基づいて自動的に更新されるもので、このテキスト ボックスに、だれかが値を入力することはないからです。実を言うと、このテキスト ボックスには、readOnly=True パラメータを設定して、値が入力できないようになっています。このパラメータによってテキスト ボックスが読み取り専用になるかどうかを当ててみてください。

ええ、おっしゃるとおり、読み取り専用になります。

まぐれ当たりですね。

<BODY> セクションの説明については、これくらいにしておきましょう。<SCRIPT> セクションには、1 つのサブルーチン (SetFullName) が配置されていて、このサブルーチンには次の 1 行のコードが含まれています。

CombinedName.Value = Trim(FirstName.Value & " " & LastName.Value)

ここでは、3 つ目のテキスト ボックス (CombinedName) の Value プロパティに値を代入しているだけです。Value プロパティにどのような値を代入しているのか、ですって。ここでは、"1 つ目のテキスト ボックス (FirstName) の Value プロパティの値 + 1 つの空白スペース + 2 つ目のテキスト ボックス (LastName) の Value プロパティの値" を代入しています。それから、Trim 関数を使って、この値の先頭または末尾にある余分な空白スペースを削除しています。

このように処理するとどうなるでしょう。たとえば、最初のテキスト ボックスに「Ken」と入力したとします。このテキスト ボックスからフォーカスが移動すると (たとえば、Tab キーを押したり、このテキスト ボックス以外の場所をクリックすると)、onChange イベントが発生し、3 つ目のテキスト ボックスに次の値が設定されます。

Ken

Ken という値が設定されるのは、その値が、"1 つ目のテキスト ボックスの Value プロパティの値 + 1 つの空白スペース + 2 つ目のテキスト ボックスの Value プロパティの値 (現在は何も入力されていません)" だからです。しかし、Ken_ のように、空白スペースがあることを表すアンダースコアを追加必要はないのか、ですって。Trim 関数を使用して先頭または末尾にある空白スペースを削除していなければ、そうすべきでしょうね。

ここで、2 つ目のテキスト ボックスに「Myer」と入力したとします。3 つ目のテキスト ボックスにどのような値が表示されるか当ててみてください。

また、まぐれ当たりですね。それとも、もうこのしくみを理解されたということでしょうか。どちらにしても、3 つ目のテキスト ボックスには次の値が表示されます。

Ken Myer

1 つ目のテキスト ボックスの値を「Kenneth」に変更すると、3 つ目のテキスト ボックスの値は自動で次の値に再設定されます。

Kenneth Myer

他の値を入力しても、同じような結果になります。

ところで、Wilfred the Hairy はカタロニアの最初の指導者でしたが、その王位は彼の息子が継承しました。このように代々称号を継承していくことは、お世辞抜きに興味深いことです。たとえば、このコラムを執筆している Scripting Guy の息子が肩書きとこのコラムを継承するということになるでしょうか。

いいえ、そのようなことはないでしょう。何しろ、このコラムを執筆している Scripting Guy は自分の息子を大事にしていますから。


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