Správa oken ve formulářích Oracle D2k
Tato část představuje dvě velmi užitečné techniky správy oken v Oracle D2k Forms:zavření aktivního okna kliknutím na ikonu x vpravo nahoře a změna velikosti, přemístění a zavření jakéhokoli otevřeného aktivního okna ve formuláři. První jmenovaný je velmi ceněným požadavkem uživatele, který Oracle Forms postrádá; je v přísné shodě s jakoukoli standardní aplikací Windows. Druhá technika je obecná rutina, která minimalizuje úsilí při programování a také úsilí koncového uživatele při zavírání každého otevřeného okna jednotlivě. Zavření okna pomocí ikony x
Zavření okna kliknutím na ikonu x v pravém horním rohu je často požadovaná funkce a také standardní funkce Windows. Ačkoli tuto techniku Forms ignorují, můžete ji dosáhnout pomocí několika řádků kódu. Chcete-li tak učinit, napište WHEN-WINDOW-CLOSED spustit a opustit okno nebo opustit formulář podle potřeby kontrolou :SYSTEM.EVENT_WINDOW. Chcete-li například opustit formulář kliknutím na x, když je aktivním oknem okno konzoly (což je obecně OKNO1 ), postup p_close_window lze kódovat následovně: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;
Tento postup je obecný v tom smyslu, že jej lze použít k zavření libovolného okna, nejen okna konzoly. Lze zapsat klíčový výstup specifický pro formulář, který se postará o jakoukoli speciální kontrolu před zavřením konkrétního formuláře kliknutím na ikonu x. Změna velikosti, přemístění a zavření libovolného okna
Podřízená okna obsahující naskládaná plátna jsou velmi často vyžadována ve formě pro zobrazení informací, které se stanou součástí primárního okna. Například výběrový seznam může být zobrazen v primárním okně a následné podrobnosti a dílčí detaily se mohou objevit v jednom nebo více naskládaných pláten držených podřízenými okny. Dynamická změna velikosti, přemístění nebo zavření každého z těchto oken je zásadní, když musí být zobrazeno více oken současně. To vyžaduje značné množství kódu. Tato technika poskytuje obecnou rutinu pro změnu velikosti, přemístění a zavření jakéhokoli daného okna v jediném formuláři, čímž programátorovi šetří čas a úsilí nutné k napsání podstatného požadovaného kódu. TipOkno události by mělo mít close_allowed, změna_povolena, a move_allowed vlastnosti nastaveny na Ano/True v době návrhu. To je nezbytné k povolení výchozích funkcí zavírání, změny velikosti a přemístění. Postupy pro změnu velikosti a přemístění libovolného okna lze zapsat na podobné řádky: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;
Předchozí dva postupy a jeden uvedený v předchozí části lze zobecnit do jednoho přidáním dalšího parametru s názvem action_type :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;
Volání p_close_window lze nahradit p_action_window takto: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;
Kód pro každou ze tří procedur p_close_window, p_resize_window, a p_reposition_window lze přizpůsobit tak, aby zvládla logiku specifickou pro aplikaci. Například kód pro p_close_window proceduru lze upravit tak, aby obsahovala volání pro zahájení explicitní navigace z příslušného okna, jako je GO_ITEM nebo GO_BLOCK, což umožní zavření tohoto okna a také vyvolání Chcete uložit? upozornění v případě čekajících změn databáze. Také, jak je vidět na příkladu zavření okna konzoly, EXIT_FORM může být užitečné při zavření všech oken, která iniciují opuštění určitého formuláře. TipVolání do vestavěného SET_WINDOW_PROPERTY s vlastností VISIBLE nastavte na FALSE zavře (skryje) okno pouze v případě, že okno neobsahuje žádné navigovatelné položky nebo je styl okna Dokument. Pokud okno obsahuje alespoň jednu navigovatelnou položku nebo je styl okna Dialog, okno zůstane zobrazené, dokud a dokud uživatel výslovně neopustí okno. Pokud je okno modální, jediným způsobem, jak jej ukončit, je explicitní navigace. To lze zajistit přizpůsobením p_close_window postup, jak je uvedeno v předchozím příkladu.