ウィンドウ(ダイアログボックス)を閉じる時に考慮すべきことについて教えてください。
Release : CA Gen Run Time, GUI: r8.0、r8.5
EXIT STATE ISステートメントとCLOSEステートメントを用いて同一のウィンドウ(ダイアログボックス)を閉じる処理を記述しないようにしてください。
CLOSEステートメントでウィンドウを明示的に閉じていても、EXIT STATE ISステートメントによりウィンドウが暗黙的に閉じられるため、同じウィンドウに対して閉じる処理が重複して発生します。
特に、クローズイベント内でEXIT STATE ISステートメントにより同じウィンドウに対して閉じる処理が重複して発生すると、予期せぬエラーが発生することがあります。
以下に例を示します。
プロシージャ・ステップA(ウィンドウ A1) から プロシージャ・ステップB(ウィンドウ B1)へのリンクフローがあります。プロシージャ・ステップBから戻る時に、以下のアクション図のように、クローズイベント内でEXIT STATE ISステートメントを実行します。
EXIT STATE ISステートメントは、フロー元のプロシージャ・ステップAへ戻るリンクフローのトリガーとなる役割の他に、現在のウィンドウB1を閉じる機能も含まれています。
クローズイベント実行時には、既にウィンドウを閉じる処理が進行しているため、二重に同じウィンドウを閉じる処理が発生してしまい、最悪の場合はクライアント・アプリケーションがクラッシュします。
メモリの状態によりクラッシュが発生しない場合もありますが、メモリが不正な状態となりますので、クローズイベント内では、絶対にEXIT STATE ISステートメントを使用しないでください。
(クラッシュ通知ダイアログの一例)
※「 No DBMS Stub Executable 」とは、クライアント・アプリケーションのEXEファイルのプロパティに書かれているファイルの説明です。
なお、この例のアクション図のようにクローズイベントのトリガーとしてCLOSEステートメントを使用している場合には、CLOSEステートメントをEXIT STATE ISステー トメントに置き換えるなどして回避してください。
以下に回避策の一例を示します。
問題が発生するロジック
+- EVENT ACTION <クリックイベント>
| CLOSE ウィンドウ ウィンドウB1
+--
+- EVENT ACTION <ウィンドウB1クローズイベント>
| EXIT STATE IS <リターンエグジットステート名>
+--
回避策実施後のロジック
+- EVENT ACTION <クリックイベント>
| <削除>CLOSE ウィンドウ ウィンドウB1
| EXIT STATE IS <リターンエグジットステート名>
+--
+- EVENT ACTION <ウィンドウB1クローズイベント>
| <削除>EXIT STATE IS <リターンエグジットステート名>
+--
補足
クローズイベント内でEXIT STATE ISステートメントでリターンフローをする前に、対話フローでマッチングしているビューに戻り値を設定していた場合、戻り値 の設定部分にも考慮が必要です。
+- EVENT ACTION <ウィンドウB1クローズイベント>
| SET <マッチングされたビュー> TO “戻り値”
| EXIT STATE IS <リターンエグジットステート名>
+-
上記、回避策実施後のロジックのように、EXIT STATE ISステートメントをトリガーにクローズイベントが実行されるようになった場合、そのクローズイベント内 で設定した値は、フロー元に渡されません。
+- EVENT ACTION <クリックイベント>
| EXIT STATE IS <リターンエグジットステート名>
+-
+- EVENT ACTION <ウィンドウB1クローズイベント>
| SET <マッチングされたビュー> TO “戻り値”
+-
以下のように、戻り値の設定部分もクローズイベントから移動する必要があります。
+- EVENT ACTION <クリックイベント>
| SET <マッチングされたビュー> TO “戻り値”
| EXIT STATE IS <リターンエグジットステート名>
+-
ご質問等がございましたら、恐れ入りますが弊社サポートまでご連絡ください。
Old Japanese Knowledge document ID : JTEC002218
CA Genのその他のFAQについては、
CA Gen FAQ一覧表