要約: | - GuiEvent は、グラフィカル ユーザー インターフェイス (GUI) における、すべてのイベントの共通のスーパークラスです。
- GuiEvent は、イベントのすべての処理を実行するハンドラによって消費され、ハンドラは GuiEvent が消費されたかどうかをチェックする必要があります。
- GuiEventTarget にはスタティック イベント ハンドラがあり、サブクラスは一定の共通する動作を所定クラスのすべてのオブジェクトに提供できます。
|
- GuiEvent オブジェクトには、イベントの処理が不要になったことを伝える consumed? プロパティがあります。
- GuiEventTarget クラスには、個別のオブジェクト インスタンスを作成するダイナミック イベント ハンドラの他に、各 GuiEventTarget サブクラスをオーバーライドできるメソッドとして定義されている特殊なスタティック イベント ハンドラがあります。スタティック イベント ハンドラを持たないイベント タイプがあることに注意してください。
スタティック イベント ハンドラは、
GuiEventTarget クラスのために定義されたメソッドの特殊なグループです。スタティック ハンドラによって、
GuiEventTarget サブクラスは、クラスのすべてのオブジェクトに一定の共通動作を提供できます。スタティック ハンドラはクラス全体で 1 度だけ保持されるので、ダイナミック ハンドラを同様の複数オブジェクトにアタッチする場合と比べてメモリの節約にもなります。
スタティック イベント ハンドラは、同一タイプのオブジェクトすべてについて特定イベントに対する共通の応答を決定し、さらにサブクラスでオーバーライド可能な単一メソッドにその動作をローカライズします。
たとえば、独自のグラフィカル サブクラスを作成する場合、イベントのスタティック イベント ハンドラを再定義することにより、新しいクラスの全オブジェクトの
GuiEvent に対する応答方法を修正することができます。(これは、特定の単一オブジェクトに対するイベント処理に追加されるものです。単一オブジェクトイベント処理は、個々の
ダイナミック イベント ハンドラを追加して作成します。)
各スタティック イベント ハンドラはメソッドで、その名前は
on- で始まり、その後に処理するイベント クラスの名前が小文字で単語をハイフンで区切った形で続きます。たとえば、
on-pointer-enter というメソッドは
PointerEnter イベントのスタティック イベント ハンドラです。
EventTargetのスタティック イベント ハンドラを対応するイベント クラスと共に次の表に示します。ユーザーが Curl® 言語で記述されたアプレットとやりとりする方法により大きく分類されています。
スタティックおよびダイナミックの両方のイベント ハンドラ持つ目標オブジェクトでイベントが起動されると、スタティック イベント ハンドラの前にダイナミック イベント ハンドラが実行され、最後に追加されたダイナミック イベント ハンドラが最初に実行されます。
ダイナミック イベント ハンドラのすべてが実行を完了すると、イベントで該当するスタティック イベント ハンドラが呼び出されます。スタティック ハンドラはクラス階層と逆の順序で呼び出されます。そのタイプのイベントに最も特有のハンドラが最初に呼び出され、次にイベントのスーパークラスのハンドラ、さらにイベント階層の上位のイベントが順に呼び出されます。イベント クラスの 1 つをサブクラス化してスタティック イベント ハンドラをオーバーライドする場合、この規則に従う必要があります。
イベント ハンドラは、イベントに対して
GuiEvent.consume メソッドを呼び出すことによって、
GuiEvent を
消費します。各
GuiEvent ハンドラは、処理しているイベントの
GuiEvent.consumed? プロパティを常にチェックし、既に消費されたイベントに反応しないようにする必要があります。ハンドラは、イベントの処理を終了後にそのイベントを消費して、その後のイベント ハンドラが処理が完了したことを確認できるようにすることが重要です。
「
ポインタ イベント」のセクションでは、目標のダイナミックおよびスタティック イベント ハンドラがすべて呼び出された後に、目標オブジェクトのグラフィカルな親でポインタ イベントが再起動され、上記のシーケンスが新しい目標について繰り返されることを説明します。グラフィカル階層全体の上部に達するまでイベント ハンドラが呼び出されるような連鎖を停止する唯一の方法は、
e.consume を呼び出してイベントが
消費されるようにすることです。
次の例では、イベントの処理と消費を説明します。e.consume を含む行を取り除くか、別のイベント ハンドラに挿入してみてください。
例:
PointerPress イベントの消費 |
|
{HBox
{on PointerPress do
{popup-message "in the HBox"}
},
{Fill
width = 2cm,
height = 2cm,
background = "red",
{on e:PointerPress do
{if e.consumed? then
{popup-message "consumed"}
else
{popup-message "handler 3"}
}
},
{on e:PointerPress do
{if e.consumed? then
{popup-message "consumed"}
else
{popup-message "handler 2"}
}
{e.consume}
},
{on e:PointerPress do
{if e.consumed? then
{popup-message "consumed"}
else
{popup-message "handler 1"}
}
}
}
}
| |
上記のリストに記載されているプロパティを使用して、GuiWindowEvent のレポートにより、ボタンの押しなどの活動時に収集された情報にアクセスできます。イベントが処理されるまでに、これらのプロパティで異なる値を持つ他のイベントが発生することがありますが、前のイベントを適切に処理するために元のデータが不可欠な場合があります。
GuiWindowEvent.event-time が提供する
event-time カウンタは単調に増加しますが、ときおりオーバーフローすると再びゼロに戻ります。2 つのイベントの間に時間カウンタの折り返しがなかった場合、2 つの異なる
GuiWindowEvent を記録した時間値を減算して 2 つの活動が開始された時刻の間隔を識別します。Microsoft® Windows および X Windows の両方で、イベント時間数はミリ秒ごとに増加します。
state-mask は、イベントが起動されたときのマウス ボタンとキーボード修飾キーの状態をレポートします。
次の例は、修飾キー プロパティを 2 つ使用して、長方形の上でポインタが押されたときにその色を設定するものです。選択される色は、マウス ボタンを押しながら保持していたキーボードの修飾キーによって異なります。
例:
修飾キー プロパティのチェック |
|
{RectangleGraphic width=2in, height=0.5in,
{on e:PointerPress at rectangle:RectangleGraphic do
{if e.shift? then
set rectangle.fill-color = "red"
elseif e.ctrl? then
set rectangle.fill-color = "lime"
else
set rectangle.fill-color = "silver"
}
}
}
| |
ポインタ イベントは、「
ポインタ イベント」のセクションで説明されているように、グラフィカル階層を介してイベント座標を含む最下層の可視オブジェクトに送られます。オブジェクトでポインタ イベントが起動されると、イベント ハンドラがイベントを消費するまでグラフィカル階層の上位へ向かって各オブジェクトが再起動されます。
その一方で、キーボードフォーカスがあるオブジェクトにおいて、キーボードイベントは、
View によって開始されます。各
View には、どのオブジェクトにキーボードフォーカスがあるかを把握する
FocusManager が含まれています。
KeyPress されているオブジェクトで
KeyPress が消費されない場合、さらに、ファンクションキー (F1、F2等)、Ctrl、 Alt、メニュー変更キーが押された場合は、イベントは、ショートカットまたはメニューアクセスキーである場合に備えて、ブラウザに転送されます。
この機能の一般的な用法の 1 つとして、ユーザーが本当にウィンドウを閉じたいのかどうかを確認するプロンプトの表示が挙げられます。ほかには、ユーザーがウィンドウを閉じるよう要求したとき、ウィンドウを実際に破棄する代わり非表示にする場合です。ユーザーが後でウィンドウの再表示を求めた場合、再作成の代わりに
View.show を使用して表示できます。次の例では、この方法によるポップアップ ウィンドウの管理を示します。
例:
WindowClose イベントの処理 |
|
{value
let popup:View =
{View
{Frame margin=12pt,
{text This is a popup window.}
},
{on e:WindowClose at v:View do
{v.hide}
{e.consume}
}
}
let button:CommandButton =
{CommandButton label = "Show Popup",
{on Action do {popup.show}
}
}
button
}
| |
Copyright © 1998-2019 SCSK Corporation.
All rights reserved.
Curl, the Curl logo, Surge, and the Surge logo are trademarks of SCSK Corporation.
that are registered in the United States. Surge
Lab, the Surge Lab logo, and the Surge Lab Visual Layout Editor (VLE)
logo are trademarks of SCSK Corporation.