sql >> Base de Datos >  >> RDS >> Oracle

Gestión de ventanas en Oracle D2k Forms

Administración de ventanas en Oracle D2k Forms

Esta sección presenta dos técnicas muy útiles de administración de ventanas en Oracle D2k Forms:cerrar una ventana activa haciendo clic en el ícono x superior derecho y cambiar el tamaño, reposicionar y cerrar cualquier ventana activa abierta en un formulario. El primero es un requisito de usuario muy apreciado del que carece Oracle Forms; está en estricta conformidad con cualquier aplicación estándar de Windows. La segunda técnica es una rutina genérica para minimizar el esfuerzo de programación, así como el esfuerzo del usuario final, al cerrar cada ventana abierta individualmente.

Cerrar una ventana con el ícono x

Cerrar una ventana haciendo clic en el ícono x en la esquina superior derecha es una característica que se requiere con frecuencia y también una funcionalidad estándar de Windows. Aunque Forms ignora esta técnica, puede lograrla mediante unas pocas líneas de código. Para hacerlo, escriba un CUANDO-VENTANA-CERRADA disparador y navegue fuera de la ventana o salga del formulario según sea necesario buscando :SYSTEM.EVENT_WINDOW. Por ejemplo, para salir de un formulario haciendo clic en x cuando la ventana activa es la ventana de la consola (que generalmente es WINDOW1 ), el procedimiento p_close_window se puede codificar de la siguiente manera:
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;

Este procedimiento es genérico en el sentido de que se puede usar para cerrar cualquier ventana, no solo la ventana de la consola. Se puede escribir una salida de clave específica de formulario para realizar cualquier verificación especial antes de cerrar ese formulario en particular haciendo clic en el icono x.

Cambiar el tamaño, reposicionar y cerrar cualquier ventana

Las ventanas secundarias que contienen lienzos apilados a menudo se requieren en un formulario para mostrar información que se convierte en parte de la ventana principal. Por ejemplo, se puede mostrar una lista de selección en la ventana principal, y los detalles y subdetalles posteriores pueden figurar en uno o más lienzos apilados en las ventanas secundarias. Cambiar el tamaño, reposicionar o cerrar dinámicamente cada una de estas ventanas es esencial cuando se deben mostrar varias ventanas al mismo tiempo. Esto requiere una cantidad significativa de código. Esta técnica proporciona una rutina genérica para cambiar el tamaño, reposicionar y cerrar cualquier ventana dada de una sola forma, ahorrando así al programador el tiempo y el esfuerzo necesarios para escribir el código sustancial requerido. ConsejoLa ventana del evento debe tener close_allowed, resize_allowed, y movimiento_permitido propiedades establecidas en Sí/Verdadero en tiempo de diseño. Esto es necesario para habilitar las funciones predeterminadas de cierre, cambio de tamaño y reposicionamiento. Los procedimientos para cambiar el tamaño y la posición de cualquier ventana se pueden escribir en líneas similares:
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;

Los dos procedimientos anteriores y el dado en la sección anterior se pueden generalizar en uno agregando un parámetro adicional llamado 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;

La llamada a p_close_window puede ser reemplazado por p_action_window de la siguiente manera:
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;

El código para cada uno de los tres procedimientos p_close_window, p_resize_window, y p_reposition_window se puede personalizar para manejar la lógica específica de la aplicación. Por ejemplo, el código para p_close_window El procedimiento se puede personalizar para que contenga llamadas para iniciar una navegación explícita fuera de la ventana respectiva, como GO_ITEM o GO_BLOCK, lo que permitirá que esa ventana se cierre y también arrojará un ¿Quieres guardar? alerta en caso de cambios pendientes en la base de datos. Además, como se ve en el ejemplo de cerrar la ventana de la consola, EXIT_FORM puede ser útil para cerrar todas las ventanas que inician la salida de un formulario en particular. ConsejoLa llamada a la SET_WINDOW_PROPERTY integrada con la propiedad VISIBLE establecido en FALSO cierra (oculta) la ventana solo si la ventana no tiene elementos navegables o si el estilo de la ventana es Documento. Si la ventana tiene al menos un elemento navegable, o el estilo de la ventana es Diálogo, la ventana permanece visible a menos y hasta que el usuario navegue explícitamente fuera de la ventana. Además, si la ventana es modal, la única forma de salir es mediante navegación explícita. Esto se puede solucionar mediante la personalización de p_close_window procedimiento como se describe en el ejemplo anterior.