Тема: Динамическое формирование списка связанного с предыдущим выбором

Имеем одну форму, в которой два списка и второй должен динамически меняться в зависимости от выбора в первом. Как это сделать?

Re: Динамическое формирование списка связанного с предыдущим выбором

В качестве варианта. Проверял на 2004.
Файл tmp.dcl

tmp
:dialog {
  :popup_list {key="first_list";  width=20; "Выбирай\nЕдиницы\nДесятки";
  action=
   "(cond"
     "((= \"1\" $value) (start_list \"second_list\") (mapcar 'add_list '(\"01\" \"02\" \"03\" \"04\" \"05\" \"06\" \"07\" \"08\" \"09\")) (end_list))"
     "((= \"2\" $value) (start_list \"second_list\") (mapcar 'add_list '(\"10\" \"20\" \"30\" \"40\" \"50\" \"60\" \"70\" \"80\" \"90\")) (end_list)))"
   ;}
  :popup_list {key="second_list"; width=20; list="";}
ok_only;
}

Файл temp.lsp

(defun test_dcl ( / ID_dcl num what )
  (setq ID_dcl (load_dialog "c:\\tmp.dcl"))
  (new_dialog "tmp" ID_dcl)
  (start_dialog)
  (unload_dialog ID_dcl)
) ; defun

Re: Динамическое формирование списка связанного с предыдущим выбором

а как записать дополнительно изменения в edit_box?

Re: Динамическое формирование списка связанного с предыдущим выбором

кстати если задается больше 6 элементов, прога слетает, этого можно как-нить избежать?

Re: Динамическое формирование списка связанного с предыдущим выбором

> Novichek
С помощью (action_tile ...) с ключом для своего edit_box.

Novichek пишет:

кстати если задается больше 6 элементов, прога слетает, этого можно как-нить избежать?

Больше "6 элементов" чего? Научись вопросы задавать. А то будешь долго обижаться на участников форума, что "злые и не добрые".
На предыдущий пост "Можно ли упростить работу со списками" ответа можешь долго ждать: ничего не понятно из твоего вопроса.
В теле программы нет ни одного списка. А показывать на пальцах за тысячи километров бесполезно.

Re: Динамическое формирование списка связанного с предыдущим выбором

6 элементов списка в функции "(cond"

:popup_list{key="PROJECT";label= "Номер проекта";width= 10;height=3;list="\n2764 (2433)\n2750\n2768 (1740)\n2769 (2215)\n2766 (2434)\n2721\n2451\n2715 (1323)\n2726\n 2450\n2561\n2717 (2718)\n2773 (2688)\n2771 (2193)\n2244 (2772)\n2642\n2643";
   action=
   "(cond"
     "((= \"0\" $value) (start_list \"MARKA\") (mapcar 'add_list '(\"11\")) (end_list))"
     "((= \"1\" $value) (start_list \"MARKA\") (mapcar 'add_list '(\"11\")) (end_list))"
     "((= \"2\" $value) (start_list \"MARKA\") (mapcar 'add_list '(\"11\")) (end_list))"
     "((= \"3\" $value) (start_list \"MARKA\") (mapcar 'add_list '(\"9\")) (end_list))"
     "((= \"4\" $value) (start_list \"MARKA\") (mapcar 'add_list '(\"9\")) (end_list))"
     "((= \"5\" $value) (start_list \"MARKA\") (mapcar 'add_list '(\"9\")) (end_list)))";

если значение больше чем "((= \"5\" $value), т.е. 6 элемент первого списка, то все слетает: "неверно сформирванный список на входе"
а так все прекрасно работает.

Re: Динамическое формирование списка связанного с предыдущим выбором

с (action_tile ...) не совсем понятно. там значения должны меняться также динамически. Т.е. при выборе значения из первого списка, изменяются 3 поля: значение во 2м списке, и значения в 2х edit_box'ах.

Re: Динамическое формирование списка связанного с предыдущим выбором

> Novichek
Скорее всего это связано с ограничением на длину строки для атрибута action.

> Novichek
Соответственно, если правильно понял, надо сделать через (action_tile ...).
Файл меню:

tmp
:dialog {width= 33;
:popup_list {
  key="PROJECT";
  label= "Номер проекта";
  list="2764 (2433)\n2750\n2768 (1740)\n2769 (2215)\n2766 (2434)\n2721\n2451\n2715 (1323)\n2726\n2450\n2561\n2717 (2718)\n2773 (2688)\n2771 (2193)\n2244 (2772)\n2642\n2643";
  }
:popup_list {key="MARKA"; list="11"; width=25;}
:edit_box {key="edit1"; value="MARKA 11"; width=25;}
:edit_box {key="edit2"; value="marka 11"; width=25;}
ok_only;
}

Файл программы:

(defun tmp ( / ID_dcl pr_val )
  (setq ID_dcl (load_dialog "c:\\tmp.dcl"))
  (new_dialog "tmp" ID_dcl)
  (action_tile "PROJECT" "(setq pr_val $value) (tmp1)")
  (start_dialog)
  (unload_dialog ID_dcl)
) ; defun tmp
(defun tmp1 ( / )
  (cond
    ((= "0" pr_val) (start_list "MARKA") (add_list "11") (end_list) (set_tile "edit1" "MARKA 11") (set_tile "edit2" "marka 11"))
    ((= "1" pr_val) (start_list "MARKA") (add_list "11") (end_list) (set_tile "edit1" "MARKA 11") (set_tile "edit2" "marka 11"))
    ((= "2" pr_val) (start_list "MARKA") (add_list "11") (end_list) (set_tile "edit1" "MARKA 11") (set_tile "edit2" "marka 11"))
    ((= "3" pr_val) (start_list "MARKA") (add_list "9") (end_list) (set_tile "edit1" "MARKA 9") (set_tile "edit2" "marka 9"))
    ((= "4" pr_val) (start_list "MARKA") (add_list "9") (end_list) (set_tile "edit1" "MARKA 9") (set_tile "edit2" "marka 9"))
    ((= "5" pr_val) (start_list "MARKA") (add_list "9") (end_list) (set_tile "edit1" "MARKA 9") (set_tile "edit2" "marka 9"))
    ((= "6" pr_val) (start_list "MARKA") (add_list "9") (end_list) (set_tile "edit1" "MARKA 9") (set_tile "edit2" "marka 9"))
    ((= "7" pr_val) (start_list "MARKA") (add_list "10") (end_list) (set_tile "edit1" "MARKA 10") (set_tile "edit2" "marka 10"))
    ((= "8" pr_val) (start_list "MARKA") (add_list "10") (end_list) (set_tile "edit1" "MARKA 10") (set_tile "edit2" "marka 10"))
  ) ; cond
) ; defun tmp1