Fönsterhantering i Oracle D2k Forms
Det här avsnittet presenterar två mycket användbara tekniker för fönsterhantering i Oracle D2k Forms:att stänga ett aktivt fönster genom att klicka på den övre högra x-ikonen och ändra storlek, flytta om och stänga alla öppna aktiva fönster i ett formulär. Det förra är ett mycket uppskattat användarkrav som Oracle Forms saknar; det är i strikt överensstämmelse med alla vanliga Windows-program. Den andra tekniken är en generisk rutin för att minimera programmeringsansträngningen, såväl som slutanvändarens ansträngning, genom att stänga varje öppet fönster individuellt.Stänga ett fönster med x-ikonen
Att stänga ett fönster genom att klicka på x-ikonen i det övre högra hörnet är en ofta nödvändig funktion och även standard Windows-funktionalitet. Även om denna teknik ignoreras av Formulär, kan du uppnå den med hjälp av några rader kod. För att göra det, skriv en NÄR-FÖNSTER-STÄNGD trigger och navigera ut genom fönstret eller avsluta formuläret vid behov genom att kontrollera efter :SYSTEM.EVENT_WINDOW. Till exempel, för att avsluta ett formulär genom att klicka på x när det aktiva fönstret är konsolfönstret (som vanligtvis är WINDOW1 ), proceduren p_close_window kan kodas enligt följande: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;Denna procedur är generisk i den meningen att den kan användas för att stänga vilket fönster som helst, inte bara konsolfönstret. En formulärspecifik nyckelutgång kan skrivas för att ta hand om någon speciell kontroll innan du stänger det specifika formuläret genom att klicka på x-ikonen.
Ändra storlek, flytta om och stänga alla fönster
Barnfönster med staplade dukar krävs mycket ofta i en form för att visa information som blir en del av det primära fönstret. Till exempel kan en urvalslista visas i det primära fönstret, och efterföljande detaljer och underdetaljer kan finnas i en eller flera staplade dukar som innehas av underordnade fönster. Dynamiskt ändra storlek, flytta eller stänga vart och ett av dessa fönster är viktigt när flera fönster måste visas samtidigt. Detta kräver en betydande mängd kod. Denna teknik tillhandahåller en generisk rutin för att ändra storlek på, omplacera och stänga ett givet fönster i en enda form, vilket sparar programmeraren den tid och ansträngning som krävs för att skriva den väsentliga koden som krävs. TipsHändelsefönstret bör ha close_allowed, ändra storlek_tillåtet, och move_allowed egenskaper inställda på Ja/True vid designtid. Detta är nödvändigt för att aktivera standardfunktionerna för stängning, storleksändring och ompositionering. Procedurer för storleksändring och omplacering av alla fönster kan skrivas på liknande rader: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;De två föregående procedurerna och den som ges i föregående avsnitt kan generaliseras till en genom att lägga till en extra parameter med namnet 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;Anropet till p_close_window kan ersättas av p_action_window enligt följande:
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;Koden för var och en av de tre procedurerna p_close_window, p_resize_window, och p_reposition_window kan anpassas för att hantera applikationsspecifik logik. Till exempel, koden för p_close_window proceduren kan anpassas för att innehålla anrop för att initiera explicit navigering ut från respektive fönster, såsom GO_ITEM eller GO_BLOCK, vilket kommer att göra det möjligt för det fönstret att stängas och även skicka en Vill du spara? varning vid väntande databasändringar. Dessutom, som ses i exemplet med att stänga konsolfönstret, EXIT_FORM kan vara till hjälp för att stänga alla fönster som initierar att avsluta en viss form. Tips Anropet till den inbyggda SET_WINDOW_PROPERTY med egenskapen VISIBLE inställd på FALSK stänger (döljer) fönstret endast om fönstret inte har några navigerbara objekt i sig eller fönsterstilen är Dokument. Om fönstret har minst ett navigerbart objekt i sig, eller fönsterstilen är Dialog, förblir fönstret visat om inte och tills användaren uttryckligen navigerar ut ur fönstret. Dessutom, om fönstret är modalt, är det enda sättet att avsluta genom explicit navigering. Detta kan skötas genom anpassning av p_close_window procedur enligt beskrivningen i föregående exempel.