Тема: Помогите разобраться

Никак не могу понять почему не происходит отрисовка строки текста,выбранной из edit_box.Вернее текст отрисовывается,если переключиться на list_box выбрать там строку и вернуться обратно в edit_box.А вот отрисовка текста из list_box идет сразу.Привожу файлы dcl и lsp ниже.
[code]//---stroka.dcl------------------------------------------------
//--------------------------------------------------------------
//dcl_settings : default_dcl_settings { audit_level = 3; }
stxt : dialog {
    label = "Строка текста";
    : row {
     : boxed_radio_column {
             label = "Способ выбора";
        : radio_button {
                label = "Введите текст:";
                fixed_width = true;
                key = "on_s1txt";
         }
        : radio_button {
                label = "Выберите текст:";
                fixed_width = true;
                key = "on_s2txt";
        }
                      spacer_1;
     }
     : boxed_column {
             label = "Строка";
        : edit_box {
                key = "s1txt";
                fixed_width = true;
                edit_width = 19;
        }
        : list_box {
//                label = " ";
                key = "s2txt";
                height = 8;
        }
              spacer_1;
     }
    }
    : popup_list {
                label = "Высота текста:";
                key = "szpop_txt";
                list = "";
                edit_width = 5;
                fixed_width = true;
    }
   spacer_1;
   ok_cancel_help_info;
}
//***************************************************************
//------------------------------------------------------------------------
ab_text : dialog {
label = "О программе";
   : list_box {
        key = "ab_progr";
     height = 20;
      width = 58;
   }
  ok_only;
}
//-----------> THE END <----------------------------[code]
Сам лисп
[code];;;stroka.lsp
;;;-------------> HELP <------------------------------------------------
(defun ab_prog (ab_progr /)
  (if (not (new_dialog "ab_text" DCL_ID))
    (exit)
  )
  (start_list "ab_progr")
  (mapcar 'add_list ab_progr)
  (end_list)
  (action_tile "accept" "(done_dialog)")
  (start_dialog)
)
;;;-------------> WORKING FUNCTION <------------------------------------
(defun w_str (n stxt sz_t / a_txt p_txt)
  (setq a_txt stxt)
  (print n)
  (setq    p_txt (getpoint "\n Точка вставки"))
  (command "_.TEXT" p_txt sz_t "0" a_txt)
)
;;;-------------> MAIN FUNCTION <---------------------------------------
(defun c:stroka (/ $value s1txt s2txt siz a_sel sz_txt help_pr info_pr old_snap shrift clar NAMES oscor dialogLoaded dialogShow new_s1txt)
  (setq    old_snap (getvar "osmode")
    clar     (getvar "CLAYER")
    oscor     (getvar "OSNAPCOORD")
  )
  (setvar "osmode" 0)
  (setvar "cmdecho" 0)
  (setvar "OSNAPCOORD" 1)
  (setq    help_pr    (list
          " - отрисовка текста - " " "
          " Введите нужный текст или выберите из списка,"
          " выберете требуемую высоту шрифта (3,5-по умолчанию) "
         )
    info_pr    (list " - Программа отрисовка текста - ")
  )
  (setq    dialogLoaded T
    dialogShow   T
  )
;;; загрузка диалогового окна
  (if (= -1 (setq DCL_ID (load_dialog "stroka.dcl")))
    (progn
      (princ "\nНевозможно загрузить <stroka.dcl>")
      (setq dialogLoaded nil)
    )                    ;progn
  )                    ;if   
;;;Инициализируется окно диалога stxt   
  (if (and dialogLoaded
       (not (new_dialog "stxt" dcl_id))
      )                    ;and
    (progn
      (princ "\nНевозможно показать окно диалога")
      (setq dialogShow nil)
      (exit)
    ) ;_ end of progn
  ) ;_ end of if
;;; установки по умолчанию
  (setq    sz_txt    (rtos 3.5 2 2)    ;высота шрифта по умолчанию
    shrift    '("1.8" "2.5" "3.5" "5" "7" "10" "14" "20" "28" "40")
  )
  (setq    NAMES '("Текст1" "Текст2" "Текст3" "Текст4"))
;;; установки по умолчанию для диалогового окна
  (if (and dialogLoaded dialogShow)
    (progn
      (set_tile "on_s1txt" "1")        ;включает тайл "on_s1txt"
      (set_tile "s1txt" "См.п.1")    ;Инициализирует поле со значением s1txt по умолчанию
      (set_tile "sz_txt" sz_txt)
    )                    ;progn
  )
;;;формирование списков
  (start_list "s2txt")            ;Определяет имя списка тайла "s2txt"
  (mapcar 'add_list NAMES)        ;Определяет список
  (end_list)                ;конец обработки списка
  (start_list "szpop_txt")
  (mapcar 'add_list shrift)
  (end_list)
  (mode_tile "s1txt" 2)        ; Установить фокус ввода на тайл "s1txt"
  (mode_tile "s2txt" 1)        ; отключить тайл "s2txt"
  (mode_tile "s1txt" 3)         ;выделить содержимое
;;;назначение действий элементам окна
    (action_tile "s1txt" "(setq new_s1txt $value)")
    (action_tile
      "s2txt"
      "(setq siz (atof (get_tile \"s2txt\")))"
    )
    (action_tile
      "szpop_txt"
      "(setq sz_txt (nth (atoi $value) shrift))"
    )
    (action_tile
      "strelka"
      "(setq strelka (nth (atoi $value) nachalo))"
    )
    (action_tile
      "on_s1txt"
      "(progn (mode_tile \"s2txt\" 4)(mode_tile \"s2txt\" 1)
              (mode_tile \"s1txt\" 0)(mode_tile \"s1txt\" 2)(mode_tile \"s1txt\" 3)
              (setq a_sel 1))"
    )
    (action_tile
      "on_s2txt"
      "(progn (mode_tile \"s2txt\" 0)(mode_tile \"s2txt\" 2)
            (mode_tile \"s1txt\" 1)(setq a_sel 2))"
    )
  (action_tile "accept" "(done_dialog 1)")
  (action_tile "cancel" "(done_dialog 0)")
  (action_tile "help" "(ab_prog help_pr)")
  (action_tile "info" "(ab_prog info_pr)")
;;;отображение диалога
  (setq    what_next (start_dialog)
    sz_txt      (atof sz_txt))
  (setq siz (fix siz))
  (setq siz (nth siz NAMES))
;;; При правильном вводе и нажатии кнопки "Ok" - вызов функции
  (if (= 1 what_next)
    (cond ((= a_sel 1)
       (w_str a_sel new_s1txt sz_txt)
      )
      ((= a_sel 2)
       (w_str a_sel siz sz_txt)
      )
    )
  )
  (unload_dialog dcl_id)
  (setvar "cmdecho" 1)
  (setvar "osmode" old_snap)
  (setvar "CLAYER" clar)
  (setvar "OSNAPCOORD" oscor)
  (princ)
)
;;;---------> THE  END <------------------------------------------
[/code]

Re: Помогите разобраться

Для тупого исправления (чтобы просто работало):
на момент использования не определена переменная siz

(setq siz (fix siz))

, соответственно заменить строку для ключа "accept" на

(action_tile "accept" "(setq siz (atof (get_tile \"s2txt\")))(done_dialog 1)")

А вообще-то "мухи отдельно, котлеты отдельно", не обращаться к переменным в тех ветках программы, где они не используются.
И еще: не надо переменные DCL ($value и др.) засовывать в определение локальных переменных (defun c:stroka (/ $value ..... DCL сам распоряжается выделением памяти под них.
И еще пользуйтесь отладчиком LISP.
"Тщательно пережевывая пищу, ты помогаешь обществу" Ильф и Петров. Двенадцать стульев

Re: Помогите разобраться

Отладчиком пользуюсь,-никаких ошибок не было.Переменная siz у меня определяется в (action_tile "s2txt" "(setq siz ...
Сделал как советовали,все равно если сразу набрать текст в edit_box он не отрисовывается,нужно сначала переключиться на список и обратно,хотя строку в списке уже выбирать не надо...
Еще вопрос-как снять выделение со строки в списке после переключения на edit_box?

Re: Помогите разобраться

Загружаю в редактор то, что выложено в посте. Запускаю. Жму "ОК". Получаю сообщение: ; error: bad argument type: numberp: nil.
Это при вызове (setq siz (fix siz)), потому что siz = nil. И зачем делать (setq siz (atof (get_tile \"s2txt\"))), а потом обратно (setq siz (fix siz))?
(action_tile ...) назначенное на конкретный элемент диалога, выполняется при выборе мышкой и клавой. Если выходишь из меню по ОК с активного элемента, то и получаешь значение активного элемента. Если прошелся по пунктам "туда-сюда", то получил не обновленное значение индекса, а запомненное в переменной ранее, когда шел "туда". Чтобы получить значения всех необходимых полей на момент выхода из диалога, надо назначить get_tile или $value в (action_tile "accept" ...) см.справку AutoLisp->DCL->Assigning Actions to Tiles.

Re: Помогите разобраться

Юрий,попробуй измененный лисп.Если сразу после запуска нажать ОК,то ничего не происходит.А если выбрать строку из списка или переключится туда-сюда отрисовка сроки идет.Не могу понять почему сразу нет отрисовки сроки по-умочанию.

;;;stroka.lsp
;;;-------------> HELP <------------------------------------------------
(defun ab_prog (ab_progr /)
  (if (not (new_dialog "ab_text" DCL_ID))
    (exit)
  )
  (start_list "ab_progr")
  (mapcar 'add_list ab_progr)
  (end_list)
  (action_tile "accept" "(done_dialog)")
  (start_dialog)
)
;;;-------------> WORKING FUNCTION <------------------------------------
(defun w_str (n stxt sz_t / a_txt p_txt)
  (setq a_txt stxt)
  (print n)
  (setq p_txt (getpoint "\n Точка вставки"))
  (command "_.TEXT" p_txt sz_t "0" a_txt)
)
;;;-------------> MAIN FUNCTION <---------------------------------------
(defun c:stroka    (/        s1txt      s2txt      siz         a_sel
         sz_txt        help_pr    info_pr      old_snap   shrift
         clar        NAMES      oscor      dialogLoaded
         dialogShow new_s1txt
        )
  (setq    old_snap (getvar "osmode")
    clar     (getvar "CLAYER")
    oscor     (getvar "OSNAPCOORD")
  )
  (setvar "osmode" 0)
  (setvar "cmdecho" 0)
  (setvar "OSNAPCOORD" 1)
  (setq    help_pr    (list
          " - отрисовка текста - "
          " "
          " Введите нужный текст или выберите из списка,"
          " выберете требуемую высоту шрифта (3,5-по умолчанию) "
        )
    info_pr    (list " - Программа отрисовка текста - ")
  )
  (setq    dialogLoaded T
    dialogShow   T
  )
;;; загрузка диалогового окна
  (if (= -1 (setq DCL_ID (load_dialog "stroka.dcl")))
    (progn
      (princ "\nНевозможно загрузить <stroka.dcl>")
      (setq dialogLoaded nil)
    )                    ;progn
  )                    ;if    
;;;Инициализируется окно диалога stxt    
  (if (and dialogLoaded
       (not (new_dialog "stxt" dcl_id))
      )                    ;and
    (progn
      (princ "\nНевозможно показать окно диалога")
      (setq dialogShow nil)
      (exit)
    ) ;_ end of progn
  ) ;_ end of if
;;; установки по умолчанию
  (setq    sz_txt (rtos 3.5 2 2)        ;высота шрифта по умолчанию
    shrift '("1.8" "2.5" "3.5" "5" "7" "10" "14" "20" "28" "40")
  )
  (setq NAMES '("Текст1" "Текст2" "Текст3" "Текст4"))
;;; установки по умолчанию для диалогового окна
  (if (and dialogLoaded dialogShow)
    (progn
      (set_tile "on_s1txt" "1")        ;включает тайл "on_s1txt"
      (set_tile "s1txt" "См.п.1")    ;Инициализирует поле со значением s1txt по умолчанию
      (set_tile "sz_txt" sz_txt)
      (mode_tile "s1txt" 2)        ; Установить фокус ввода на тайл "s1txt"
      (mode_tile "s1txt" 3)        ;выделить содержимое
      (mode_tile "s2txt" 1)        ; отключить тайл "s2txt"
    )                    ;progn
  )
;;;формирование списков
  (start_list "s2txt")            ;Определяет имя списка тайла "s2txt"
  (mapcar 'add_list NAMES)        ;Определяет список
  (end_list)                ;конец обработки списка
  (start_list "szpop_txt")
  (mapcar 'add_list shrift)
  (end_list)
;;;назначение действий элементам окна
  (action_tile
    "szpop_txt"
    "(setq sz_txt (nth (atoi $value) shrift))"
  )
  (action_tile
    "on_s1txt"
    "(progn (mode_tile \"s2txt\" 4)(mode_tile \"s2txt\" 1)
              (mode_tile \"s1txt\" 0)(mode_tile \"s1txt\" 2)(mode_tile \"s1txt\" 3)(setq a_sel 1))"
  )
  (action_tile
    "on_s2txt"
    "(progn (mode_tile \"s2txt\" 0)(mode_tile \"s2txt\" 2)
            (mode_tile \"s1txt\" 1)(setq a_sel 2))"
  )
  (action_tile
   "accept"
   (strcat "(progn (setq new_s1txt (get_tile \"s1txt\"))"
            "(setq siz (atoi (get_tile \"s2txt\")))"
            "(done_dialog 1))"
  ))
  (action_tile "cancel" "(done_dialog 0)")
  (action_tile "help" "(ab_prog help_pr)")
  (action_tile "info" "(ab_prog info_pr)")
;;;отображение диалога
  (setq    what_next (start_dialog)
    sz_txt      (atof sz_txt)
  )
  (setq siz (nth siz NAMES))
;;; При правильном вводе и нажатии кнопки "Ok" - вызов функции
  (if (= 1 what_next)
    (cond ((= a_sel 1)
       (w_str a_sel new_s1txt sz_txt)
      )
      ((= a_sel 2)
       (w_str a_sel siz sz_txt)
      )
    )
  )
  (unload_dialog dcl_id)
  (setvar "cmdecho" 1)
  (setvar "osmode" old_snap)
  (setvar "CLAYER" clar)
  (setvar "OSNAPCOORD" oscor)
  (princ)
)
;;;---------> THE  END <------------------------------------------

Re: Помогите разобраться

Уважаемый getr. Ты на правильном пути.
Что не работает? Переменная a_sel после выхода из диалога равна nil.
Что такое action_tile? Это "реакция на раздражитель". Нажал на элемент управления (button, check_box, radio_button) получил то, что записано в action_tile для этого элемента (по определенному "key"); если не ткнул в элемент управления, то что прописано в action_tile выполняться не будет. Не путай с mode_tile. Это инициализация элементов управления. Поэтому и получается, что пройдя туда-сюда по меню, устанавливаются те переменные, которые прописаны в соответствующих action_tile.
Мой совет для твоего случая:
1. В action_tile на элементы управления прописать только действия, которые отвечают за отображение пунктов меню (подсветка элемента, запрет выбора, инициализация строки редактирования и т.п.).
2. В action_tile на кнопки (OK, cancel, help) прописать действия по получению состояний элементов управления и установки переменных в соответствующие значения.
Грубый пример.
Нажата кнопка ОК: получить значение высоты текста; получить состояние radio_button, если верх получить строку из text_box и установить переменную a_sel=1; если низ получить значение из list_box и установить a_sel=2. А лучше пропиши все действия в отдельной функции и получится компактно

(action_tile "accept" "(my_func)(done_dialog 1)")

У-у-х. Писать программу принципиально не буду, разбирайся сам, иначе до смысла не дойдешь.
Успехов.

Re: Помогите разобраться

Спасибо за информацию.Понял,что с наскока не получится,буду разбираться глубже...(если получится конечно).

Re: Помогите разобраться

Ну уж, если совсем не в моготу будет...
Обращайся. "Мы все учились понемногу..."