Manajemen Jendela di Oracle D2k Formulir
Bagian ini menyajikan dua teknik manajemen jendela yang sangat berguna di Oracle D2k Forms:menutup jendela aktif dengan mengklik ikon x kanan atas dan mengubah ukuran, memposisikan ulang , dan menutup jendela aktif apa pun yang terbuka dalam formulir. Yang pertama adalah persyaratan pengguna yang sangat dihargai yang tidak dimiliki Oracle Forms; itu sangat sesuai dengan aplikasi Windows standar apa pun. Teknik kedua adalah rutinitas umum untuk meminimalkan upaya pemrograman, serta upaya pengguna akhir, dalam menutup setiap jendela yang terbuka satu per satu.Menutup Jendela dengan Ikon x
Menutup jendela dengan mengklik ikon x di sudut kanan atas adalah fitur yang sering dibutuhkan dan juga fungsionalitas standar Windows. Meskipun teknik ini diabaikan oleh Formulir, Anda dapat mencapainya melalui beberapa baris kode. Untuk melakukannya, tulis WHEN-WINDOW-CLOSED pemicu, dan navigasikan keluar jendela atau keluar dari formulir seperlunya dengan memeriksa :SYSTEM.EVENT_WINDOW. Misalnya, untuk keluar dari formulir dengan mengklik x ketika jendela aktif adalah jendela konsol (yang umumnya WINDOW1 ), prosedur p_close_window dapat dikodekan sebagai berikut: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;Prosedur ini umum dalam arti bahwa prosedur ini dapat digunakan untuk menutup jendela apa pun, bukan hanya jendela konsol. Keluar dari kunci khusus formulir dapat ditulis untuk menangani pemeriksaan khusus sebelum menutup formulir tertentu dengan mengklik ikon x.
Mengubah Ukuran, Memosisikan Ulang, dan Menutup Semua Jendela
Jendela anak memegang kanvas bertumpuk sangat sering diperlukan dalam bentuk untuk menampilkan informasi yang menjadi bagian dari jendela utama. Misalnya, daftar pilihan mungkin ditampilkan di jendela utama, dan detail serta subdetail berikutnya mungkin muncul di satu atau beberapa kanvas bertumpuk yang dipegang oleh jendela anak. Mengubah ukuran, memposisikan ulang, atau menutup secara dinamis setiap jendela ini sangat penting ketika beberapa jendela harus ditampilkan secara bersamaan. Ini membutuhkan sejumlah besar kode. Teknik ini menyediakan rutinitas umum untuk mengubah ukuran, memposisikan ulang, dan menutup jendela apa pun dalam satu bentuk, sehingga menghemat waktu dan upaya pemrogram yang diperlukan untuk menulis kode substansial yang diperlukan. TipJendela acara harus memiliki close_allowed, mengubah ukuran_diizinkan, dan move_allowed properti disetel ke Ya/Benar pada waktu desain. Ini diperlukan untuk mengaktifkan fitur penutupan, pengubahan ukuran, dan pemosisian ulang default. Prosedur untuk mengubah ukuran dan memposisikan ulang jendela apa pun dapat ditulis pada baris yang sama: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;Dua prosedur sebelumnya dan yang diberikan di bagian sebelumnya dapat digeneralisasi menjadi satu dengan menambahkan parameter tambahan bernama 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;Panggilan ke p_close_window dapat diganti dengan p_action_window sebagai berikut:
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;Kode untuk masing-masing dari tiga prosedur p_close_window, p_resize_window, dan p_reposition_window dapat dikustomisasi untuk menangani logika khusus aplikasi. Misalnya, kode untuk p_close_window prosedur dapat disesuaikan untuk memuat panggilan untuk memulai navigasi eksplisit keluar dari jendela masing-masing, seperti GO_ITEM atau GO_BLOCK, yang akan memungkinkan jendela itu untuk menutup dan juga melempar Apakah Anda ingin menyimpan? waspada jika ada perubahan basis data yang tertunda. Juga, seperti yang terlihat pada contoh menutup jendela konsol, EXIT_FORM dapat membantu dalam menutup semua jendela yang memulai keluar dari formulir tertentu. TipPanggilan ke SET_WINDOW_PROPERTY . bawaan dengan properti VISIBLE setel ke FALSE menutup (menyembunyikan) jendela hanya jika jendela tersebut tidak memiliki item yang dapat dinavigasi di dalamnya atau gaya jendelanya adalah Dokumen. Jika jendela memiliki setidaknya satu item yang dapat dinavigasi di dalamnya, atau gaya jendela adalah Dialog, jendela tetap ditampilkan kecuali dan hingga pengguna secara eksplisit menavigasi keluar jendela. Juga, jika jendela adalah modal, satu-satunya cara untuk keluar adalah melalui navigasi eksplisit. Ini dapat diatasi dengan penyesuaian p_close_window prosedur seperti yang diuraikan dalam contoh sebelumnya.