Gerenciamento de janelas no Oracle D2k Formulários
Esta seção apresenta duas técnicas muito úteis de gerenciamento de janelas no Oracle D2k Forms:fechar uma janela ativa clicando no ícone x superior direito e redimensionar, reposicionar e fechar qualquer janela ativa aberta em um formulário. O primeiro é um requisito de usuário muito apreciado que o Oracle Forms não possui; está em estrita conformidade com qualquer aplicativo padrão do Windows. A segunda técnica é uma rotina genérica para minimizar o esforço de programação, bem como o esforço do usuário final, ao fechar cada janela aberta individualmente.Fechando uma janela com o ícone x
Fechar uma janela clicando no ícone x no canto superior direito é um recurso frequentemente necessário e também uma funcionalidade padrão do Windows. Embora essa técnica seja ignorada pelo Forms, você pode consegui-la por meio de algumas linhas de código. Para isso, escreva um WHEN-WINDOW-CLOSED acionador e navegue para fora da janela ou saia do formulário conforme necessário verificando :SYSTEM.EVENT_WINDOW. Por exemplo, para sair de um formulário clicando em x quando a janela ativa for a janela do console (que geralmente é WINDOW1 ), o procedimento p_close_window pode ser codificado da seguinte forma: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 procedimento é genérico no sentido de que pode ser usado para fechar qualquer janela, não apenas a janela do console. Uma saída de tecla específica de formulário pode ser escrita para cuidar de qualquer verificação especial antes de fechar aquele formulário específico clicando no ícone x.
Redimensionando, reposicionando e fechando qualquer janela
Janelas filhas com telas empilhadas são muitas vezes necessárias em um formulário para exibir informações que se tornam parte da janela principal. Por exemplo, uma lista de seleção pode ser exibida na janela principal e os detalhes e subdetalhes subsequentes podem aparecer em uma ou mais telas empilhadas mantidas por janelas filhas. Redimensionar, reposicionar ou fechar dinamicamente cada uma dessas janelas é essencial quando várias janelas devem ser exibidas ao mesmo tempo. Isso requer uma quantidade significativa de código. Essa técnica fornece uma rotina genérica para redimensionar, reposicionar e fechar qualquer janela em um único formulário, economizando assim ao programador o tempo e o esforço necessários para escrever o código substancial necessário. DicaA janela do evento deve ter o close_allowed, resize_allowed, e move_allowed propriedades definidas como Sim/Verdadeiro na hora do projeto. Isso é necessário para habilitar os recursos padrão de fechamento, redimensionamento e reposicionamento. Procedimentos para redimensionar e reposicionar qualquer janela podem ser escritos em linhas semelhantes: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;Os dois procedimentos anteriores e o fornecido na seção anterior podem ser generalizados em um, adicionando um parâmetro extra chamado 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;A chamada para p_close_window pode ser substituído por p_action_window da seguinte forma:
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;O código para cada um dos três procedimentos p_close_window, p_resize_window, e p_reposition_window pode ser personalizado para lidar com a lógica específica do aplicativo. Por exemplo, o código para a p_close_window procedimento pode ser personalizado para conter chamadas para iniciar a navegação explícita para fora da respectiva janela, como GO_ITEM ou GO_BLOCK, que permitirá que essa janela feche e também lançará um Deseja salvar? alerta em caso de alterações pendentes no banco de dados. Além disso, como visto no exemplo de fechamento da janela do console, EXIT_FORM pode ser útil para fechar todas as janelas que iniciam a saída de um formulário específico. DicaA chamada para o SET_WINDOW_PROPERTY integrado com a propriedade VISÍVEL definido como FALSO fecha (esconde) a janela somente se a janela não tiver itens navegáveis ou o estilo da janela for Documento. Se a janela tiver pelo menos um item navegável nela, ou o estilo da janela for Diálogo, a janela permanecerá exibida a menos e até que o usuário navegue explicitamente para fora da janela. Além disso, se a janela for modal, a única maneira de sair é por meio de navegação explícita. Isso pode ser resolvido pela personalização do p_close_window procedimento conforme descrito no exemplo anterior.