(57)【特許請求の範囲】
【請求項１】
複数のウィンドウ・コントロールを有するウィンドウ・オブジェクトがウィンドウ上において受け取る少なくとも１つのイベントのうちの各イベントを処理するシステムであって、
複数のコントロール・エンハンサ・オブジェクトであって、前記複数のコントロール・エンハンサ・オブジェクトの各コントロール・エンハンサ・オブジェクトが、前記複数のウィンドウ・コントロールのうちの特定のウィンドウ・コントロールに対するインタフェースを用意する、前記複数のコントロール・エンハンサ・オブジェクトと、
前記コントロール・エンハンサ・オブジェクト及び当該コントロール・エンハンサ・オブジェクトに影響を与えるイベントを登録するためのコントロール・エンハンサ・リストと
を備えており、
前記複数のウィンドウ・コントロールのうちの第１のウィンドウ・コントロールが、前記複数のウィンドウ・コントロールのうちの少なくとも１つの第２のウィンドウ・コントロールに関連しており、
前記第１のウィンドウ・コントロールについての前記コントロール・エンハンサ・オブジェクトは、
前記第２のウィンドウ・コントロールについての前記コントロール・エンハンサ・オブジェクトに対する少なくとも１つのポインタと、
前記コントロール・エンハンサ・リストを使用して、前記第１のウィンドウ・コントロールについての前記コントロール・エンハンサ・オブジェクトにおけるアクションが前記第２のウィンドウ・コントロールについての前記コントロール・エンハンサ・オブジェクトに影響を与えるかどうかを判断するための少なくとも１つの手段と、
前記第２のウィンドウ・コントロールについての前記コントロール・エンハンサ・オブジェクトと通信するための手段と
をさらに備えている、
前記システム。
【請求項２】
前記ウィンドウ上でイベントを受け取ることに応じて、前記コントロール・エンハンサ・リストをアクセスし、当該イベントを処理するコントロール・エンハンサ・オブジェクトがあるかどうかを判断し、
前記イベントを処理するコントロール・エンハンサ・オブジェクトがある場合に、前記イベントを処理するコントロール・エンハンサ・オブジェクトに前記イベントを渡し、当該イベントを渡されたコントロール・エンハンサ・オブジェクトによって、前記渡されたイベントに関連付けられたアクションが実行される、請求項１に記載のシステム。
【請求項３】
前記複数のコントロール・エンハンサ・オブジェクトの各コントロール・エンハンサ・オブジェクトが、少なくとも１つのデータ記憶ハンドラ・オブジェクト、少なくとも１つのデータ・イニシャライザ・オブジェクト、又は少なくとも１つのデータ・ファイナライザ・オブジェクトのいずれか１つを少なくとも含む、請求項１に記載のシステム。
【請求項４】
前記複数のコントロール・エンハンサ・オブジェクトのうちの少なくとも１つのコントロール・エンハンサ・オブジェクトが、前記コントロール・エンハンサ・オブジェクトに関係するデータに加えられるべき制限を判断するための手段をさらに含む、請求項１又は２に記載のシステム。
【請求項５】
前記複数のコントロール・エンハンサ・オブジェクトのうちの少なくとも１つのコントロール・エンハンサ・オブジェクトが、データ・ファイナライザ・オブジェクトにおいてデータを検証するための手段をさらに含む、請求項３に記載のシステム。
【請求項６】
前記複数のコントロール・エンハンサ・オブジェクトのうちの少なくとも１つのコントロール・エンハンサ・オブジェクトが、前記少なくとも１つのコントロール・エンハンサ・オブジェクトの前記ウィンドウ・コントロールに関係するデータを識別するための手段をさらに含む、請求項１〜５のいずれか１項に記載のシステム。
【請求項７】
前記複数のウィンドウ・コントロールのうちの少なくとも１つの第２のウィンドウ・コントロールに関連がコントロール関係データとして保持され、該コントロール関係データには、少なくとも１以上の規則オブジェクトが関連付けられており、及び該規則オブジェクトには、少なくとも１以上のアクションが関連付けられている、請求項１〜６のいずれか１項に記載のシステム。
【請求項８】
複数のウィンドウ・コントロールを有するウィンドウ・オブジェクトがウィンドウ上において受け取る少なくとも１つのイベントのうちの各イベントを処理する方法において、複数のコントロール・エンハンサ・オブジェクトの各コントロール・エンハンサ・オブジェクトが、前記複数のウィンドウ・オブジェクトのうちの特定のウィンドウ・コントロールに対するインタフェースを用意し、前記方法が、
前記ウィンドウ上でイベントを受け取るステップと、
前記コントロール・エンハンサ・オブジェクト及び当該コントロール・エンハンサ・オブジェクトに影響を与えるイベントを登録するためのコントロール・エンハンサ・リストをアクセスし、当該イベントを処理するコントロール・エンハンサ・オブジェクトを決定するステップと、
前記イベントを処理するコントロール・エンハンサ・オブジェクトがある場合に、前記イベントを処理するコントロール・エンハンサ・オブジェクトに前記イベントを渡すステップと、
前記イベントを渡されたコントロール・エンハンサ・オブジェクトにおいて前記渡されたイベントに関連付けられたアクションを実行するステップと
を含み、
前記受け取られたイベントは表示イベント、保管イベント又は初期設定イベントであり、
前記実行するステップは、
前記コントロール・エンハンサ・リストを使用して、前記表示イベント、前記保管イベント又は前記初期設定イベントが、前記ウィンドウ・コントロール同士の関係のうちの少なくとも１つの関係に影響を与えるかどうか判断するステップと、
前記影響を与えると判断された少なくとも１つの関係についての少なくとも１つのルールが真であるかどうか評価するステップと、
前記少なくとも１つのルールが真である場合に、前記表示イベント、前記保管イベント又は前記初期設定イベントに関連付けられた少なくとも１つのアクションを実行するステップと
をさらに含む
前記方法。
【請求項９】
前記コントロール・エンハンサ・オブジェクトを決定するステップが、
前記コントロール・エンハンサ・リストにアクセスするステップと、
前記受け取られたイベントを前記コントロール・エンハンサ・リストと比較するステップと、
前記比較に基づいて、前記イベントを処理するコントロール・エンハンサ・オブジェクトを決定するステップと
を含む、請求項８に記載の方法。
【請求項１０】
ウィンドウ上でのイベント処理を制御するために、グラフィカル・ユーザ・インタフェースを用意する方法であって、
前記ウィンドウについて、少なくとも１つのウィンドウ・コントロールを作成するステップと、
コントロール・エンハンサ・オブジェクトに、前記複数のウィンドウ・コントロールのうちの特定のウィンドウ・コントロールに対するインタフェースを用意するステップと、
前記コントロール・エンハンサ・オブジェクト及び当該コントロール・エンハンサ・オブジェクトに影響を与えるイベントを登録するためのコントロール・エンハンサ・リストに、前記コントロール・エンハンサ・オブジェクトを加えるステップと、
前記コントロール・エンハンサ・リストを使用して、前記複数のウィンドウ・コントロールのうちの第１のウィンドウ・コントロールが、前記複数のウィンドウ・コントロールのうちの少なくとも１つの第２のウィンドウ・コントロールに関連しているかどうかを判断するステップと、
前記関連している場合に、当該関連についてのコントロール関係データを前記コントロール・エンハンサ・オブジェクトに関連付けるステップと、
前記コントロール関係データを関連付けられたコントロール・エンハンサ・オブジェクトと、当該コントロール関係データを関連付けられたコントロール・エンハンサ・オブジェクトに影響されるコントロール・エンハンサ・オブジェクトとの両方を指すポインタを設定するステップと
を含む、前記方法。
【請求項１１】
前記関連している場合に、
特別なデータ処理が必要か否かを判断するステップと、
特別な処理が必要な場合に、少なくとも１つのデータ・ハンドラを前記コントロール・エンハンサ・オブジェクトに関連付けるステップと
をさらに含む、請求項１０に記載の方法。
【請求項１２】
前記関連している場合に、
特別な初期設定が必要か否かを判断するステップと、
特別な初期設定が必要な場合に、少なくとも１つのデータ・イニシャライザを前記コントロール・エンハンサ・オブジェクトに関連付けるステップと
をさらに含む、請求項１０又は１１に記載の方法。
【請求項１３】
前記関連している場合に、
特別なデータ終結処理が必要か否かを判断するステップと、
特別な終結処理が必要な場合に、少なくとも１つのデータ・ファイナライザを前記コントロール・エンハンサ・オブジェクトに関連付けるステップと
をさらに含む、請求項１０〜１２のいずれか１項に記載の方法。
【請求項１４】
前記コントロール関係データについての少なくとも１つの規則オブジェクトを当該コントロール関係データに関連付けるステップをさらに含む、請求項１０に記載の方法。
【請求項１５】
前記関連付けられた規則オブジェクトについての少なくとも１つのアクションを当該規則オブジェクトに関連付けるステップをさらに含む、請求項１４に記載の方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータ／ユーザ間の対話に関し、より詳細には、モデル・ビュー・コントローラ設計を改良するグラフィカル・ユーザ・インタフェースに関する。
【０００２】
【従来の技術】
オブジェクト指向環境におけるグラフィカル・ユーザ・インタフェース（ＧＵＩ）の開発では、コントロールを実施するための様々な方法が開発されている。米国特許第５５５５３６５号では、グラフィカル・ユーザ・インタフェース（以下、ＧＵＩと呼ぶ）オブジェクトとアプリケーション・オブジェクトとの関係を指定するテーブルが作成される。この手法では、プログラマは、表示する各ウィンドウ上の各コントロールのすべてのコードの作成、データの形式設定、検証、保管、および制御関係の管理を行うことができる。このような手法は、プログラマ時間、空間、および動作時間の点から見て、特に、コントロールの多くを異なるアプリケーションに「再使用」可能であるかという観点から見て非効率的である。
【０００３】
Ｃ＋＋プログラマは、コンパイラやＧＵＩ開発ツールキットまたはフレームワークを使用して、組み込まれたコントロールを表すクラスのセットをサブクラス化する。既存のコントロール・クラスのセットを特殊目的のためにサブクラス化することは、オブジェクト指向グラフィカル環境で専用コントロールを作成するための標準的慣行である。たとえば、プログラマは、データベースのデータの読み書きを行うリスト・ボックスのサブクラスを作成し、そのデータをテーブルとの間で読み書きする、そのリスト・ボックスの別のサブクラスを作成する。この例では、テーブルからデータを読み取った後で選択した項目をデータベースに書き込むリスト・ボックスが必要な場合、４番目のサブクラスを作成しなければならない。さらに、この４番目のリスト・ボックスとウィンドウ上の他のコントロールとの関係を管理するウィンドウ・コードを作成しなければならない。たとえば、ユーザが月名のリストから「４月」という項目を選択する場合、その月の日数を表示する画面上の別のコントロールを「３０」に変更しなければならない。
【０００４】
このサブクラス化方法には次の２つの重大な欠点がある。（１）大規模なアプリケーションでは、サブクラスの数が膨大になり、長い開発時間と、コントロール間の関係を管理するために作成しなければならない大量のコードを必要とし、（２）コントロールをサブクラス化すると、ある種のテスト・ツールの使用が妨げられる。また、サブクラス化によって、同じコントロールから多数のクラスがサブクラス化される可能性があり、その結果、ミックス・アンド・マッチ機能を持つクラスが少なくなる。プログラムによっては、追加コーディングしなくても、クラスが必要なすべての処理を行うという意味で、「完全機能」コントロールを備えるものもあるが、そのようなコードはあらゆるプログラミング課題に適用可能であることはほとんどなく、直接にはカスタマイズすることができない。
【０００５】
【発明が解決しようとする課題】
それぞれのネイティブ・クラスにコントロールを残しておくことができ、しかも構築ブロックのセットを使用してコントロールに機能を加えることができ、それによってコントロール機能ごとに特別なコードを書くのに要する時間よりも短時間でＧＵＩアプリケーションが作成されるようにするシステムおよび方法が望ましい。このような新規なシステムおよび方法を使用することによって、プログラマは、所与のアプリケーションの特別な必要に特別に合わせた再使用可能ツールのセットを開発することができる。既存のコントロールも、ネイティブであるかコンパイラ・ベンダまたは第三者によって強化されたものであるかを問わず、設計に関与することができる。
【０００６】
【課題を解決するための手段】
コンパイラまたはＧＵＩツールキットによるＧＵＩコントロール・クラス（ボタン、リスト、ボックス、編集コントロールなど）のサブクラス化が十分でないオブジェクト指向環境における迅速なグラフィカル・ユーザ・インタフェース（ＧＵＩ）開発を支援するソフトウェア・アプリケーション・システムおよび方法を開示する。本発明は、どのようなオブジェクト指向ＧＵＩクロスプラットフォーム・アプリケーションでも使用することができる。本発明は、ネイティブ・コントロールに機能を追加する方法を提供する。これには、データまたはその他の設定値によってコントロールを初期設定する、コントロールからデータを取り出す、データを形式設定する、入力されたデータを検証する、検証済みデータをファイルまたはデータベースに記憶する、複数のコントロールを処理して単一のコントロールのイリュージョンを作成する、コントロール間の関係を設定するなどの機能が含まれるが、これらには限定されない。本発明のシステムおよび方法は、高度な機能を備えたＧＵＩウィンドウをきわめて短時間に作成するのに使用する構築ブロックのセットを含む。
【０００７】
【発明の実施の形態】
グラフィカル・ユーザ・インタフェース（以下、ＧＵＩと呼ぶ）ウィンドウ・コードは、わずかな例外を除き、イベント駆動方式で作成される。「イベント」とは、マウス・クリック、ボタン・クリック、マウスの移動、キーストローク、音声認識ハードウェアへの発話コマンド、またはユーザとプログラムの間の知覚可能な対話のいずれかの主体である。本発明は、新規なコントロール・エンハンサを特徴とし、ＧＵＩウィンドウがイベント駆動型アプリケーションとして設計されるシステムを対象とする。以下の説明では、（たとえばＷｉｎｄｏｗｓ（商標）、ＯＳ／２（商標）、またはＵＮＩＸ（商標）上の）イベント駆動型アプリケーション用に実施された本発明について詳述するが、本発明は、修正を加えずに、メニュー駆動型アプリケーション用にも実施可能であるものと企図される。本発明の基本概念は、イベントがウィンドウ上のコントロールに関係する場合、（たとえば、ウィンドウ・サイズ・イベントはそのウィンドウ・オブジェクト自体によって処理されるが、ラジオ・ボタンのマウス・クリックはラジオ・ボタン・コントロールを対象として行われるように）そのウィンドウ・オブジェクトに関連づけられたコントロール・エンハンサにイベントを渡すことである。設計自体は、任意のプラットフォーム上の任意のアプリケーションに使用可能である。この設計によって作成されたコードは、そのコードを作成したプラットフォーム上のどのＧＵＩアプリケーションにも使用することができるが、プラットフォームを変更する場合は、それらのプラットフォーム上で使用可能なネイティブ・コントロールやアプリケーションでのデータの処理方法が変わるため、わずかな修正が必要な場合がある。たとえば、データの内部表現はＧＵＩアプリケーションによって異なり、そのアプリケーション形式の読取り／書き込みを行うようにＧＵＩコントロール・エンハンサをカスタマイズする必要が生じることになる。クロスプラットフォームＧＵＩコントロール・ライブラリを使用してプラットフォーム間に一貫したインタフェースを提供すれば、プラットフォームを変更してもネイティブ・コントロールの相違によるコード変更は不要である。このライブラリは、異なるプラットフォーム上の使用可能なネイティブ・コントロールの相違を隠蔽し、その結果、プラットフォームごとに特別に作成されたコードを必要としない。
【０００８】
ＧＵＩ開発の業者には、モデル・ビュー・コントローラ（ＭＶＣ）設計は周知である。ＭＶＣ実施プログラムでは、モデルはデータを表し、ビューはデータ（たとえば、スプレッドシート、リストビュー、テーブルなど）を表示する。ＧＵＩアプリケーションでは、同じデータについていくつかのアクティブ・ビュー（たとえばスプレッドシートとグラフ）がある場合がある。ビューが、特定のモデルに関連づけられたデータの影響を受ける可能性がある場合、ビューはそのモデルに関連づけられたコントローラにビュー自体を登録する。ビューは、コントローラを介してデータの変更を要求する。すると、コントローラはモデルに対して変更を指示し、その後、データが変更されたことをすべての登録ビューに通知する。本発明のコントロール・エンハンサはＭＶＣベースのシステムで実施される。コントロール・エンハンサ設計は、コントロール・エンハンサ、データ記憶ハンドラ、データ・イニシャライザ、データ・ファイナライザ、コントロール関係、規則、およびアクションの各構成要素から成る。これらについては後で詳述し、図１に図示する。
【０００９】
図１に示すように、ウィンドウ１００上の各ＧＵＩコントロール１１１がコントロール・エンハンサ１１２に割り当てられる。コントロール・エンハンサ１１２は、コントロールの性質に関係なく、そのウィンドウ・オブジェクトのために（たとえば、テキスト入力フィールド、リスト・ボックス、コンボ・ボックスなど）ＧＵＩコントロール１１１への一貫したインタフェースを提供する。たとえば、コントロール・エンハンサがＳｅｔＤａｔａを含むインタフェースを示している場合、コントロール・エンハンサ・サブクラスはテキスト・オブジェクト、スピン・ボタン、または他の何らかのオブジェクトを管理している。外部コードは、コントロール・エンハンサのＳｅｔＤａｔａメソッドだけを知っていればよく、各コントロールごとの特定のメソッドを知っている必要がない。
【００１０】
ウィンドウのＧＵＩコントロールへのインタフェースを提供するほかに、コントロール・エンハンサは、コントロール・エンハンサの内部構成要素（すなわち、後で詳述するデータ・イニシャライザ１１３、データ・ファイナライザ１１４、データ記憶ハンドラ１１５）のためにもＧＵＩコントローラへの一貫したインタフェースを提供する。各種のコントローラ、または密接に関連したコントローラのファミリを扱うように、様々なコントロール・エンハンサが設計される。
【００１１】
各ＧＵＩウィンドウ・オブジェクトは、そのウィンドウ上のコントロールのためのコントロール・エンハンサの集合を維持する。ウィンドウ・オブジェクトは、イベントの渡し先のコントロール・エンハンサのリストを維持する。コントロール・エンハンサ・リスト１１０は、コントロール・エンハンサにイベントを渡すオブジェクトである。各コントロール・エンハンサは、インスタンス化されるとコントロール・エンハンサ・リストに登録される。各コントロール・エンハンサは、コントロール・エンハンサ・リストに登録されると、そのエンハンサに影響を与えるイベントも登録する。ウィンドウは、イベントを受け取るとそのイベントをコントロール・エンハンサ・リストに渡し、コントロール・エンハンサ・リストはそのイベントを、そのようなイベントを対象とするものとして登録されているコントロール・エンハンサにだけ渡す。各コントロール・エンハンサにデータ記憶ハンドラ１１５が割り当てられる。データ記憶ハンドラは、「保管」イベントを受け取った場合、データを記憶すべき場所を判断し、そのデータの記憶を扱う。たとえば、将来の処理のためにデータがデータベース、ＩＮＩファイル、または他の何らかの記憶場所に記憶されるとする。プログラムによってデータが記憶されるそれぞれの方法を処理するために、新しいデータ記憶ハンドラが設計される。
【００１２】
ウィンドウ・コードは、コントロール・エンハンサをインスタンス化するとき、その所望のタイプのデータ・イニシャライザ１１３もインスタンス化し、それをコントロール・エンハンサに渡す。各タイプのデータ初期化を扱うために新しいデータ・イニシャライザが設計される。たとえば、コントロールの初期データ値または設定値がテーブル、ＩＮＩファイル、またはデータベースから得られ、プログラムはそのデータを１つの形式で記憶するが、それを別の形式で表示する必要がある場合がある。データ・イニシャライザにより、扱う初期データが異なる。各データ・イニシャライザは、初期設定時に必要なデータ操作を扱う。コントロール・エンハンサは、初期設定イベントを受け取るとデータ・イニシャライザを起動する。データ・イニシャライザには、後で詳述するように、デフォルト・ファインダ１１６とリミテーション・ディレクタ１１７が関連づけられている。
【００１３】
データ記憶ハンドラによって記憶されるデータを準備するため、各コントロール・エンハンサにはデータ・ファイナライザ１１４が関連づけられている。コントロール・エンハンサは、保管イベントを受け取るとデータ記憶ハンドラに通知し、データ記憶ハンドラはデータ・ファイナライザに問い合わせてどのデータまたは設定値を記憶すべきかを判断する。プログラムが必要とする各タイプのデータ準備を扱うために、新しいデータ・ファイナライザが設計される。たとえば、プログラムは値「Ａ」を記憶する必要があるが、それを「すべての値」として表示する必要があることがある。データ・ファイナライザは、コントロールからのデータを記憶する前に行うべきデータ操作を処理する。各データ・ファイナライザには、バリデータ１１８と前述のリミテーション・ディレクタ１１７が関連づけられている。
【００１４】
ウィンドウによっては、プログラマは１つのコントロールを別のコントロールの設定に基づいて変更する必要があると判断する場合がある。したがって、コントロール・エンハンサのうちの１つ（「所有コントロール・エンハンサ」と呼ぶ）にコントロール関係１１９が割り当てられ、「影響されるコントロール・エンハンサ」を指すようにポインタが維持される。コントロール・エンハンサは、必要に応じて１組のコントロール関係を維持する。所有コントロール・エンハンサは、変更イベントを受け取ると、その関係内の影響されるコントロール・エンハンサにそのイベントを渡す。コントロール・エンハンサは、プログラマの決定に応じて複数の関係を持つことができる。
【００１５】
図２に示すように、関係には規則１２０および１２１が割り当てられ、規則にはアクション１３０、１３１などが割り当てられる。規則は、両方のコントロール（すなわち所有コントロール・エンハンサのコントロールとその関係における他方のコントロール・エンハンサのコントロール）の値を調べ、比較するオブジェクトである。比較の結果が真の場合、規則は満たされていると言える。規則が満たされている場合、アクションがトリガされる。アクションは、影響されるコントロール・エンハンサにメッセージを送り、その動作を変更させる。コントロール間で必要な比較タイプごとに規則を定義しなければならない。たとえば、「より大」という規則は、所有コントロール・エンハンサのデータが影響されるコントロール・エンハンサのデータより大きいかどうかを調べる。大きい場合、そのアクションがトリガされる。アクションは、プログラムが必要とする各種類の動作変更を処理するように定義されなければならない。たとえば、使用不能化（Ｄｉｓａｂｌｅ）アクションがトリがされた場合、使用不能化（Ｄｉｓａｂｌｅ）アクションは影響されるコントロール・エンハンサにそのコントロールを使用不能にするように指示する。この例で使用不能化（Ｄｉｓａｂｌｅ）アクションを実施する方法は、以下の通りである。ウィンドウ上のチェックボックスに所有コントロール・エンハンサがあり、影響されるコントロール・エンハンサがテキスト入力フィールドを管理するものとする。チェックボックスが選択（たとえば「チェック」）された場合、テキスト入力フィールドは使用不能にされる。チェックボックスの所有コントロールは、「チェック」されたイベントを受け取ると、その規則に照会して適切な比較を行う（すなわち、「チェック」されている状況を、規則によって要求されている状況と比較する）。イベントの結果としてボックスが「チェック」されていなかったため、規則は満たされており、アクションがトリガされ、その結果、影響されるコントロール・エンハンサに使用不能化メッセージが送られる。
【００１６】
各コントロールは、ウィンドウ上の複数のコントロールとの関係を有することができる。さらに関係は複数の規則を有することができる。各規則について、割り当てられた複数のアクション（たとえばアクション１−影響されるコントロール・エンハンサに使用不能化メッセージを送る、アクション２−影響されるコントロール・エンハンサにコントロール変更メッセージを送る）がある場合がある。所有コントロール・エンハンサは、その各関係に変更イベントを渡し、各関係はそのすべての規則をチェックし、該当する場合には、その結果のアクションのうちの１つまたは複数のアクションをトリガする。
【００１７】
本発明のコントロール・エンハンサの実施態様は、様々な構成要素を異なる方法で組み合わせることから成る。基本的には、コントロール・エンハンサの組立ては以下のように行われる。ウィンドウがステップ３０１でＧＵＩコントロールを作成し、３０２でコントロール・エンハンサを作成する。次にウィンドウは３０３でコントロール・エンハンサにＧＵＩコントロールを指すポインタを渡し、３０４でコントロール・エンハンサをコントロール・エンハンサ・リストに加える。３０５で、特別なデータ記憶ハンドラが必要かどうかが判断される。必要な場合、ウィンドウはステップ３０６で作成されたエンハンサに適切なタイプのデータ記憶ハンドラ・オブジェクトを割り当てる。次に、ステップ３０７で、特別な初期設定が必要かどうかが判断される。必要な場合、ステップ３０８でウィンドウによってエンハンサにデータ・イニシャライザが割り当てられる。次に、ステップ３０９で、特別なデータ・ファイナライザが必要かどうかが判断される。ステップ３０９の判断に基づき、ステップ３１０でウィンドウは適切なタイプのデータ・ファイナライザを割り当てる。
【００１８】
ステップ３１１での判断でコントロールが画面上の他のコントロールとの関係を有する場合、ウィンドウは以下のステップを含む追加のステップを行う。３１２で、各関係をインスタンス化し、インスタンス化された関係をコントロール・エンハンサに割り当て、所有コントロール・エンハンサと影響されるコントロール・エンハンサの両方を指すポインタを設定する。ステップ３１３で、関係に対して適切な規則をインスタンス化し、ステップ３１４で適切なアクションをインスタンス化し、規則にアクションを割り当てる。ステップ３０５、３０７、３０９、および３１１の実行順序は重要ではないことに留意されたい。
【００１９】
上記の基本構築ブロックが完了し、テストした後は、それらを様々な方法で組み合わせて、ほとんどどのようなＧＵＩウィンドウでも扱うことができる。ＧＵＩをそれらにプログラムするのは、コントロール・エンハンサを使用して管理するいくつかのＧＵＩコントロールを有する共通の基本ウィンドウ・クラスを定義するという問題になる。その後、コーダは、その基本ウィンドウ・クラスから、定義のために作成した特定のウィンドウの固有ＧＵＩコントロールを追加するサブクラスを導き出すことができる。このようにして、コーダはコードの共通の機能をサブクラスごとに何度も再コーディングしなくても済む。
【００２０】
前述のようにコントロール・エンハンサを組み立てたら、そのコントロール・エンハンサに、そのコントロール・エンハンサが扱うデータを指定するために使用されるデータ識別子を割り当てる。割り当てられたデータ識別子は、コントロール・エンハンサに関連づけられたすべてのオブジェクトによって使用される。初期データをロードする必要がないコントロールや、実行したときにデータを保管する必要がないコントロール（たとえば、単にファイルからメッセージを表示するだけのステータス・バー・コントロール・エンハンサ）には、ダミー識別子を使用することができる。
【００２１】
ウィンドウは、コントロール・エンハンサを作成すると、Ｉｎｉｔｉａｌｉｚｅ（初期設定）メソッドを呼び出す。コントロール・エンハンサはデータ・イニシャライザの「初期設定」メソッドを呼び出す。各タイプのデータ・イニシャライズが、そのタイプに固有の初期設定を実行する。１つのデータ・イニシャライザがデフォルト・ファインダ・オブジェクト１１６を使用し、データ識別子に基づいてデフォルト・データを見つけ出す。別のデータ・イニシャライザがＩＮＩファイルからデータを読み取ると同時に、別のデータ・イニシャライザがデータベースからデータを読み取る。各データ・イニシャライザは、初期設定するように指示されたときに、そのデータをその適切な情報源から読取り、次に、コントロール・エンハンサのＳｅｔＤａｔａメソッドを呼び出してコントロールにデータを表示する。
【００２２】
コントロール・エンハンサ初期設定コードは、テーブル駆動型リミテーション・ディレクタ１１７にも照会する。リミテーション・ディレクタ１１７はデータ・イニシャライザを使用して、データに加える適切な制限値を見つけ出す。制限値の例としては、データの最大長および最小長、データの最大値および最小値、データ・タイプ（たとえば全数字、日付、時刻など）がある。コントロール・エンハンサは、この情報を使用してそのコントロールにメッセージを送り、ユーザがコントロールを正しく使用できるように導くようにその動作を調整する。
【００２３】
初期設定後、コントロール・エンハンサは適切なイベントに応答できるように準備される。ステップ４０１でウィンドウ・イベントが検出されると、ウィンドウはステップ４０２でコントロール・エンハンサ・リストにアクセスし、ステップ４０３で、そのタイプのイベントを対象とするものとして登録されているコントロール・エンハンサがあるかどうかを判断する。そのタイプのイベントのために登録されているコントロール・エンハンサがない場合、ステップ４０４でそのイベントは無視される。ステップ４０３で、そのようなウィンドウ・イベントの影響を受けるものとしてリストに登録されている少なくとも１つのコントローラ・エンハンサがある場合、その対象コントロール・エンハンサはステップ４０５でそのイベントを入手する。ステップ４１０で、そのイベントが「表示」イベントであるかどうかがコントロール・エンハンサで判断される。表示イベントでない場合、次に、ステップ４２０でイベントが「保管」イベントであるかどうかが判断される。保管イベントでない場合、次に４３０で、イベントが初期設定イベントであるかどうかが判断される。初期設定イベントでない場合、処理可能な一連の他のタイプのイベント（図示せず）がある可能性がある。
【００２４】
ステップ４１０での判断によりイベントが表示イベントの場合、ステップ４１１でシステムはコントロールに新しいデータを表示または選択する。ステップ４１２での判断によりチェックする関係がない場合、ステップ４１３で規則が（たとえば比較によって）チェックされる。どの規則も真と評価されない場合、ステップ４１４で指示されたアクションが実行される。
【００２５】
ステップ４２０での判断によりイベントが「保管」イベントの場合、ステップ４２１でイベントはデータ・ファイナライザに渡される。ステップ４２２で、データを検証する任意選択のステップを実施することができる。検証のために、プログラマは、データ識別子に基づいてキー付けされたテーブルをセットアップして、データを検証すべきかどうか、どのように検証するかに関する情報を提供する。検証オブジェクトは、データが正しく入力されなかったことを検出した場合、ステップ４２４で、エラー・ウィンドウにエラー・メッセージ番号を通知し、エラー・ウィンドウはユーザに適切なメッセージを表示する。ＧＵＩ環境では通常、コントロールは無効な選択を行うことができないようにユーザの選択を制限する。しかし、それが不可能な場合、コントロール・エンハンサは検証オブジェクト（図１の１１８）を作成することができる。エラー・メッセージが生成されたコントロールのデータ識別子を追跡することにより、ウィンドウ・コードはその情報を使用してその状況を修正するコントロール・エンハンサを見つけることができる。データの有効性が検証されると、そのデータはデータ記憶ハンドラに渡され、データ記憶ハンドラはステップ４２３でそのデータを適切な場所に書き込む。
【００２６】
ステップ４３０の判断によりイベントが初期設定イベントである場合、ステップ４３１でイベントはデータ・イニシャライザに渡され、ステップ４３２で初期データが取り出されて表示される。４３２での表示後、および４１４でのアクション実行後、または４２３でのデータ保管後、この方法はステップ４０６に戻り、他のウィンドウ・イベントを待つ。
【００２７】
ＧＵＩ環境では、１つのパラメータがコントロールのグループを単一の実体として扱う必要がある状況がある。たとえば、フィールドのデータ項目が年のためのスピン・ボタンと、月のドロップダウン・リストと、日のための別のスピン・ボタンとから成ることがある。日付はデータベースに単一のフィールドとして記憶され、１つのデータ識別子しか持たないが、ＧＵＩはユーザが、データの各構成要素をその構成要素にとって適切な使いやすいコントロールを介して選択することができるようにすることが多い。上記の例では、各構成要素について１つずつ、３つのコントロール・エンハンサが最適に作成される。しかし、データ記憶は、３つのコントロール・エンハンサをすべて知っている必要があるため、マルチコントロール・エンハンサを使用する必要がある。マルチコントロール・エンハンサは、別々の構成要素を、単一の項目としても複数の別個の項目としても扱うように作成される。マルチコントロール・エンハンサは、それに関連づけられた構成要素（すなわちデータ・イニシャライザなど）のための他のすべてのコントロール・エンハンサと同じインタフェースを備えるが、その固有のデータをしかるべく扱う。前述のように、任意のデータ記憶、関係などを割り当てることができるが、そのイニシャライザとファイナライザはまったくそのタスクに固有のものである。
【００２８】
マルチコントロール・エンハンサは、それ自体のコントロール・エンハンサを使用してコントロールを管理する必要がある場合もない場合もある。場合によってはコントロールを直接管理した方が容易なこともある。しかし、コントロール・エンハンサを使用すると、プログラマは、マルチコントロール・エンハンサ・コードに影響を与えることなく後で個々のデータ・コントロールを変更することができる。マルチコントロール・エンハンサは、それ自体がコントロール・エンハンサの複合である既存のコントロールの複合とすることができる。たとえば、以下の６個のコントロールを示す。
月を選択するコントロール（１〜１２に制限される）
日を選択するコントロール（選択された月および年に基づいて１〜２８／２９／３０／３１までに制限される）
年を入力するコントロール（４桁の値）
時のコントロール（０〜２３に制限される）
分のコントロール（０〜５９に制限される）
秒のコントロール（０〜５９に制限される）
日付を入手するには、月および年に基づいて日を制限するすべての関係を使用して、最初の３つのコントロールを制御するＤａｔｅ（日付）マルチコントロール・エンハンサを作成する。最初の３つのコントロールは、それらを制御する単純なコントロール・エンハンサも有し、それを日付マルチコントロール・エンハンサがそれらのデータにアクセスするために使用する。Ｄａｔｅ（日付）マルチコントロール・エンハンサは、この３つのコントロール・エンハンサからのデータの入手方法とそれらの値を結合して１つの値にする方法を知っている。このようにして、ＤａｔｅＴｉｍｅコントロール・エンハンサのためにこの情報のすべてを再コーディングしなくても済むようになる。
【００２９】
同様に、後の３つのコントロールのためにＴｉｍｅ（時刻）マルチコントロール・エンハンサを作成する。したがって、ＤａｔｅＴｉｍｅ（日付時刻）マルチコントロール・エンハンサを作成するには、Ｄａｔｅ（日付）マルチコントロール・エンハンサとＴｉｍｅ（時刻）マルチコントロール・エンハンサの複合を作成する。新しいＤａｔｅＴｉｍｅコントロール・エンハンサは単に、日付コントロール・エンハンサと時刻コントロール・エンハンサの値を結合して単一のＤａｔｅＴｉｍｅ値を作成するに過ぎない。マルチコントロール・エンハンサの機能は、既存のコントロール・エンハンサを入手し、それらを結合してより高度なコントロール・エンハンサを作ることである。
【００３０】
マルチコントロール状況の場合、各コントロール・エンハンサは同じインタフェースを有する。プログラマが、複数のＧＵＩコントロールを単一のコントロールとして機能させることが望ましい状況を満足させる必要があるインスタンスごとに、新しいマルチコントロール・エンハンサを作成する。図３を参照すると、マルチコントロール・エンハンサのセットアップのためにウィンドウ・コードにプログラムする場合、プログラミング上の唯一の相違はステップ３０３で、複数のポインタが作成される点だけである。
【００３１】
まとめとして、本発明の構成に関して以下の事項を開示する。
【００３２】
（１）複数のウィンドウ・コントロールを有するウィンドウ・オブジェクトが受け取る少なくとも１つのイベントの各イベントを処理する強化機能を備えるシステムであって、
各コントロール・エンハンサが前記ウィンドウ・オブジェクトのために１つの特定のコントロールとのインタフェースを提供する、複数のコントロール・エンハンサと、
受け取った前記イベントを処理するために前記複数のコントロール・エンハンサのいずれを呼び出すかを判断する前記コントロール・エンハンサのリストとを含むシステム。
（２）前記複数のコントロール・エンハンサの各コントロール・エンハンサが少なくとも１つのデータ記憶ハンドラを含む、上記（１）に記載のシステム。
（３）前記複数のコントロール・エンハンサの各コントロール・エンハンサが少なくとも１つのデータ・イニシャライザを含む、上記（１）に記載のシステム。
（４）前記複数のコントロール・エンハンサの各コントロール・エンハンサが少なくとも１つのデータ・ファイナライザを含む。上記（１）に記載のシステム。
（５）前記ウィンドウ・コントロールのうちの第１のウィンドウ・コントロールが前記ウィンドウ・コントロールのうちの少なくとも１つの第２のウィンドウ・コントロールに関係し、前記第１のウィンドウ・コントロールの前記コントロール・エンハンサが、前記第２のウィンドウ・コントロールのコントロール・エンハンサを指す少なくとも１つのポインタと、前記第１のコントロール・エンハンサにおけるアクションが前記第２のコントロール・エンハンサに影響するか否かを判断する少なくとも１つの手段と、前記第２のコントロール・エンハンサと連絡する手段とをさらに含む、上記（１）に記載のシステム。
（６）前記コントロール・エンハンサのうちの少なくとも１つのコントロール・エンハンサが、前記コントロール・エンハンサに関係するデータに加えるべき制限を判断する手段をさらに含む、上記（１）に記載のシステム。
（７）前記コントロール・エンハンサのうちの少なくとも１つのコントロール・エンハンサが前記データ・ファイナライザにおいてデータを検証する手段をさらに含む、上記（４）に記載のシステム。
（８）前記コントロール・エンハンサのうちの少なくとも１つのコントロール・エンハンサが、前記少なくとも１つのコントロール・エンハンサのウィンドウ・コントロールに関係するデータを識別する手段をさらに含む、上記（１）に記載のシステム。
（９）複数のウィンドウ・コントロールを有するウィンドウ・オブジェクトが受け取る少なくとも１つのイベントの各イベントを処理する強化機能を備えるシステムであって、
各コントロール・エンハンサが前記ウィンドウ・オブジェクトのために１つの特定のコントロールとのインタフェースを提供し、少なくとも１つのデータ記憶ハンドラと少なくとも１つのデータ・イニシャライザと少なくとも１つのデータ・ファイナライザとを含む、複数のコントロール・エンハンサと、
受け取った前記イベントを処理するために前記複数のコントロール・エンハンサのいずれを呼び出すかを判断する前記コントロール・エンハンサのリストとを含むシステム。
（１０）前記ウィンドウ・コントロールのうちの第１のウィンドウ・コントロールが前記ウィンドウ・コントロールのうちの少なくとも１つの第２のウィンドウ・コントロールに関係し、前記ウィンドウ・コントロールの前記コントロール・エンハンサが、前記第２のウィンドウ・コントロールのコントロール・エンハンサを指す少なくとも１つのポインタと、前記第１のコントロール・エンハンサにおけるアクションが前記第２のコントロール・エンハンサに影響するか否かを判断する少なくとも１つの手段と、前記第２のコントロール・エンハンサと連絡する手段とをさらに含む、上記（９）に記載のシステム。
（１１）前記コントロール・エンハンサのうちの少なくとも１つのコントロール・エンハンサが前記コントロール・エンハンサに関係するデータに加えるべき制限を判断する手段をさらに含む、上記（９）に記載のシステム。
（１２）前記コントロール・エンハンサの少なくとも１つのコントロール・エンハンサが前記データ・ファイナライザにおいてデータを検証する手段をさらに含む、上記（９）に記載のシステム。
（１３）前記コントロール・エンハンサのうちの少なくとも１つのコントロール・エンハンサが、前記少なくとも１つのコントロール・エンハンサのウィンドウ・コントロールに関係するデータを識別する手段をさらに含む、上記（９）に記載のシステム。
（１４）複数のコントロール・エンハンサを含むウィンドウで受け取った少なくとも１つのイベントに応答してウィンドウ・コントロールの強化機能を提供する方法であって、
前記ウィンドウでイベントを受け取るステップと、
前記複数のコントロール・エンハンサから前記イベントの少なくとも１つの対象コントロール・エンハンサを探し出すステップと、
前記少なくとも１つの対象コントロール・エンハンサに前記イベントを渡すステップと、
前記少なくとも１つの対象コントロール・エンハンサにおいて前記事象を処理するステップとを含む方法。
（１５）前記ウィンドウがリストされた各前記コントロール・エンハンサに影響するイベントのコントロール・エンハンサ・リストを含み、少なくとも１つの対象コントロール・エンハンサを探し出す前記ステップが、
イベントの前記リストにアクセスするステップと、
受け取った前記イベントをイベントの前記リストと比較し、前記比較に基づいて対象コントロール・エンハンサを判断するステップとを含む、上記（１４）に記載の方法。
（１６）前記ウィンドウ・コントロールが関係を有し、受け取った前記イベントが表示イベントであって、前記表示イベントは、
表示イベントが前記関係のうちの少なくとも１つの関係に影響を与えるか否かを判断するステップと、
前記少なくとも１つの関係のための少なくとも１つの規則が真であるか否かを評価するステップと、
前記少なくとも１つの規則が真である場合に少なくとも１つのアクションを実行するステップとを含む、上記（１４）に記載の方法。
（１７）ウィンドウ上でのイベント処理のための強化コントロールを提供する方法であって、
前記ウィンドウ上にコントロールを作成するステップと、
前記コントロールのコントロール・エンハンサをインスタンス化するステップと、
前記コントロール・エンハンサに前記コントロールのポインタを渡すステップとを含む方法。
（１８）特別なデータ処理が必要か否かを判断するステップと、
特別な処理が必要な場合に少なくとも１つのデータ・ハンドラをインスタンス化するステップと、
前記データ・ハンドラを前記コントロール・エンハンサに割り当てるステップとをさらに含む、上記（１７）に記載の方法。
（１９）特別な初期設定が必要か否かを判断するステップと、
特別な初期設定が必要な場合に少なくとも１つのデータ・イニシャライザをインスタンス化するステップと、
前記少なくとも１つのデータ・イニシャライザを前記コントロール・エンハンサに割り当てるステップとをさらに含む、上記（１７）に記載の方法。
（２０）特別な初期設定が必要か否かを判断するステップと、
特別な初期設定が必要な場合に少なくとも１つのデータ・イニシャライザをインスタンス化するステップと、
前記少なくとも１つのデータ・イニシャライザを前記コントロール・エンハンサに割り当てるステップとをさらに含む、上記（１８）に記載の方法。
（２１）特別なデータ終結処理が必要か否かを判断するステップと、
特別な終結処理が必要な場合に少なくとも１つのデータ・ファイナライザをインスタンス化するステップと、
前記少なくとも１つのデータ・ファイナライザを前記コントロール・エンハンサに割り当てるステップとをさらに含む、上記（１７）に記載の方法。
（２２）特別なデータ終結処理が必要か否かを判断するステップと、
特別な終結処理が必要な場合に少なくとも１つのデータ・ファイナライザをインスタンス化するステップと、
前記少なくとも１つのデータ・ファイナライザを前記コントロール・エンハンサに割り当てるステップとをさらに含む、上記（１８）に記載の方法。
（２３）特別なデータ終結処理が必要か否かを判断するステップと、
特別な終結処理が必要な場合に少なくとも１つのデータ・ファイナライザをインスタンス化するステップと、
前記少なくとも１つのデータ・ファイナライザを前記コントロール・エンハンサに割り当てるステップとをさらに含む、上記（１９）に記載の方法。
（２４）特別なデータ終結処理が必要か否かを判断するステップと、
特別な終結処理が必要な場合に少なくとも１つのデータ・ファイナライザをインスタンス化するステップと、
前記少なくとも１つのデータ・ファイナライザを前記コントロール・エンハンサに割り当てるステップとをさらに含む、上記（２０）に記載の方法。
（２５）前記コントロールが前記ウィンドウ上の少なくも１つの他のコントロールとの少なくとも１つの関係を有するか否かを判断するステップと、
前記少なくとも１つの関係をインスタンス化するステップと、
前記少なくとも１つの関係を前記コントロール・エンハンサに割り当てるステップと、
各前記少なくとも１つの他のコントロールを指すポインタを渡すステップとをさらに含む、上記（１７）に記載の方法。
（２６）前記少なくとも１つの関係のための少なくとも１つの規則をインスタンス化するステップと、
前記少なくとも１つの規則を前記少なくとも１つの関係に割り当てるステップとをさらに含む、上記（２５）に記載の方法。
（２７）前記少なくとも１つの規則のために少なくとも１つのアクションをインスタンス化するステップと、
前記少なくとも１つのアクションを前記少なくとも１つの規則に割り当てるステップをさらに含む、上記（２６）に記載の方法。
【図面の簡単な説明】
【図１】本発明によるシステムを示す図である。
【図２】本発明のシステムが扱うコントロール関係を示す図である。
【図３】ウィンドウ・コードのコントロール・エンハンサをプログラムするプロセスの流れを示す図である。
【図４】ウィンドウ・コードのコントロール・エンハンサをプログラムするプロセスの流れを示す図である。
【図５】本発明のシステムによるイベント処理のためのプロセスの流れを示す図である。
【図６】本発明のシステムによるイベント処理のためのプロセスの流れを示す図である。
【符号の説明】
１００  ウィンドウ
１１０  コントロール・エンハンサ・リスト
１１１  ＧＵＩコントロール
１１２  コントロール・エンハンサ
１１３  データ・イニシャライザ
１１４  データ・ファイナライザ
１１５  データ記憶ハンドラ
１１６  デフォルト・ファインダ・オブジェクト
１１７  リミテーション・ディレクタ
１１８  バリデータ
１１９  関係
１２０  規則
１３０  アクション
【図１】
0004404993.tif 000002
【図２】
0004404993.tif 000003
【図３】
0004404993.tif 000004
【図４】
0004404993.tif 000005
【図５】
0004404993.tif 000006
【図６】
0004404993.tif 000007