Oracle
 sql >> Database >  >> RDS >> Oracle

Gestione delle finestre nei moduli Oracle D2k

Gestione delle finestre nei moduli Oracle D2k

Questa sezione presenta due tecniche molto utili di gestione delle finestre in Oracle D2k Forms:chiudere una finestra attiva facendo clic sull'icona x in alto a destra e ridimensionare, riposizionare e chiudere qualsiasi finestra attiva aperta in un modulo. Il primo è un requisito utente molto apprezzato che manca a Oracle Forms; è in stretta conformità con qualsiasi applicazione Windows standard. La seconda tecnica è una routine generica per ridurre al minimo lo sforzo di programmazione, così come lo sforzo dell'utente finale, nella chiusura di ciascuna finestra aperta individualmente.

Chiudere una finestra con l'icona x

Chiudere una finestra facendo clic sull'icona x nell'angolo in alto a destra è una funzionalità spesso richiesta e anche funzionalità standard di Windows. Sebbene questa tecnica sia ignorata da Forms, puoi realizzarla per mezzo di poche righe di codice. Per farlo, scrivi un WHEN-WINDOW-CLOSED trigger ed esci dalla finestra o esci dal modulo se necessario controllando :SYSTEM.EVENT_WINDOW. Ad esempio, per uscire da un modulo facendo clic su x quando la finestra attiva è la finestra della console (che generalmente è WINDOW1 ), la procedura p_close_window può essere codificato come segue:
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;

Questa procedura è generica nel senso che può essere utilizzata per chiudere qualsiasi finestra, non solo la finestra della console. È possibile scrivere una chiave di uscita specifica del modulo per eseguire qualsiasi controllo speciale prima di chiudere quel particolare modulo facendo clic sull'icona x.

Ridimensionamento, riposizionamento e chiusura di qualsiasi finestra

Le finestre figlio che contengono tele impilate sono molto spesso richieste in un modulo per visualizzare le informazioni che diventano parte della finestra principale. Ad esempio, un elenco di selezione potrebbe essere visualizzato nella finestra principale e i dettagli e i dettagli secondari successivi potrebbero essere presenti in una o più tele impilate tenute dalle finestre figlie. Il ridimensionamento dinamico, il riposizionamento o la chiusura di ciascuna di queste finestre è essenziale quando è necessario visualizzare più finestre contemporaneamente. Ciò richiede una quantità significativa di codice. Questa tecnica fornisce una routine generica per ridimensionare, riposizionare e chiudere una data finestra in un'unica forma, risparmiando così al programmatore il tempo e lo sforzo necessari per scrivere il codice sostanziale richiesto. SuggerimentoLa finestra dell'evento dovrebbe avere il close_allowed, ridimensionare_consentito, e sposta_permessa proprietà impostate su Sì/Vero in fase di progettazione. Ciò è necessario per abilitare le funzioni di chiusura, ridimensionamento e riposizionamento predefinite. Le procedure per ridimensionare e riposizionare qualsiasi finestra possono essere scritte su righe simili:
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;

Le due procedure precedenti e quella data nella sezione precedente possono essere generalizzate in una aggiungendo un parametro aggiuntivo chiamato 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 chiamata a p_close_window può essere sostituito da p_action_window come segue:
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;

Il codice per ciascuna delle tre procedure p_close_window, p_resize_window, e p_reposition_window può essere personalizzato per gestire la logica specifica dell'applicazione. Ad esempio, il codice per p_close_window la procedura può essere personalizzata per contenere chiamate per avviare la navigazione esplicita fuori dalla rispettiva finestra, come ad esempio GO_ITEM o GO_BLOCK, che consentirà a quella finestra di chiudersi e anche di lanciare un Vuoi salvare? avviso in caso di modifiche al database in sospeso. Inoltre, come si vede nell'esempio di chiusura della finestra della console, EXIT_FORM può essere utile per chiudere tutte le finestre che avviano l'uscita da un particolare modulo. SuggerimentoLa chiamata al SET_WINDOW_PROPERTY integrato con la proprietà VISIBILE impostato su FALSO chiude (nasconde) la finestra solo se la finestra non contiene elementi navigabili o se lo stile della finestra è Documento. Se la finestra contiene almeno un elemento navigabile o lo stile della finestra è Finestra di dialogo, la finestra rimane visualizzata a meno che e fino a quando l'utente non esce dalla finestra in modo esplicito. Inoltre, se la finestra è modale, l'unico modo per uscire è tramite la navigazione esplicita. Questo può essere risolto personalizzando la p_close_window procedura come descritto nell'esempio precedente.