version 11 (Modified)
On Exit データベースメソッドは、データベースを終了すると一回呼び出されます。
このメソッドは、以下の4D環境で使用されます:
・ローカルモードの4D
・リモートモードの4D
・コンパイルし、4D VolumeDesktopを組み込んだ4Dアプリケーション
Note: On Exit データベースメソッドは、4D Serverでは起動されません。
On Exit データベースメソッドは、4Dによって自動的に起動されます。プロジェクトメソッドとは異なり、プログラムからデータベースメソッドを呼び出すことはできません。しかしメソッドエディタから実行することはできます。またサブルーチンを使用できます。
データベースは、以下のうちいずれかが発生すると終了します:
・ユーザがデザインモードのファイルメニュー終了メニューを、またはアプリケーションモードで終了標準アクション付きのメニューやボタンを選択した場合
・QUIT 4D コマンドへの呼び出しが実行された場合
・4DプラグインからQUIT 4Dエントリポイントへの呼び出しが実行された場合
データベースの終了がどのような方法で行われたかに関わらず、4Dは以下のような処理を実行します:
・On Exit データベースメソッドがない場合には、4Dは実行プロセスそれぞれを区別せずに1つずつアボートします。ユーザがデータ入力を実行している場合には、レコードはキャンセルされ、保存されません。
・On Exit データベースメソッドがある場合には、4Dは新しく作成したローカルプロセスの中でこのメソッドの実行を開始します。したがって、このデータベースメソッドを使用し、インタープロセス間通信を通じて、(データ入力を)終了したり、処理の実行を中止したりしなければならないことを、他のプロセスに通知することができます。4Dは、いずれ終了するということに注意してください。On Exit データベースメソッドは、必要なクリーンアップや終了の処理を実行することができますが、アプリケーションの終了を拒否できず、ある時点で終了することになります。
On Exit データベースメソッドは、以下のような処理を実行するには最適です:
・データベースを開いた時に自動的に開始されたプロセスを停止する。
・次回のセッションの始めにOn Startup データベースメソッドで再利用するため、必要な環境設定や初期設定などの情報をローカルディスなどに保存する。
・データベースを終了する度に実行したい処理が他にあれば、それを実行する。
Note: On Exit データベースメソッドがローカル/クライアントプロセスであり、データファイルにアクセスできないことを覚えておいてください。つまり、リモートモードで4Dを使用している時、On Exit データベースメソッドで検索やソートを実行すると、4Dは "フリーズ" し、実際には終了しません。アプリケーションを終了するとき、リモートモードの4Dからデータにアクセスする必要があるならば、On Exit データベースメソッド内から、新しいグローバルプロセスを作成してください。このグローバルプロセスはデータファイルにアクセスできます。この場合On Exit データベースメソッドの終了前に、新しいプロセスが正しく終了されたことを (インタープロセス変数を使用するなどして) 確認してください。
例題
以下の例では、作業セッション中に発生する重要なイベントを追跡し、その説明を“Journal”という名前のテキストドキュメントに書き込むすべてのメソッドをカバーします。
・On Startup データベースメソッドは、インタープロセス変数vbQuit4Dを初期化します。この変数は、すべての使用プロセスに、データベースが終了中であるか通知するために使用されます。またこのメソッドは、ジャーナルファイルが存在しない場合にはそれを作成します。
` On Startup データベースメソッド
C_TEXT(<>vtIPMessage)
C_BOOLEAN(<>vbQuit4D)
<>vbQuit4D:=False
If (Test path name("Journal") # Is a document)
$vhDocRef:=Create document("Journal")
If (OK=1)
CLOSE DOCUMENT($vhDocRef)
End if
End if
WRITE JOURNAL ("セッションが開始されました")
・WRITE JOURNALプロジェクトメソッドは、他のメソッドからサブルーチンとして使用され、ジャーナルファイルに受け取った情報を書き込みます:
` WRITE JOURNAL プロジェクトメソッド
` WRITE JOURNAL ( Text )
` WRITE JOURNAL ( Event description )
C_TEXT($1)
C_TIME($vhDocRef)
While (Semaphore("$Journal"))
DELAY PROCESS(Current process;1)
End while
$vhDocRef:=Append document("Journal")
If (OK=1)
PROCESS PROPERTIES(Current process;$vsProcessName;$vlState;$vlElapsedTime;$vbVisible)
SEND PACKET($vhDocRef;String(Current date)+Char(9)+String(Current time)+Char(9)
+String(Current process)+Char(9)+$vsProcessName+Char(9)+$1+Char(13))
CLOSE DOCUMENT($vhDocRef)
End if
CLEAR SEMAPHORE("$Journal")
ドキュメントが毎回開かれ閉じられることに注目してください。さらにドキュメントへのアクセス保護としてセマフォを利用していることにも注目してください。2つのプロセスがジャーナルファイルに同時にアクセスすることを防ぐためです。
・M_ADD_RECORDSプロジェクトメソッドは、アプリケーションモードでレコード追加メニュー項目が選択されると実行されます:
` M_ADD_RECORDS プロジェクトメソッド
MENU BAR(1)
REPEAT
ADD RECORD([Table1];*)
If (OK=1)
WRITE JOURNAL ("Table1へのレコード追加 #"+String(Record number([Table1])))
End if
Until ((OK=0) | <>vbQuit4D)
このメソッドは、ユーザが最後のデータ入力をキャンセルするか、またはデータベースを終了するまでループします。
・ [Table 1]の入力フォームには、On Outside Callイベントの処理手順も含まれています。したがって、プロセスがデータ入力中であっても、ユーザは現在のデータ入力を保存するかまたは保存しないで、スムーズに終了できます:
` [Table1];"Input" フォームメソッド
Case of
: (Form event=On Outside Call)
If (<>vtIPMessage="QUIT")
CONFIRM("このレコードに対する変更を保存しますか?")
If (OK=1)
ACCEPT
Else
CANCEL
End if
End if
End case
・M_QUITプロジェクトメソッドは、アプリケーションモードでファイルメニューから終了が選択されると実行されます:
` M_QUIT プロジェクトメソッド
$vlProcessID:=New process("DO_QUIT";32*1024;"$DO_QUIT")
このメソッドには、ある仕掛けがあります。QUIT 4Dが呼び出されると、コマンドは即座に効果があります。したがって、呼び出しが発行されたプロセスは、データベースが実際に終了されるまでの間は“停止モード”になります。このプロセスは、データ入力が行われているプロセスの可能性があるため、QUIT 4Dの呼び出しは、この目的にだけ開始されるローカルプロセス内で実行されます。DO_QUITメソッドは、以下のようになります:
` DO_QUIT プロジェクトメソッド
CONFIRM("本当に終了しますか?")
If (OK=1)
WRITE JOURNAL ("データベース終了中")
QUIT 4D
` QUIT 4Dは即座に効果があります。以下の行が実行されることはありません。
` ...
End if
・最後に、すべての開いているユーザプロセスに対して“ただちに終了するよう”通知するOn Exit データベースメソッドは、以下のようになります。このメソッドは、vbQuit4DをTrueに設定し、データ入力を実行しているユーザプロセスに、プロセス間メッセージを送信します:
` On Exit データベースメソッド
<>vbQuit4D:=True
REPEAT
$vbDone:=True
For ($vlProcess;1;Count tasks)
PROCESS PROPERTIES($vlProcess;$vsProcessName;$vlState;$vlElapsedTime;$vbVisible)
If (((($vsProcessName="ML_@") | ($vsProcessName="M_@"))) & ($vlState>=0))
$vbDone:=False
<>vtIPMessage:="QUIT"
BRING TO FRONT($vlProcess)
CALL PROCESS($vlProcess)
$vhStart:=Current time
REPEAT
DELAY PROCESS(Current process;60)
Until ((Process state($vlProcess)<0) | ((Current time-$vhStart)>=?00:01:00?))
End if
End for
Until ($vbDone)
WRITE JOURNAL ("セッション終了中")
Note: "ML_..."または"M_..."で始まる名前を持つプロセスは、新規プロセス開始プロパティを選択したメニューによって開始されます。この例では、そのようなプロセスは、レコード追加メニューが選択された時に開始されたプロセスです。
(Current time-$vhStart)>=?00:01:00?という判定式により、データベースメソッドは“他のプロセスを待っている”状態を終了します。他のプロセスがただちに反応しない場合には、ループを繰り返します。
・次に示しているのは、データベースによって作成されたジャーナルファイルの代表的な例です:
| 2/6/03 | 15:47:25 | 1 | Main process | セッションが開始されました |
| 2/6/03 | 15:55:43 | 5 | ML_1 | Table1へのレコード追加 #23 |
| 2/6/03 | 15:55:46 | 5 | ML_1 | Table1へのレコード追加 #24 |
| 2/6/03 | 15:55:54 | 6 | $DO_QUIT | データベース終了中 |
| 2/6/03 | 15:55:58 | 7 | $xx | セッション終了中 |
Note: $xxという名前は、On Exit データベースメソッドを実行するために4Dが開始したローカルプロセスの名前です。
参照
On Startup データベースメソッド, QUIT 4D.