Тема: Считывание из таблицы

Считывание из таблицы
Кака считать данные из таблицы, состоящей из edit_box?
Таблица  из файла tabl.dcl (по мотивам темы  Как можно создать диалог с таблицей )

table: dialog{label="Редактирование";
//шапка
:column{
  :row{
    :edit_box{vertical_margin=none; horizontal_margin=none; edit_width=7; key="a0";}
    :edit_box{vertical_margin=none; horizontal_margin=none; edit_width=18; key="b0";}
    :edit_box{vertical_margin=none; horizontal_margin=none; edit_width=27; key="c0";}
    :edit_box{vertical_margin=none; horizontal_margin=none; edit_width=13; key="d0";}
  }
//...
//a6...d6
//dcl-файл будет генерироваться в соответствии с числом строк (count, см.ниже)
}
spacer;
 ok_cancel;
}

Заполняется в файле table.lsp  из списков list_id...list_dtx

(defun edit_param ( ) ;пока все глобальные
(if (< (setq dcle_id (load_dialog "table.dcl")) 0)(progn (alert "Не найден dcl")(exit)))
(if (not (new_dialog "table" dcle_id)) (progn (alert "не загружается диалог")(exit)))
(setq i 0)
(repeat count
 (if (setq fde1 (nth i list_fde))
          (progn
               (set_tile (strcat "a" (itoa i))   (nth i list_id))
               (set_tile (strcat "b" (itoa i))   (nth i list_name))
               (set_tile (strcat "c" (itoa i))   (nth i list_prompt))
               (set_tile (strcat "d" (itoa i))   (nth i list_dtx))
               (setq i (1+ i))
           ) ;progn
   ) ;if
 );repeat

ДО СИХ ПОР РАБОТАЕТ
Содержимое полей редактируется. Нужно сохранить в список по строкам отредактированные значения полей (( a0,...,d0) ... (a6,...d6))
Пытаюсь считывать текущие значения полей

(setq j 0)
     (repeat count
        (action_tile (strcat "a" (itoa j)) "(setq a  (read $value))")
        (action_tile (strcat "b" (itoa j)) "(setq b $value)")
        (action_tile (strcat "c" (itoa j))  "(setq c  $value)")
        (action_tile (strcat "d" (itoa j)) "(setq d (read $value))")
        (setq list_abcd (append list_abcd  (list a b c d )))
(setq j (1+ j))
     ) ;repeat

;;;Список list_abcd затеян для того, чтобы, если возможно, избежать get_tile , с его ;;;малопонятными \"name\", поставив  action_tile "accept" перед началом цикла по j.
   Пытаюсь читать содержимое полей и формировать список с отредактированными значениями

(action_tile "accept"
(setq i 0)
   (repeat count
      (strcat
        "(setq a1 (get_tile (strcat "a" (itoa i))))"
        "(setq b1  (get_tile (strcat "b" (itoa i)))"
        "(setq c1 (get_tile (strcat "c" (itoa i)))"
        "(setq d1  (get_tile (strcat "d" (itoa i)))"
        "(setq list_tab (append list_tab (list a1 b1 c1 d1 )))"
        "(done_dialog)"
      ) strcat
     (setq i (1+ i))
    ) ;repeat
);"accept"
(action_tile "cancel" "(done_dialog)")
(start_dialog)
       (unload_dialog dcle_id)
) ;defun

ВОПРОСЫ
1. Нужны ли мне в этом случае action_tile и get_tile (оба)?
2. Как правильно формировать в цикле выражение для get_tile  и искомый список

Re: Считывание из таблицы

> novic
1. Напиши функцию которая считает (get_tile) все нужные поля и сформирует список по нажатию ОК.

...
(action_tile "accept" "(OK_push)"...)
(defun OK_push ()
;тут считай все поля как угодно..в цикле..без цикла...и составь необходимый список
)

2. Нет необходимости геттайлить едитбоксы при редактировании их значений. Важен список конечных значений, насколько я понял.

Re: Считывание из таблицы

> Стас
Таким образом, я могу обойтись action_tile ? Беда в том, что список

(setq list_abcd (append list_abcd  (list a b c d )))

формируется в виде (nil nil nil nil)  и непонятно, в чем дело. Может, кто-нибудь видит?

Re: Считывание из таблицы

По приведенному коду a, b, с и d не определены. Может, надо a0, b0 и т.д.?

Re: Считывание из таблицы

> kpblc
Разве

(action_tile (strcat "a" (itoa j)) "(setq a  (read $value))")

не присваивает переменной а текущее значение поля а(j) ?

Re: Считывание из таблицы

> kpblc
Точнее, "разве не должна присваивать переменной a текущее значение a(j)". Она почему-то не присваивает.

 !a
nil

Re: Считывание из таблицы

(action_tile (strcat "a" (itoa j)) "(setq a $value)")

Так не пробовали?

Re: Считывание из таблицы

> Стас
В таком виде у меня вторая строчка

(action_tile (strcat "b" (itoa j)) "(setq b $value)")

, а read для того, чтобы читать до первого пробела.

Re: Считывание из таблицы

> Стас
Написание отдельной функции OK_push () дает некоторый результат, но в писок заносятся только те поля, которые изменялись:

(defun OK_push () ;;; Действия по клавише ОК
;тут считай все поля как угодно..в цикле..без цикла...и составь необходимый список
(setq  list_abcd nil)
 (setq j 0)
     (repeat count
        (action_tile (strcat "a" (itoa j)) "(setq a  (read $value))")
        (action_tile (strcat "b" (itoa j)) "(setq b $value)")
        (action_tile (strcat "c" (itoa j))  "(setq c  $value)")
        (action_tile (strcat "d" (itoa j)) "(setq d (read $value))")
        (setq list_abcd (append list_abcd  (list a b c d )))
        (setq j (1+ j))
     ) ;repeat
) ;defun

Вызывается в

(action_tile "accept" (strcat "(OK_push)" "(done_dialog)"))

И дает

Command: !list_abcd
(nil nil "Фаска22" nil nil nil "Фаска22" nil nil nil "Фаска22" nil nil nil
"Фаска22" nil nil nil "Фаска22" nil)

Или все-таки формировать get_tile?

Re: Считывание из таблицы

;;; Считывание в/из приведенной выше таблицы.
(defun edit_param ( / dcle_id step_e pt_e  i )
(if (< (setq dcle_id (load_dialog "table.dcl")) 0)(progn (alert "Не найден dcl")(exit)))
(if (not (new_dialog "table" dcle_id)) (progn (alert "не загружается диалог")(exit)))
  (setq i 0)
;;; Заполнение списков диалогового окна из ассоциированного списка list_fde,
;;;списка list_id и др, сформированных не здесь
(repeat count
(if (setq fde1 (nth i list_fde))
             (progn
                (set_tile (strcat "a" (itoa i))  (nth i list_id))
                (set_tile (strcat "b" (itoa i))  (nth i list_name))
                (set_tile (strcat "c" (itoa i))  (nth i list_pr))
                (set_tile (strcat "d" (itoa i))  (nth i list_dtx))
                (setq i (1+ i))
              ) ;progn
  ) ;if
);repeat
     (action_tile "accept" (strcat "(OK_push)" "(done_dialog)"))
     (action_tile "cancel" "(done_dialog)")
               (start_dialog)
               (unload_dialog dcle_id)
(princ)
) ;defun
(defun OK_push ( / i  a b c d  list_tab) ;;; Действия по клавише ОК
;;; считать все поля и составить необходимый список
(setq  list_tab nil)
(setq i 0)
     (while (<  i count)
        (setq a (get_tile (strcat "a" (itoa i))))
        (setq b  (get_tile (strcat "b" (itoa i))))
        (setq c (get_tile (strcat "c" (itoa i))))
        (setq d  (get_tile (strcat "d" (itoa i))))
        (setq list_tab (append list_tab (list a b c d )))
        (setq i (1+ i))
     ) ;while
  (princ list_tab)
) ;defun