Опубликован: 21.02.2012 | Доступ: свободный | Студентов: 2061 / 499 | Оценка: 4.20 / 4.40 | Длительность: 19:35:00
Специальности: Разработчик аппаратуры
Лекция 6:

Программирование диалоговых окон на языке 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 в верхней части окна.

 Окно с двумя списками

Рис. 6.5. Окно с двумя списками

Работа с элементами 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.

 Диалоговое окно с флажками

Рис. 6.6. Диалоговое окно с флажками
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

Здравствуйте.

Подскажите, пожалуйста, каким образом можно передать параметры в макрос написанный в Autocad на VBA? Например, есть процедура, которая отрисовывает заштрихованный прямоугольник (см. ниже). Как её изменить, чтобы на входе от пользователя требовалось ввести также в качестве параметров координаты углов прямоугольника?

Public Sub DrawHatchedBox()

...

End Sub