Программирование диалоговых окон на языке DCL
Работа со списками list_box
Составьте файл List.dcl с описанием диалогового окна с двумя списками в верхнем ряду и кнопкой ОК и Cancel в нижнем ряду. Сохраните его в папке …\Support.
list: dialog {label = "Работа со списками list_box"; : column { : boxed_row {: text { key = "text1"; value = "Nothing selected"; }} : boxed_row { : list_box {key = "mylist1"; label ="Choose Item"; height = 9; width = 8; multiple_select = false; fixed_width_font = true; list="Лимон\nЛист\nНебо\nСажа\nСнег\nЯблоко";} : boxed_row { : popup_list { key = "mylist2"; label ="Choose Color"; width = 8; multiple_select = false; fixed_width_font = true; list="red\nyellow\ngreen\ncyan\nwhite\nblack";}}} : boxed_row { : button { key = "accept"; label = "Okey "; is_default = true; } : button { key = "cancel";label = "Cancel "; is_default = false; is_cancel = true; }} } }
Заполнение спискoв здесь произведено с помощью атрибута list. Однако, если бы мы написали атрибуты value = "";, то списки были бы пустыми. В этом случае они заполняются при запуске файла List.lsp так, как это показано ниже.
Составьте теперь загрузочный файл List.lsp. Строки, относящиеся к загрузке списков, закомментированы. Если списки уже заполнены, то эти строки можно удалить. Если их раскомментировать, то старое содержимое в списках будет удалено, а новые записи установлены.
(defun C:list () ;;; (setq myList1(list "Лимон" "Лист" "Небо" " Сажа" "Снег" "Яблоко")) ;;; (setq myList2(list "red" "yellow" "green" "cyan" "white" "black")) ;;;--- Load the dcl file (setq dcl_id (load_dialog "list.dcl")) ;;;--- Load the dialog definition if it is not already loaded (if (not (new_dialog "list" dcl_id)) (progn (alert "The List.DCL file could not be loaded!") (exit) ) ) ;;; (start_list "mylist1" 3) ;;; (mapcar 'add_list myList1) ;;; (end_list) ;;; (start_list "mylist2" 3) ;;; (mapcar 'add_list myList2) ;;; (end_list) ;;;--- If an action event occurs, do this function (action_tile "mylist2" "(saveVars)") (action_tile "accept" "(setq ddiag 2)(done_dialog)") (action_tile "cancel" "(setq ddiag 1)(done_dialog)") ;;;--- Display the dialog box (start_dialog) ;;;--- Unload the dialog box (unload_dialog dcl_id) ;;;--- If the user pressed the Cancel button (if(= ddiag 1) (princ "\n List cancelled!") ) ;;;--- If the user pressed the Okay button (if(= ddiag 2) (progn (princ "\n The user pressed Okay!") ) ) (princ)) (defun saveVars () (setq numstrlist (atoi (get_tile "mylist1"))) (princ numstrlist) (setq word_list (cond ((= numstrlist 0) "Лимон") ((= numstrlist 1) "Лист") ((= numstrlist 2) "Небо") ((= numstrlist 3) "Сажа") ((= numstrlist 4) "Снег") ((= numstrlist 5) "Яблоко") (Т "") ) ;_конец cond ) ;_ конец setq (setq numstrpop (atoi (get_tile "mylist2"))) (princ numstrpop) (setq word_pop (cond ((= numstrpop 0) "red") ((= numstrpop 1) "yellow") ((= numstrpop 2) "green") ((= numstrpop 3) "cyan") ((= numstrpop 4) "white") ((= numstrpop 5) "black") (Т "") ) ;_конец cond ) ;_ конец setq (setq myStr (strcat word_list " имеет цвет " word_pop)) (set_tile "text1" myStr) )
В этот же файл занесена функция saveVars, которая определяет отклики на события диалогового окна. Событие состоит в выборе слова в левом списке и слова в правом списке. Оба выбранных слова занесем в строку text по щелчку в правом списке. Если щелкнуть по кнопке ОК, то окно закроется.
При чтении значения списка функция get_tile возвращает номер строки, которые нумеруются с нуля. Поэтому далее нужно в цикле или с помощью функции cond найти соответствие между номером строки и значением элемента.
Диалоговое окно списков показано на рис. 6.5. Выбранная запись отражена в нередактируемом текстовом поле text в верхней части окна.
Работа с элементами toggle
Составьте программу построения диалогового окна с колонкой флажков. Сохраните файл как …\Support\Toggle.dcl
Toggle: dialog { label = "Работа с элементами toggle"; : column {: boxed_row { : text { key = "text1"; value = "Nothing selected"; }} : boxed_column { label = "Choose your lucky charms:"; : toggle { key = "tog1";label = "Hearts"; value = "0";} : toggle { key = "tog2";label = "Moons"; value = "0";} : toggle { key = "tog3";label = "Stars"; value = "0";} : toggle { key = "tog4";label = "Clovers";value = "0";} } : boxed_row { : button { key = "accept"; label = "Okey "; is_default = true; } : button { key = "cancel";label = "Cancel "; is_default = false; is_cancel = true; }} }}
Теперь составьте файл загрузки и обработки Toggle.lsp. В этом файле создано две функции: chkToggle и Toggle:
(defun chkToggle() (setq tog1(atoi(get_tile "tog1"))) // 0 = not chosen 1 = chosen (setq tog2(atoi(get_tile "tog2"))) // 0 = not chosen 1 = chosen (setq tog3(atoi(get_tile "tog3"))) // 0 = not chosen 1 = chosen (setq tog4(atoi(get_tile "tog4"))) // 0 = not chosen 1 = chosen (setq myStr "") (if(= tog1 1)(setq myStr(strcat myStr " Hearts"))) (if(= tog2 1)(setq myStr(strcat myStr " Moons"))) (if(= tog3 1)(setq myStr(strcat myStr " Stars"))) (if(= tog4 1)(setq myStr(strcat myStr " Clovers"))) ;;;--- If nothing was selected... (if(= myStr "")(setq myStr "Nothing Selected!")) ;;;--- Now set the text control to display the string (set_tile "text1" myStr) ) (defun C:Toggle() ;;;--- Load the dcl file (setq dcl_id (load_dialog "Toggle.dcl")) ;;;--- Load the dialog definition if it is not already loaded (if (not (new_dialog "Toggle" dcl_id) ) (exit)) ;;;--- If an action event occurs, do this function (action_tile "tog1" "(chkToggle)") (action_tile "tog2" "(chkToggle)") (action_tile "tog3" "(chkToggle)") (action_tile "tog4" "(chkToggle)") (action_tile "cancel" "(done_dialog)") ;;;--- Display the dialog box (start_dialog) ;;;--- Unload the dialog box (unload_dialog dcl_id) ;;;--- Suppress the last echo for a clean exit (princ))
Ha экране диалоговое окно выглядит так, как на рис. 6.6.