Oracle
 sql >> Base de données >  >> RDS >> Oracle

Gestion des fenêtres dans Oracle D2k Forms

Gestion des fenêtres dans Oracle D2k Forms

Cette section présente deux techniques très utiles de gestion des fenêtres dans Oracle D2k Forms :fermer une fenêtre active en cliquant sur l'icône x en haut à droite et redimensionner, repositionner et fermer toute fenêtre active ouverte dans un formulaire. Le premier est une exigence utilisateur très appréciée qui manque à Oracle Forms; il est strictement conforme à toute application Windows standard. La deuxième technique est une routine générique pour minimiser l'effort de programmation, ainsi que l'effort de l'utilisateur final, en fermant chaque fenêtre ouverte individuellement.

Fermer une fenêtre avec l'icône x

La fermeture d'une fenêtre en cliquant sur l'icône x dans le coin supérieur droit est une fonctionnalité souvent requise et également une fonctionnalité Windows standard. Bien que cette technique soit ignorée par Forms, vous pouvez y parvenir au moyen de quelques lignes de code. Pour ce faire, écrivez un WHEN-WINDOW-CLOSED déclencheur, et naviguez hors de la fenêtre ou quittez le formulaire si nécessaire en vérifiant :SYSTEM.EVENT_WINDOW. Par exemple, pour quitter un formulaire en cliquant sur x lorsque la fenêtre active est la fenêtre de la console (qui est généralement WINDOW1 ), la procédure p_close_window peut être codé comme suit :
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;

Cette procédure est générique dans le sens où elle peut être utilisée pour fermer n'importe quelle fenêtre, pas seulement la fenêtre de la console. Une sortie clé spécifique au formulaire peut être écrite pour prendre en charge toute vérification spéciale avant de fermer ce formulaire particulier en cliquant sur l'icône x.

Redimensionner, repositionner et fermer n'importe quelle fenêtre

Les fenêtres enfants contenant des canevas empilés sont très souvent nécessaires dans un formulaire pour afficher des informations qui font partie de la fenêtre principale. Par exemple, une liste de sélection peut être affichée dans la fenêtre principale, et les détails et sous-détails suivants peuvent figurer dans un ou plusieurs canevas empilés détenus par des fenêtres enfants. Redimensionner, repositionner ou fermer dynamiquement chacune de ces fenêtres est essentiel lorsque plusieurs fenêtres doivent être affichées en même temps. Cela nécessite une quantité importante de code. Cette technique fournit une routine générique pour redimensionner, repositionner et fermer n'importe quelle fenêtre donnée dans un formulaire unique, économisant ainsi au programmeur le temps et les efforts nécessaires pour écrire le code substantiel requis. AstuceLa fenêtre d'événement doit avoir le close_allowed, resize_allowed, et move_allowed propriétés définies sur Oui/Vrai au moment de la conception. Cela est nécessaire pour activer les fonctions de fermeture, de redimensionnement et de repositionnement par défaut. Les procédures de redimensionnement et de repositionnement de n'importe quelle fenêtre peuvent être écrites sur des lignes similaires :
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;

Les deux procédures précédentes et celle donnée dans la section précédente peuvent être généralisées en une seule en ajoutant un paramètre supplémentaire nommé 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;

L'appel à p_close_window peut être remplacé par p_action_window comme suit :
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;

Le code de chacune des trois procédures p_close_window, p_resize_window, et p_reposition_window peut être personnalisé pour gérer la logique spécifique à l'application. Par exemple, le code de p_close_window la procédure peut être personnalisée pour contenir des appels pour initier une navigation explicite hors de la fenêtre respective, comme GO_ITEM ou GO_BLOCK, qui permettra à cette fenêtre de se fermer et lancera également un Voulez-vous enregistrer ? alerte en cas de modification de la base de données en attente. De plus, comme on le voit dans l'exemple de fermeture de la fenêtre de la console, EXIT_FORM peut être utile pour fermer toutes les fenêtres qui initient la sortie d'un formulaire particulier. AstuceL'appel au SET_WINDOW_PROPERTY intégré avec la propriété VISIBLE défini sur FALSE ferme (masque) la fenêtre uniquement si la fenêtre ne contient aucun élément navigable ou si le style de fenêtre est Document. Si la fenêtre contient au moins un élément navigable, ou si le style de fenêtre est Dialogue, la fenêtre reste affichée jusqu'à ce que l'utilisateur quitte explicitement la fenêtre. De plus, si la fenêtre est modale, la seule façon de sortir est au moyen d'une navigation explicite. Cela peut être pris en charge par la personnalisation de la p_close_window procédure décrite dans l'exemple précédent.