OracleD2kフォームのウィンドウ管理
このセクションでは、Oracle D2kフォームでのウィンドウ管理の2つの非常に便利な手法を紹介します。右上のxアイコンをクリックしてアクティブなウィンドウを閉じることと、フォームで開いているアクティブなウィンドウのサイズ変更、再配置、および閉じることです。前者は、OracleFormsに欠けている非常に高く評価されているユーザー要件です。これは、標準のWindowsアプリケーションに厳密に準拠しています。 2番目の手法は、開いている各ウィンドウを個別に閉じる際のプログラミングの労力とエンドユーザーの労力を最小限に抑えるための一般的なルーチンです。 xアイコンでウィンドウを閉じる
右上隅のxアイコンをクリックしてウィンドウを閉じることは、多くの場合必要な機能であり、標準のWindows機能でもあります。この手法はFormsでは無視されますが、数行のコードで実現できます。そのためには、 WHEN-WINDOW-CLOSEDと記述します。 トリガーし、ウィンドウの外に移動するか、必要に応じて:SYSTEM.EVENT_WINDOW。をチェックしてフォームを終了します。 たとえば、アクティブなウィンドウがコンソールウィンドウ(通常は WINDOW1 )のときにxをクリックしてフォームを終了するには )、プロシージャ p_close_window 次のようにコーディングできます。PROCEDURE p_close_window(p_window_name VARCHAR2,
console_window VARCHAR2,
ret_code OUT NUMBER)
IS
Win_id Window;
BEGIN
Win_id := FIND_WINDOW(p_window_name);
IF ID_NULL(win_id) THEN
Ret_code := -1;
Return;
END IF;
IF NAME_IN('SYSTEM.EVENT_WINDOW') = p_window_name THEN
IF console_window = 'Y'THEN
DO_KEY('EXIT_FORM');
ELSE
SET_WINDOW_PROPERTY(win_id, VISIBLE, PROPERTY_FALSE);
END IF;
IF FORM_SUCCESS THEN
Ret_code := 0;
ELSE
Ret_code := -1;
END IF;
END IF;
END;
この手順は、コンソールウィンドウだけでなく、任意のウィンドウを閉じるために使用できるという意味で一般的です。xアイコンをクリックして、特定のフォームを閉じる前に特別なチェックを行うために、フォーム固有のキー出口を作成できます。 ウィンドウのサイズ変更、再配置、および閉じる
積み重ねられたキャンバスを保持する子ウィンドウは、プライマリウィンドウの一部となる情報を表示するためのフォームで必要になることがよくあります。たとえば、選択リストがプライマリウィンドウに表示され、後続の詳細とサブ詳細が、子ウィンドウによって保持される1つ以上のスタックされたキャンバスに表示される場合があります。複数のウィンドウを同時に表示する必要がある場合は、これらの各ウィンドウを動的にサイズ変更、再配置、または閉じることが不可欠です。これには大量のコードが必要です。この手法は、特定のウィンドウのサイズを変更、再配置、および閉じるための一般的なルーチンを単一のフォームで提供するため、プログラマーは必要な実質的なコードを作成するために必要な時間と労力を節約できます。ヒントイベントウィンドウには、 close_allowed、が必要です。 resize_allowed、 およびmove_allowed はい/Trueに設定されたプロパティ 設計時に。これは、デフォルトのクローズ、サイズ変更、および再配置機能を有効にするために必要です。ウィンドウのサイズ変更と再配置の手順は、同様の行に記述できます。PROCEDURE p_resize_window(p_window_name VARCHAR2,
console_window VARCHAR2,
width NUMBER,
height NUMBER,
ret_code OUT NUMBER)
IS
Win_id Window;
BEGIN
/* The window name, its target width, and its height are passed
as input parameters. Also, an additional parameter to identify whether
the window under consideration is a console window is passed as input. */
Win_id := FIND_WINDOW(p_window_name);
/* If input window does not exist, exit the procedure and return –1 */
IF ID_NULL(win_id) THEN
Ret_code := -1;
Return;
END IF;
/* If the input window is the active window and is not the console window,
resize it to the specified width and height */
IF NAME_IN('SYSTEM.EVENT_WINDOW') = p_window_name THEN
IF console_window = 'Y'THEN
NULL; /* CANNOT RESIZE CONSOLE WINDOW */
ELSE
RESIZE_WINDOW(win_id, WIDTH, HEIGHT);
END IF;
IF FORM_SUCCESS THEN
Ret_code := 0;
ELSE
Ret_code := -1;
END IF;
END IF;
END;
PROCEDURE p_reposition_window(p_window_name VARCHAR2,
console_window VARCHAR2,
xpos number,
ypos NUMBER,
ret_code OUT NUMBER)
IS
Win_id Window;
BEGIN
/* The window name and its target (x,y) position are passed as
input parameters. Also, an additional parameter to identify whether the window
under consideration is a console window is passed as input. */
Win_id := FIND_WINDOW(p_window_name);
/* If the input window does not exist, exit the procedure and return –1 */
IF ID_NULL(win_id) THEN
Ret_code := -1;
Return;
END IF;
/* If the input window is the active window and is not the console window,
resize it to the specified width and height */
IF NAME_IN('SYSTEM.EVENT_WINDOW') = p_window_name THEN
IF console_window = 'Y'THEN
NULL; /* CANNOT RESIZE CONSOLE WINDOW */
ELSE
MOVE_WINDOW(win_id, xpos, ypos);
END IF;
IF FORM_SUCCESS THEN
Ret_code := 0;
ELSE
Ret_code := -1;
END IF;
END IF;
END;
前の2つの手順と前のセクションで示した手順は、 action_typeという名前の追加パラメーターを追加することで1つに一般化できます。 :PROCEDURE p_action_window(p_window_name VARCHAR2,
console_window VARCHAR2,
action_type VARCHAR2,
Width number, height number, xpos number, ypos number,
ret_code OUT NUMBER,
)
IS
Win_id Window;
V_window_name VARCHAR2(40);
BEGIN
/* This procedure takes the action type (CLOSE, RESIZE or REPOSITION )
as an input parameter and calls the corresponding procedure
(p_close_window,
p_rresize_window or p_reposition_window ) to perform that action.
Initially, it checks for the existence of the input window name */
Win_id := FIND_WINDOW(NAME_IN(p_window_name));
IF ID_NULL(win_id) THEN
Ret_code := -1;
Return;
END IF;
IF (action_type = 'CLOSE') THEN
P_close_window(p_window_name, console_window, ret_code);
ESLIF (action_type = 'RESIZE') THEN
P_resize_window(p_window_name, console_window, ret_code);
ELSIF (action_type = 'REPOSITION')
P_reposition_window(p_window_name, console_window, ret_code);
END IF;
IF FORM_SUCCESS THEN
ret_code := 0;
ELSE
(ret_code = -1);
END IF;
END IF;
END;
p_close_windowの呼び出し p_action_windowに置き換えることができます WHEN-WINDOW-CLOSED
DECLARE
ret_code NUMBER;
BEGIN
p _action_window('WINDOW0'), 'Y','CLOSE', ret_code);
IF (ret_code <> 0) THEN
MESSAGE('Error closing Console Window!');
RAISE FORM_TRIGGER_FAILURE;
END IF;
END;
3つのプロシージャのそれぞれのコードp_close_window、 p_resize_window、 およびp_reposition_window アプリケーション固有のロジックを処理するようにカスタマイズできます。たとえば、 p_close_windowのコード プロシージャは、 GO_ITEM など、それぞれのウィンドウから明示的なナビゲーションを開始するための呼び出しを含むようにカスタマイズできます。 またはGO_BLOCK、 これにより、そのウィンドウが閉じ、保存しますか?がスローされます。 保留中のデータベース変更の場合に警告します。また、コンソールウィンドウを閉じる例に見られるように、 EXIT_FORM 特定のフォームの終了を開始するすべてのウィンドウを閉じるのに役立ちます。ヒント組み込みのSET_WINDOW_PROPERTYへの呼び出し プロパティVISIBLE FALSEに設定 ウィンドウにナビゲート可能なアイテムがない場合、またはウィンドウスタイルがドキュメントの場合にのみ、ウィンドウを閉じます(非表示にします)。ウィンドウに少なくとも1つのナビゲート可能な項目がある場合、またはウィンドウスタイルがDialogの場合、ユーザーがウィンドウの外に明示的にナビゲートしない限り、ウィンドウは表示されたままになります。また、ウィンドウがモーダルの場合、終了する唯一の方法は明示的なナビゲーションを使用することです。これは、 p_close_windowをカスタマイズすることで対処できます。 前の例で概説した手順。