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.