Control の各クラスはインタラクティブな動作に対応するように設計されていて、ユーザーがマウスやキーボードの操作によってトリガする 1 つ以上のイベントに応答します。 前述のとおり、コントロール メカニズムの UI 部分では一般的な (または「未加工」) イベントを受け取り、コントロールで適合可能なイベントを発生させます。 ダイナミック イベント ハンドラをコントロールにアタッチし、発生したコントロール適合イベントへの応答としてこれらを実行することができます。
たとえば、ユーザーがテキスト フィールドに入力したときにテキスト フィールドの
value プロパティを変化させるだけでなく、テキスト フィールドで
ValueChanged イベントを発生させます。 続いてユーザーが
[Enter] キーを押すかテキスト フィールドの外側にカーソルを移動すると、そこで
ValueFinished イベントを発生させます。
ValueChanged および
ValueFinished は、コントロールのみに適合可能な 2 つのイベント タイプの例です。 具体的には、これらはValue コントロール (value に関連付けられているコントロール) に適合されるものです。
さまざまなコントロール適合イベントは、通常ユーザーのコントロール操作に応じてコントロールで発生します。 次のようなイベントが含まれます。
各コントロールには、このような特定のイベントを発生させるユーザー操作が組み込まれています。 たとえば、
CheckButton ではボックスをクリックすると
ValueChanged イベントと
ValueFinished イベントが発生し、
value プロパティも変わります。 詳細は、『API リファレンス マニュアル』で各コントロールのセクションを参照してください。
Control の各インスタンスを作成するときにインスタンスのイベント ハンドラを記述して、インスタンスで発生するイベントに応答して実行することができます。 このようなイベント ハンドラは、
コントロールで発生するイベント以外に、コントロール コンテナで発生するイベントがあります。
- Commit は Dialog およびそれに含まれるコントロールで発生するイベントです。 通常は Dialog.commit によってトリガされます。 このダイナミックおよびスタティック イベント ハンドラを記述できます。
- DialogShow は、ダイアログが表示されたときに発生します。 つまり、ダイアログがポップアップ表示されたとき、別のビューに移動したとき、またはアプレット内に配置された後で発生します。 通常は Dialog.show によってトリガされます。 このイベントのみに対応するダイナミック イベント ハンドラを記述できます。
イベントおよびイベント処理の詳細については、「
イベント」の章も参照してください。
GuiEvent.consume メソッドの使用に関する説明に特に注意してください。このメソッドにより、追加の変更ハンドラによって処理したり再発生させなければならないイベントをターゲットが
消費することができます。
次の例は、
ValueChanged イベントのダイナミック ハンドラを追加したチェック ボタンを示しています。 ボタンをクリックすると、ボタンで
ValueChanged イベントが発生するのを確認してみてください。 さらに、ダイナミック イベント ハンドラによりボタンのラベルが変わります。
例:
ダイナミック ValueChanged ハンドラのアタッチされたチェック ボタン |
|
{let my-value:Dynamic =
{Dynamic "My initial value is false"}
}
{CheckButton
value = false, || initially unchecked
label = my-value, || this label will be updated dynamically
{on ValueChanged at cb:CheckButton do
{
set my-value.value = "My current value is " & cb.value
}
}
}
| |
ダイアログとコントロールは
GuiEventTarget クラスも継承していることから、特別な
スタティック イベント ハンドラ メソッドを備えています。このメソッドは、任意のクラスで標準イベントの 1 つが発生したときに、そのすべてのオブジェクトで既定の応答を提供するものです。 詳細は「
スタティック イベント ハンドラ」のセクションで解説しています。 以下の点に注意してください。
- これらのスタティック イベント ハンドラは、指定ターゲットやイベント対してユーザー定義のダイナミック イベント ハンドラが実行された後でのみ実行されます。
- イベントの多くはコントロールに適用されません。
- 標準コントロール クラスの一部として提供されるスタティック イベント ハンドラのほとんどは、既定では何も実行しません。
ダイアログの利点の 1 つは、ユーザーの選択内容すべてを 1 つのユーザー操作、つまりボタン クリックで収集できる機能にあります。 Curl 言語には、組み込みの
[OK] ボタンを備えたモーダル ダイアログを作成するショートカット プロシージャがあります。 ユーザーがこのボタンをクリックすると、すべてのコントロールおよびダイアログ自体で
Commit イベントが発生します。 さらにポップアップ ダイアログの場合は、
[OK] ボタンによりダイアログを閉じるというメッセージをダイアログに送ります。
ただし、Curl 言語が提供するモーダル ダイアログを使用しない場合は、独自の [OK] または [適用] ボタンを作成して同じ操作を実行することができます。 次のセクションでは、これらのボタンの実装に関して Commit イベントがどのように使用されるかについて説明します。
[適用] ボタンを含むダイアログを作成することもできます。
[適用] ボタンの実装は、最後のステップを除いて
[OK] ボタンと同じです。 つまり、
Dialog.close は
呼び出されず、したがってポップアップ ダイアログの場合でも閉じません。
popup-message プロシージャで生成されるダイアログなどには、オプションで
[キャンセル] ボタンを含めることができます。
[キャンセル] ボタンの実装方法は次のとおりです。
例:
Dialog.commit メソッドの使用 |
|
{define-proc
{order-coffee milk?:bool, coffee-type:String}:void
{popup-message
{if milk? then
{text Here is some {value coffee-type} with milk!}
else
{text Sorry, no milk with your {value coffee-type}!}
}
}
}
{value
let milk?:bool = true
let coffee-type:String = "Kenyan"
let b:CommandButton =
{CommandButton
label = "Show non-modal dialog"
}
|| construct the dialog
let rf:RadioFrame =
{radio-buttons
"Kenyan",
"Arabica",
"Sumatran",
value = "Kenyan"
}
let cb:CheckButton =
{CheckButton
label = "with milk?"}
let ok:CommandButton =
{CommandButton
label = "OK",
{on Action do
{ok.dialog.commit}
{ok.dialog.close Dialog.ok}
}
}
let cancel:CommandButton =
{CommandButton
label = "Cancel",
{on Action do
{cancel.dialog.close Dialog.cancel}
}
}
let dialog:Dialog =
{Dialog
{spaced-vbox
rf,
cb,
{spaced-hbox ok, cancel}
},
{on com:Commit do
set milk? = cb.value
set coffee-type = rf.value
{order-coffee milk?, coffee-type}
{com.consume}
},
{on WindowClose do
set b.enabled? = true
}
}
{b.add-event-handler
{on Action at b:CommandButton do
let v:#View = {b.get-view}
{unless dialog.open? do
set b.enabled? = false
{dialog.show modal? = false, owner = v}
}
}
}
{value b}
}
| |
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.