注: 出力フォーム用のイベントをプロジェクトフォームで実装することはできません。関連するイベントは以下の通りです: On Display Detail, On Open Detail, On Close Detail, On Load Record, On Header, On Printing Detail, On Printing Break, On Printing Footer
On Load と On Unload イベントを除き、発生したイベントがフォームイベントプロパティで選択されていなかったとしても、オブジェクトプロパティで選択されていればそのオブジェ クトメソッドの呼び出しが妨げられることはありません。言い換えれば、フォームレベルでイベントを有効あるいは無効にしても、オブジェクトイベントプロパ ティには影響ありません。
特定のイベントに関連するオブジェクトの数は、イベントの性質により異なります:
On Load イベント - On Loadオブジェクトイベントプロパティが選択されている、フォームのすべてのページのすべてのオブジェクトのオブジェクトメソッドが呼び出されます。そしてOn Loadフォームイベントプロパティが選択されていれば、フォームメソッドが呼び出されます。
On Activate や On Resize イベント - これらのイベントは個々のオブジェクトには適用されず、フォームに適用されるため、オブジェクトメソッドは呼び出されません。ゆえにOn Activate フォームイベントプロパティが選択されてれば、そのフォームメソッドのみが呼び出されます。
On Timer イベント - このイベントは事前にSET TIMERコマンドが使用された場合にのみ生成されます。On Timer フォームイベントプロパティが選択されていると、フォームメソッドのみがイベントを受け取ります。オブジェクトメソッドは呼び出されません。
On Drag Over イベント - "ドロップ可"プロパティが選択されていれば、イベント中で関連するドロップ可能なオブジェクトのみオブジェクトメソッドが呼び出されます。フォームメソッドは呼び出されません。 逆にOn Begin Drag Overイベントについては、ドラッグされているオブジェクトのオブジェクトメソッドやフォームメソッドが呼び出されます ("ドラッグ可"プロパティが選択されていれば)。
警告: 他のすべてのイベントと異なり、On Begin Drag Over やイベント中、呼び出されるメソッドは、ドラッグ&ドロップソースオブジェクトのプロセスのコンテキストで実行されます。ドラッグ&ドロップ先のオブジェクトではありません。詳細はドラッグ&ドロップを参照してください。
フォームのOn Mouse Enter, On Mouse Move および On Mouse Leave イベントが選択されていると、これらのイベントはフォームオブジェクトごとに生成されます。これらがオブジェクトで有効にされている場合、イベントはこの オブジェクトに対してのみ生成されます。多層構造のオブジェクトの場合、上位レベルから下位レベルに向けてそのイベントを処理できるオブジェクトを探し、 最初に見つかったオブジェクトによりイベントが生成されます。OBJECT SET VISIBLE コマンドを使用して非表示にされたオブジェクトでは、これらのイベントは生成されません。オブジェクト入力中、他のオブジェクトはマウスの位置によりこの タイプのイベントを受け取るかもしれません。 On Mouse Move イベントはマウスカーソルが動いたときだけではなく、ユーザーが変更キー(Shift, Shift Lock, Ctrl または Option)を押したときにも発生することに注意して下さい(これにより、ドラッグ&ドロップによるコピーや移動も管理できるようになります)。
警告: コンボボックスはクリック可能なオブジェクトとしては扱われません。コンボボックスは入力可能なテキストエリアとして扱われ、割り当てられたドロップダウンリストにはデフォルト値が提供されます。コンボボックスの処理はOn Before Keystroke, On After Keystroke そして On Data Change イベントを使用して行います。
注: 4D v13 以降、ポップアップメニュー/ドロップダウンリストと、階層ポップアップメニューもOn Data Change を生成できるようになりました。これにより、カレントの値と異なる値が選択されたときにオブジェクトの起動を察知できるようになりました。
キーボードから入力可能なオブジェクトとは、キーボードを使用してデータを入力できるオブジェクトです。これらのオブジェクトではOn After Edit, On Before KeystrokeそしてOn After Keystrokeイベントを検知し、Get edited textコマンドを使用して、低レベルでデータ入力をフィルタできます。
キーボード入力可能なオブジェクトやデータタイプには以下が含まれます:
文字、テキスト、日付、時間、数値、そしてピクチャ(On After Edit のみ) など、すべての入力可能なフィールドオブジェクト
文字、テキスト、日付、時間、数値、そしてピクチャ(On After Edit のみ) など、すべての入力可能な変数
コンボボックス
リストボックス
注: 4D v14以降、テキスト(テキスト、日付、時間、数字型)が含まれる入力可能なフィールドおよび変数は On Clicked と On Double Clicked イベントを生成するようになりました。
注: 階層リストは入力可能なオブジェクトですが、このオブジェクトではOn After Edit, On Before KeystrokeそしてOn After Keystrokeは管理されません (後述の “階層リスト” の段落を参照)。
On Before Keystroke と On After Keystroke
注:On After Keystroke イベントは、一般的に On After Edit イベントで置き換えることができます(詳細後述)。
On Before Keystroke と On After Keystroke イベントプロパティを選択したら、Form eventコマンドを使用して返されるOn Before KeystrokeとOn After Keystrokeイベントを検知し、オブジェクトへのキーストロークを処理できます (詳細はGet edited textコマンドの説明を参照してください。これらのイベントはPOST KEYのようなユーザアクションをシミュレートするコマンドによっても生成されます。
キーボードを使用せず、ペーストやドラッグ&ドロップなどで行われた変更は考慮されないことに留意してください。これらのイベントを処理するためにはOn After Editを使用します。
Note: On Before KeystrokeとOn After Keystroke イベントは入力メソッド (IME) 使用時は生成されません。入力メソッドはプログラムあるいはシステムコンポーネントで、日本語や中国語など特定の文字や記号を入力するために使用されます。
- ペーストやカット、削除、キャンセルなどの標準の編集アクション - 値のドロップ (ペーストと同様のアクション) - ユーザが行ったキーボードからの入力。この場合On After EditイベントはOn Before KeystrokeとOn After Keystrokeイベントの後に生成されます。 - ユーザアクションをシミュレートするランゲージコマンドを使用した変更 (例 POST KEY)。
On Selection Change: (入力可であるかそうでないかに関わらず)テキストフィールドや変数に適用されると、このイベントはカーソルの位置が変わるたびに生成されます。例えばユーザーがマウスやキーボードの矢印キーをを使用してテキストを選択したときや、ユーザーがテキストを入力したときです。ここでGET HIGHLIGHTのようなコマンドを呼び出すことができます。
これらのオブジェクトはOn Data Changeイベントを受け取ります。On Data Changeオブジェクトイベントプロパティが選択されると、Form event コマンドから返されるOn Data Changeによりイベントを検知し、データソース値の変更を処理できます。イベントは、オブジェクトに結び付けられた変数が4Dにより内部的に更新され次第、生成されます (例えば、一般的に入力エリアオブジェクトがフォーカスを失った時)。
3D を使用すると詳細にグラフィックインタフェースを設定できます (f3D ボタンに関する説明はDesign Referenceマニュアルを参照してください)。汎用のイベントに加え、これらのボタンを管理するために2つの追加のイベントを使用できます:
On Long Click: このイベントは3D ボタンがクリックされ、一定時間以上マウスボタンが押され続けていると生成されます。理論上、このイベントが生成されるためのクリック保持時間は、システムの環境設定に設定されたダブルクリックの間隔最大時間に等しくなります。 このイベントはすべての3D ボタンスタイル、3D ラジオボタン、3D チェックボックスで生成されます。例外は、旧世代の3D ボタンであるバックグランドオフセットタイプと、ポップアップメニューが関連付けられた3D ボタンの矢印エリアです (後述)。 このイベントは一般的にロングクリック時にポップアップメニューを表示するために使用します。ユーザがロングクリックが有効になる時間前にマウスボタンを離すと、On Clickedが生成されます。
On Alternative Click: いくつかの3D ボタンスタイルには、ポップアップメニューをリンクし、矢印を表示させることができます。この矢印をクリックすると、ボタンの主たるアクションの代わりのアクションを提供するポップアップを表示します。 4DではOn Alternative Click イベントを使用してこの動作を管理できます。このイベントはユーザが矢印をクリックすると、マウスボタンが押されてすぐに生成されます: - ポップアップメニューが分離されている場合、このイベントはボタン中で矢印のあるエリアがクリックされた場合のみ生成されます。 - ポップアップメニューがリンクされている場合、このイベントはボタン上どこをクリックしても生成されます。このタイプのボタンではOn Long Clickイベントが生成されないことに注意してください。
On Footer Click: このイベントはリストボックスやリストボックス列で利用でき、リストボックスやリストボックス列のフッターエリアがクリックされたときに生成されます。こ の場合 OBJECT Get pointer コマンドはクリックされたフッター変数へのポインターを返します。イベントは左および右クリックどちらでも生成されます。Clickcountコマンドを使うことによって、ユーザーが行ったクリックの回数をテストすることができます。
On After Sort: このイベントは標準の並び替えが行われた直後に生成されます(ただしOn Header Clickイベントで$0に-1が返された場合には生成されません)。このメカニズムは、ユーザによって行われた最後の並び替えの方向を格納するために使用できます。このイベント内でSelfコマンドは、並び替えられたカラムヘッダー変数へのポインタを返します。
On Delete Action: このイベントはユーザーが削除キー (DeleteやBackspaceキー) を押して、またはクリア標準アクションが割り当てられたメニュー項目 (編集メニューのクリア等) を選択して、選択された行の削除を指示したときに生成されます。このイベントはリストボックスオブジェクトレベルでのみ利用できます。4Dはイベントの生 成を行うだけであることに留意してください。4Dは項目を消去しません。実際の削除処理や事前警告の表示などは開発者の責任です。
On Scroll (v15からの新機能): このイベントはユーザーがリストボックス内の列またはカラムをスクロールしたときに生成されます。このイベントはユーザーのアクションの結果としてスク ロールが発生した場合にのみ生成されます: スクロールバー/カーソルの使用、マウスホイールまたはキーボードの使用、等です。OBJECT SET SCROLL POSITIONコマンドの使用の結果スクロールした場合には生成されません。 このイベントはスクロールアクションに関連した他の全てのユーザーイベント(On Clicked、On After Keystroke、等)の後にトリガーされます。このイベントはオブジェクトメソッドの中でのみ生成されます(フォームメソッドでは生成されません)。詳細は例題15を参照して下さい。
On Alternative Click (v15からの新機能): このイベントはオブジェクト配列型のリストボックスのカラムにおいて、ユーザーがウィジェットのエリプシスボタン("alternateButton" 属性)をクリックしたときに生成されます。詳細な情報については、カラム内でのオブジェクト配列の使用(4D View Pro) のセクションを参照して下さい。
On Picture Scroll フォームイベントはユーザーが (フィールドや変数) エリア内のピクチャーをスクロールすると生成されます。ピクチャーエリアのサイズがピクチャーよりも小さく、かつ表示フォーマットが"トランケート (中央合わせなし)"に設定されている場合のみスクロールが可能です。この点についてはピクチャーフォーマットを参照してください。 このイベントはスクロールがユーザーアクション (スクロールバーやカーソル、マウスホイール、キーボードの利用) の結果として行われた場合に生成されます (キーボードによるスクロールについてはスクロールバー参照)。OBJECT SET SCROLL POSITION コマンドの結果としてスクロールが行われた場合、イベントは生成されません。 このイベントは、スクロールアクションに関連した他の全てのユーザーイベント(On Clicked、On After Keystroke、等)の後にトリガーされます。このイベントはオブジェクトメソッドの中でのみ生成されます(フォームメソッドでは生成されません)。例題14を参照してください。
(v16 からの新機能)ユーザーが、ピクチャーエリア(フィールドまたは変数)内でドラッグ中に左マウスボタンをリリースしたときにOn Mouse Up イベントが生成されます。このイベントは例えば、ユーザーにSVGエリア内でオブジェクトを移動、リサイズ、描画することを可能にしたい場合には有用です。 On Mouse Upイベントが生成されると、マウスボタンがリリースされたローカルの座標を取得する事ができます。これらの座標はMouseX と MouseYシステム変数に返されます。座標はピクチャーの左上端(0, 0)からみた位置のピクセル単位で表示されます。 このイベントを使用する場合、フォームのステートマネージャーが非同期の可能性がある場合を管理するために、Is waiting mouse upを呼び出す必要があります。これは例えばマウスボタンがリリースされる前にフォーム上にアラートダイアログボックスが表示された場合などです。On Mouse Up イベントのより詳細な情報と使用例については、Is waiting mouse upコマンドの詳細を参照して下さい。 注: ピクチャーオブジェクトの"ドラッグ可能"オプションがチェックされていた場合、On Mouse Up イベントはいかなる場合も生成されません。
On Load と On Unload: サーブフォームを開くまた閉じる際にそれぞれ生成されます。これらのイベントは親フォームレベルでも有効にされていなければなりません。これらのイベント は親のフォームの同じイベントよりも前に生成される点に留意してください。またフォーイベント動作の原則にいたがい、サブフォームが0もしくは1ページ以 外のページに配置されている場合、これらのイベントはページが閉じられ開かれるときにに生成され、フォームが開かれ閉じられるときではないことに留意して ください。
On Validate: サブフォーム中でデータの受け入れを行う際。
On Data Change: サブフォームオブジェクト変数の値が更新されたとき。
On Getting Focus and On Losing Focus: サブフォームコンテナがフォーカスを得たとき、また失った時。これらのイベントはプロパティリスト中でチェックされていれば、サブフォームオブジェクトの メソッド内で生成されます。これらはサブフォームのフォームメソッドに送信されます。つまり例えば、フォーカスに応じてサブフォーム中のナビゲーションボ タンの表示を管理できます。 サブフォームオブジェクトはそれ自身がフォーカスを持つ点に留意してください。
On Bound Variable Change: この特別なイベントは、親フォーム中のサブフォームにバインドされた変数に割り当てられた値が更新される (同じ値が割り当てられたばあいでも) 、かつサブフォームがカレントフォームページまたは0ページに属していれば、サブフォームメソッドのコンテキストで生成されます。サブフォームの管理につ いてはDesign Referenceマニュアルを参照してください。
On Begin URL Loading: このイベントは、Webエリアに新しいURLのロードを開始した時に生成されます。Webエリアに関連付けられた"URL"変数を使用してロード中のURLを知ることができます。 Note: ロード中のURLは現在のURLとは異なります (WA Get current URL コマンドの説明参照)。
On URL Resource Loading: このイベントは、現在のWebページに (ピクチャやフレームなど) 新しいリソースをロードするたびに生成されます。 Webエリアに関連付けられた"Progression"変数を使用してロード状況を知ることができます。
On End URL Loading: このイベントは、現在のURLのすべてのリソースがロードされると生成されます。 WA Get current URL コマンドを使用して、ロードされたURLを知ることができます。
On URL Loading Error: このイベントは、URLのロード中にエラーを検出すると生成されます。 WA GET LAST URL ERROR コマンドを使用して、エラーに関する情報を取得できます。
On Window Opening Denied: このイベントは、Webエリアによりポップアップウィンドウがブロックされると生成されます。4D Web エリアはポップアップウィンドウを許可しません。 WA Get last filtered URL コマンドコマンドを使用してブロックされたURLを知ることができます。
` asBurgerSize Drop-down list Object Method Case of
:(Form event=On Load) ARRAY TEXT(asBurgerSize;3)
asBurgerSize{1}:="Small"
asBurgerSize{1}:="Medium"
asBurgerSize{1}:="Large"
:(Form event=On Clicked) If(asBurgerSize#0) ALERT(asBurgerSize{asBurgerSize}+" バーガーが選択されました。") End if
:(Form event=On Unload) CLEAR VARIABLE(asBurgerSize) End case
` [aTable]aPicture ピクチャ フィールドオブジェクトメソッド Case of
:(Form event=On Drag Over) ` ドラッグ&ドロップ処理が開始され、マウスが現在フィールド上にある ` ソースオブジェクトに関する情報を取得 DRAG AND DROP PROPERTIES($vpSrcObject;$vlSrcElement;$lSrcProcess) ` ソースプロセスの番号をテストする必要はない ` 実行されているオブジェクトメソッドは同じプロセス内で動作している $vlDataType:=Type($vpSrcObject->) ` ソースデータはピクチャか (フィールド, 変数または配列)? If(($vlDataType=Is picture)|($vlDataType=Picture array)) ` 真ならドラッグを受け入れる $0:=0 Else ` 偽ならドラッグを拒否する $0:=-1 End if
:(Form event=On Drop) ` ソースデータがオブジェクトにドロップされたのでオブジェクトにコピーする ` ソースオブジェクトに関する情報を取得 DRAG AND DROP PROPERTIES($vpSrcObject;$vlSrcElement;$lSrcProcess) $vlDataType:=Type($vpSrcObject->) Case of ` ソースオブジェクトはピクチャフィールドまたは変数
:($vlDataType=Is picture) ` ソースオブジェクトは同じプロセスから来ているか (つまり同じウィンドウのフォームか)t? If($lSrcProcess=Current process) ` そうならソースをコピー [aTable]aPicture:=$vpSrcObject-> Else ` そうでない場合、ソースオブジェクトを利用できるか? If(Is a variable($vpSrcObject)) ` 真ならソースプロセスから値を取得 GET PROCESS VARIABLE($lSrcProcess;$vpSrcObject->;$vgDraggedPict) [aTable]aPicture:=$vgDraggedPict Else ` 偽ならCALL PROCESSを使用してソースプロセスから値を取得 End if End if ` ソースオブジェクトがピクチャ配列
:($vlDataType=Picture array) ` ソースオブジェクトは同じプロセスにあるか (つまり同じプロセスの同じウィンドウか)? If($lSrcProcess=Current process) ` 真ならソース値をコピー [aTable]aPicture:=$vpSrcObject->{$vlSrcElement} Else ` そうでなければソースプロセスから値を取得 GET PROCESS VARIABLE($lSrcProcess;$vpSrcObject
->{$vlSrcElement};$vgDraggedPict) [aTable]aPicture:=$vgDraggedPict End if End case End case
` Method of a form being used as output form for a summary report $vpFormTable:=Current form table Case of ` ...
:(Form event=On Header) ` ヘッダエリアの印刷開始 Case of
:(Before selection($vpFormTable->)) ` 最初のブレークヘッダ用のコード
:(Level=1) ` ヘッダブレークレベル 1 用のコード
:(Level=2) ` ヘッダブレークレベル 2 用のコード ` ... End case
:(Form event=On Printing Detail) ` レコードの印刷開始 ` レコード毎のコードを記述
:(Form event=On Printing Break) ` ブレークエリアの印刷開始 Case of
:(Level=0) ` ブレークレベル0 用のコード
:(Level=1) ` レークレベル1 用のコード ` ... End case
:(Form event=On Printing Footer) If(End selection($vpFormTable->)) ` 最後のフッタ用のコード Else ` フッタ用のコード End if End case
` asChoices scrollable area object method Case of
:(Form event=On Load) ARRAY TEXT(asChoices;...) ` ... asChoices:=0
:((Form event=On Clicked)|(Form event=On Double Clicked)) If(asChoices#0) ` 項目がクリックされたので、何らかの処理を行う ` ... End if ` ... End case
` asChoices scrollable area object method Case of
:(Form event=On Load) ARRAY TEXT(asChoices;...) ` ... asChoices:=0 asChoices{0}:="0"
:(Form event=On Clicked) If(asChoices#0) If(asChoices#Num(asChoices)) ` 新しい項目がクリックされたので何かを行う ` ... ` 次回のために、新しく選択された要素を保存 asChoices{0}:=String(asChoices) End if Else asChoices:=Num(asChoices{0}) End if
:(Form event=On Double Clicked) If(asChoices#0) ` 項目がダブルクリックされたのでここで何かを行う End if ` ... End case
この例題では、 On Getting Focus と On Losing Focusを使用して、フォームメソッド内でステータス情報を管理します。:
` [Contacts];"Data Entry" form method Case of
:(Form event=On Load) C_TEXT(vtStatusArea) vtStatusArea:=""
:(Form event=On Getting Focus) RESOLVE POINTER(Focus object;$vsVarName;$vlTableNum;$vlFieldNum) If(($vlTableNum#0) & ($vlFieldNum#0)) Case of
:($vlFieldNum=1) ` Last name フィールド vtStatusArea:="Enter the Last name of the Contact; it will be capitalized automatically" ` ...
:($vlFieldNum=10) ` Zip Code フィールド vtStatusArea:="Enter a 5-digit zip code; it will be checked and validated automatically" ` ... End case End if
:(Form event=On Losing Focus) vtStatusArea:="" ` ... End case
` Method for an input form $vpFormTable:=Current form table Case of ` ...
:(Form event=On Close Box) If(Modified record($vpFormTable->)) CONFIRM("このレコードは更新されています。保存しますか?") If(OK=1) ACCEPT Else CANCEL End if Else CANCEL End if ` ... End case
` [Contacts]First Name Object method Case of ` ...
:(Form event=On Data Change) [Contacts]First Name:=Uppercase(Substring([Contacts]First Name;1;1))+ Lowercase(Substring([Contacts]First Name;2)) ` ... End case
` [Contacts]First Name Object method Case of ` ...
:(Form event=On Data Change) [Contacts]First Name:=Uppercase(Substring([Contacts]First Name;1;1))+ Lowercase(Substring([Contacts]First Name;2)) ` ... End case
:(Form event=On Scroll) LISTBOX GET CELL POSITION(*;"LB1";$col;$raw) LISTBOX GET CELL COORDINATES(*;"LB1";$col;$raw;$x1;$y1;$x2;$y2) OBJECT GET COORDINATES(*;"LB1";$xlb1;$ylb1;$xlb2;$ylb2) $toAdd:=LISTBOX Get headers height(*;"LB1") //オーバーラップしないためにヘッダーの高さを取得 If($ylb1+$toAdd<$y1) & ($ylb2>$y2) //リストボックス内にいるとき //単純かのため、ここではヘッダーのみを扱います //実際にはスクロールバーに加え、 //水平方向のクリッピングも管理しなければなりません。 OBJECT SET VISIBLE(*;"RedRect";True) OBJECT SET COORDINATES(*;"RedRect";$x1;$y1;$x2;$y2) Else OBJECT SET VISIBLE(*;"RedRect";False) End if