Fensterverwaltung in Oracle D2k-Formularen
Dieser Abschnitt stellt zwei sehr nützliche Techniken der Fensterverwaltung in Oracle D2k Forms vor:Schließen eines aktiven Fensters durch Klicken auf das x-Symbol oben rechts und Größenänderung, Neupositionierung und Schließen aller geöffneten aktiven Fenster in einem Formular. Ersteres ist eine sehr geschätzte Benutzeranforderung, die Oracle Forms fehlt; Es entspricht strikt jeder Standard-Windows-Anwendung. Die zweite Technik ist eine generische Routine zum Minimieren des Programmieraufwands sowie des Endbenutzeraufwands beim individuellen Schließen jedes geöffneten Fensters.Schließen eines Fensters mit dem x-Symbol
Das Schließen eines Fensters durch Klicken auf das x-Symbol in der oberen rechten Ecke ist eine häufig erforderliche Funktion und auch eine Standardfunktion von Windows. Obwohl diese Technik von Forms ignoriert wird, können Sie sie mit ein paar Zeilen Code erreichen. Schreiben Sie dazu ein WHEN-WINDOW-CLOSED trigger, und navigieren Sie aus dem Fenster oder verlassen Sie das Formular nach Bedarf, indem Sie nach :SYSTEM.EVENT_WINDOW. suchen Um beispielsweise ein Formular durch Klicken auf x zu verlassen, wenn das aktive Fenster das Konsolenfenster ist (normalerweise WINDOW1 ), die Prozedur p_close_window kann wie folgt codiert werden: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;Dieses Verfahren ist generisch in dem Sinne, dass es verwendet werden kann, um jedes Fenster zu schließen, nicht nur das Konsolenfenster. Ein formularspezifischer Schlüsselausgang kann geschrieben werden, um spezielle Überprüfungen vorzunehmen, bevor dieses bestimmte Formular durch Klicken auf das x-Symbol geschlossen wird.
Größe ändern, neu positionieren und jedes Fenster schließen
Untergeordnete Fenster, die gestapelte Leinwände enthalten, werden sehr oft in einem Formular benötigt, um Informationen anzuzeigen, die Teil des primären Fensters werden. Beispielsweise könnte eine Auswahlliste im primären Fenster angezeigt werden, und nachfolgende Details und Unterdetails könnten in einer oder mehreren gestapelten Leinwänden erscheinen, die von untergeordneten Fenstern gehalten werden. Die dynamische Größenänderung, Neupositionierung oder das Schließen jedes dieser Fenster ist unerlässlich, wenn mehrere Fenster gleichzeitig angezeigt werden müssen. Dies erfordert eine beträchtliche Menge an Code. Diese Technik stellt eine generische Routine bereit, um jedes gegebene Fenster in einer einzigen Form zu skalieren, neu zu positionieren und zu schließen, wodurch dem Programmierer die Zeit und der Aufwand gespart werden, die erforderlich sind, um den erforderlichen wesentlichen Code zu schreiben. TippDas Ereignisfenster sollte das close_allowed, haben resize_allowed, und move_allowed Eigenschaften auf Ja/True gesetzt zur Entwurfszeit. Dies ist erforderlich, um die Standardfunktionen zum Schließen, Ändern der Größe und Neupositionierung zu aktivieren. Prozeduren zum Ändern der Größe und Neupositionierung jedes Fensters können in ähnlichen Zeilen geschrieben werden: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;Die beiden vorangehenden Prozeduren und die im vorangegangenen Abschnitt können zu einer verallgemeinert werden, indem ein zusätzlicher Parameter namens action_type hinzugefügt wird :
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;Der Aufruf von p_close_window kann durch p_action_window ersetzt werden wie folgt:
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;Der Code für jede der drei Prozeduren p_close_window, p_resize_window, und p_reposition_window kann angepasst werden, um anwendungsspezifische Logik zu handhaben. Zum Beispiel der Code für das p_close_window Die Prozedur kann so angepasst werden, dass sie Aufrufe enthält, um eine explizite Navigation aus dem jeweiligen Fenster zu initiieren, wie z. B. GO_ITEM oder GO_BLOCK, wodurch das Fenster geschlossen werden kann und auch ein Möchten Sie speichern? ausgegeben wird Warnung bei anstehenden Datenbankänderungen. Außerdem, wie im Beispiel zum Schließen des Konsolenfensters zu sehen, EXIT_FORM kann beim Schließen aller Fenster hilfreich sein, die das Verlassen eines bestimmten Formulars einleiten. TippDer Aufruf des eingebauten SET_WINDOW_PROPERTY mit der Eigenschaft VISIBLE auf FALSE setzen schließt (verbirgt) das Fenster nur, wenn das Fenster keine navigierbaren Elemente enthält oder der Fensterstil Dokument ist. Wenn das Fenster mindestens ein navigierbares Element enthält oder der Fensterstil Dialog ist, bleibt das Fenster angezeigt, bis der Benutzer explizit aus dem Fenster navigiert. Wenn das Fenster modal ist, besteht die einzige Möglichkeit zum Verlassen darin, explizit zu navigieren. Dies kann durch Anpassung des p_close_window erledigt werden Vorgehen wie im vorangegangenen Beispiel beschrieben.