VLF-ONE フィルターおよびコマンド・ハンドラーに再定義された uQueryCanClose メソッドが存在することがあります。
これは、フィルターまたはコマンド・ハンドラーを閉じようとユーザーがアクションを取った時に起動されます。
そして、キャンセルまたは閉じる要求が許可されるかどうかを示すブール値パラメータ #CanBeCancelled に渡されます。
これはブール値 #Allow を返し、閉じる要求がキャンセルされるべきかどうかが示されます。閉じる要求がキャンセルできない場合、実績値が返されたかどうかにかかわらず、TRUE (閉じることを許可) だと判断されます。
つまり、uQueryCanClose には次の 2 つの役割があります。
未保存の変更がある場合、フィルターまたはコマンド・ハンドラーのキャンセルまたは閉じる処理を許可する要求をキャンセルまたは閉じる、最初のフィルター/コマンド・ハンドラーは、これ以降の uQueryCloseRequest への呼び出しを制止することに注意してください。
フィルターまたはコマンド・ハンドラーが、保存されていない変更の保存を試みることを許可する。こここでは「試みる」という言葉であることに注意してください。ユーザーが Web ブラウザ全体を閉じたり、別の Web ページに移動した場合、サーバーに送信するといった複雑な処理をプログラムで行うことができない可能性があるからです。
VLF-WIN では、uQueryCanDeactivate は、エンドユーザーがコマンド・ハンドラーからフレームワーク内の別の場所に移動したり、フレームワークを終了しようとすると起動されます。これは、ユーザーが別のコマンド・タブ、ビジネス・オブジェクトの新しいインスタンス、または他のビジネス・オブジェクトやアプリケーションをクリックすると、実行されます。
保存されていない変更を保存する場合に、このメソッドは特に役に立ちます。ルーチンは変更を保存する必要があるかどうかを確認します。保存する必要がある場合は、ユーザーに「続行する前に変更を保存しますか?」という質問が表示されます。(はい/いいえ)[はい] と答えると、変更を保存できます。 (※質問のメッセージはプログラムソース上で変更することができます。)
ルーチンの実行時でも、コマンド・ハンドラーには、ユーザーが移動を試みる前の値がすべて保持されています。したがって、保存されていない変更がないか確認して保存するのは簡単です。
このメソッドを使用するには、avNotifyDeActivationプロパティをコマンド・ハンドラーの初期化ルーチンに設定する必要があります。
* 初期化処理
Mthroutine Name(uInitialize) Options(*REDEFINE)
* 祖先で定義された初期化処理を行う
Invoke #Com_Ancestor.uInitialize
* 未保存の変更に対するチェックをアクティベート (未保存の変更ロジック)
set #Com_Owner avNotifyDeactivation(TRUE)
Endroutine
次に、再定義したuQueryCanDeActivateルーチンをコマンド・ハンドラーに追加します。
* ユーザーが別のコマンド・タブかビジネス・オブジェクト・インスタンス、ビジネス・オブジェクトやアプリケーションに移動した時、またはフレームワークを閉じる時、フレームワークがこれを初期化
* (フレームワークはこのメソッドを複数回初期化することもある)
MTHROUTINE NAME(uQueryCanDeactivate) OPTIONS(*REDEFINE)
* Define_Map For(*Result) Class(#vf_elBool) Name(#Allow)
#Allow := True
if '(#pty_NeedsSaving *eq TRUE)'
* 保存する必要がある場合、これを保存するかユーザーに問い合わせ
USE BUILTIN(MESSAGE_BOX_SHOW) WITH_ARGS('YESNO' 'YES' *Default *Default 'The notes have been changed.Would you like to save your changes before continuing?')TO_GET(#MSG_RET)
if '#MSG_RET *eq YES'
* すべて保存
<< my save logic>>
endif
#pty_NeedsSaving := False
endif
endroutine
さらに複雑なバージョンでは、保存中にエラーが発生した場合に#Allowをfalseに設定できます。また、そのような場合は、ユーザーはクリックした場所に移動しません(または、フレームワークを終了しようとしていた場合は、フレームワークが開いたままになります)。
また以下も参照してください。