Тема: Возврат значении во вложенные окна

Помогите пожалуйста разобраться, я в этом деле новичок.
Вобщем написал на DCL диалог и программу на LISP, но, по непонятным для меня причинам, работать не хочет...
А смысл в следующем: появляется окошка с некоторыми выбираемыми из списка числами;
после выбора и нажатия кнопки расчёт происходит закрытия диалогового окошка (а) и открытие другого диалогового окошка  (b) c label'ом для текста равным посчитанному значению (+ g s ).
Программа доходит до первого окошка, а при нажатии на кнопку "Результат" выдает:
; error: quit / exit abort
Заранее спасибо
DCL-ка:
a:dialog{label="Пример";
    :popup_list{label="Число 1";edit_width=16;key="a1";list="2 \n4 \n6 \n8";value="2";}
    :popup_list{label="Число 2";edit_width=16;key="a2";list="3 \n5 \n7 \n9";value="3";}
:spacer{height=1;}
:ok_button{label="Результат"; key="accept"; fixed_width=true;}
         }
b:dialog{label="Результат";
    :column{label="Результат";
          :concatenation{
             :text_part{label="Значение";key="b1";}
             :text_part{label="";key="b2";}
                        }
            }
   spacer_1;
   ok_button;
        }
LSP-ик:
(defun c:cerr ( / e  )
(if (< (setq d (load_dialog "C:\\primer.dcl")) 0)(exit))
(if (not(new_dialog "a" d))(exit))
(action_tile "accept" "(f)")
(start_dialog)
)
;
;
(defun f ( / g s v  )
(setq g (atoi (get_tile "a1")))
(setq s (atoi (get_tile "a2")))
(setq v (itoa (+ g s )))
(unload_dialog d)
(if (< (setq n (load_dialog "C:\\primer.dcl")) 0)(exit))
(if (not(new_dialog "b" d))(exit))
(set_tile "b2"  v)
(start_dialog)
)

Re: Возврат значении во вложенные окна

Помогите пожалуйста разобраться, я в этом деле новичок.
Вобщем написал на DCL диалог и программу на LISP, но, по непонятным для меня причинам, работать не хочет...
А смысл в следующем: появляется окошка с некоторыми выбираемыми из спсика числами;
после выбора и нажатия кнопки расчёт происходит закрытия диалогового окошка (а) и открытие другого диалогового окошка  (b) c label'ом для текста равным посчитанному значению (+ g s ).
Программа доходит до первого окошка, а при нажатии на кнопку "Результат" выдает:
; error: quit / exit abort
Заранее спасибо
DCL-ка:
a:dialog{label="Пример";
    :popup_list{label="Число 1";edit_width=16;key="a1";list="2 \n4 \n6 \n8";value="2";}
    :popup_list{label="Число 2";edit_width=16;key="a2";list="3 \n5 \n7 \n9";value="3";}
:spacer{height=1;}
:ok_button{label="Результат"; key="accept"; fixed_width=true;}
         }
b:dialog{label="Результат";
    :column{label="Результат";
          :concatenation{
             :text_part{label="Значение";key="b1";}
             :text_part{label="";key="b2";}
                        }
            }
   spacer_1;
   ok_button;
        }
LSP-ик:
(defun c:cerr ( / e  )
(if (< (setq d (load_dialog "C:\\primer.dcl")) 0)(exit))
(if (not(new_dialog "a" d))(exit))
(action_tile "accept" "(f)")
(start_dialog)
)
;
;
(defun f ( / g s v  )
(setq g (atoi (get_tile "a1")))
(setq s (atoi (get_tile "a2")))
(setq v (itoa (+ g s )))
(unload_dialog d)
(if (< (setq n (load_dialog "C:\\primer.dcl")) 0)(exit))
(if (not(new_dialog "b" n))(exit))
(set_tile "b2"  v)
(start_dialog)
)

Re: Возврат значении во вложенные окна

и еще вопрос можно ли удалить свой пост и как )

Re: Возврат значении во вложенные окна

Поехали.
1. Списки для popup_list формируются с помощью start_list, end_list
2. Обязательно добавь кнопку, по которой будешь выходить из первого меню
3. popup_list возвращает строковую константу, в которой номер строки списка
С учетом этого получаем:

a:dialog{label="Пример";
:popup_list{label="Число 1"; edit_width=16; key="a1";}
:popup_list{label="Число 2"; edit_width=16; key="a2";}
:spacer{height=1;}
:ok_button{label="Результат"; key="accept"; fixed_width=true;}
:cancel_button{label="Выйти"; key="cencel"; fixed_width=true;}
}
b:dialog{label="Результат";
:column{label="Результат";
:concatenation{
:text_part{label="Значение";key="b1";}
:text_part{label="  ";key="b2";}
}
}
spacer_1;
ok_button;
}

И файл программы

(defun c:err ( / )
  (setq list_a1 '("2" "4" "6" "8"))
  (setq list_a2 '("3" "5" "7" "9"))
  (if (< (setq d (load_dialog "C:\\primer.dcl")) 0)(exit))
  (if (not(new_dialog "a" d))(exit))
  (start_list "a1") ; формируем первый список
  (mapcar 'add_list list_a1)
  (end_list)
  (start_list "a2") ; формируем второй список
  (mapcar 'add_list list_a2)
  (end_list)
  (set_tile "a1" "0") ; инициализация первого списка
  (set_tile "a2" "0") ; инициализация второго списка
  (action_tile "accept" "(setq g (atoi (get_tile \"a1\"))) ; индекс первого списка
                         (setq s (atoi (get_tile \"a2\"))) ; индекс второго списка
                         (f d)")
  (action_tile "cancel" "(term_dialog)")
  (start_dialog)
)
(defun f ( n /  ) ; передать значение идентификатора диалога
; еще раз загружать диалог не надо
  (setq v (itoa (+ (atoi (nth g list_a1)) (atoi (nth s list_a2)))))
  (if (not(new_dialog "b" n))(exit))
  (set_tile "b2" v)
  (start_dialog)
)

Re: Возврат значении во вложенные окна

Огрромное спасибо Юрий за ценные замечания.
Но так как на примере показать не удается, то выложу программу над которой бьюсь уже недели две в свободное от работы время:
DCL-ка:
RasAnkSp: dialog{label="Расчет анкеровки арматуры по СП 52-101-2003";
:popup_list{label="Класс арматуры";edit_width=16;key="kKlaArm";list="A240 \nA300 \nA400 \nA500";value="2";}
:popup_list{label="Класс бетона";edit_width=16;key="kKlaBet";list="B10 \nB15 \nB20 \nB25 \nB30 \nB35 \nB40 \nB45 \nB50 \nB55 \nB60";value="3";}
:popup_list{label="Диаметр стержней";edit_width=16;key="kDiaSte";list="6 \n8 \n10 \n12 \n14 \n16 \n18 \n20 \n22 \n25 \n28 \n32 \n36 \n40";value="3";}
:popup_list{label="Усилие в стержнях";edit_width=16;key="kUsivSte";list="растяжение \nсжатие";value="0";}
:spacer{height=1;}
:radio_row{label="Кол-во стыкуемой в одном сечении арматуры больше 50%";key="kKolSArm";
    :radio_button{label="Да";key="kKolSArmDa";value="0";}
    :radio_button{label="Нет";key="kKolVArmNet";value="1";}
           }
:spacer{height=1;}
:column {
    : row {fixed_width = true;alignment = centered;
    :button{label="Расчёт";key="b1";}
        :spacer{width = 2;}
        cancel_button;
          }
         }
                }
RasAnkSpImg: dialog{label="Результат расчета анкеровки";
  :row {
    :column{label="Результат";
       :paragraph{key="p1";
          :concatenation{key="c1";
             :text_part{label="Длина анкеровки Lan=";key="t1";}
             :text_part{label="v";key="t2";}
                        }
          :concatenation{key="c2";
             :text_part{label="Длина перепуска Ll=";key="t3";}
             :text_part{label="v";key="t4";}
                        }
                 }
            }
     :column{label="Слайд";
       :image{key="ImAnk";color=-2;width=32;height=9.5;}
            }
        }
      spacer_1;
      ok_button;
LSP-к:
(defun c:raa (  /  )
(if (< (setq dcl_raa (load_dialog "C:\\Documents and Settings\\Тииггрраа\\Рабочий стол\\Raschet_ankerovki\\RasAnkSp.dcl")) 0)(exit))
(if (not(new_dialog "RasAnkSp" dcl_raa))(exit))
(action_tile "b1" "(raa1)")
(action_tile "cancel" "(term_dialog)")
(start_dialog)
)
(defun raa1 ( / lRs lRbt ldiam Rs Rbt diam n1 n2 us As Rbound Loan alfa Lan alfaa Ll Lant llt )
(setq lRs (list 21900 27500 36200 44300))
(setq lRbt (list 57 76 92 107 117 133 143 153 163 173 183))
(setq ldiam (list 6 8 10 12 14 16 18 20 22 25 28 32 36))
(setq Rs (nth (atoi (get_tile "kKlaArm")) lRs))
(setq Rbt (nth (atoi (get_tile "kKlaBet")) lRbt))
(setq diam (nth (atoi (get_tile "kDiaSte")) ldiam))
(setq n1 (if (= Rs 21900) 1.5 2.5))
(setq n2 (if (< d 33) 1 0.9))
(setq us (/ (* pi diam) 1000))
(setq As (/(* pi diam diam) 4000000))
(setq Rbound (* n1 n2 Rbt))
(setq Loan (/ (* Rs As) (* Rbound us)))
(setq alfa (if (= (atoi (get_tile "kUsivSte")) 0) 1 0.75))
(setq Lan (* alfa Loan))
(setq alfaa (if (= (atoi (get_tile "kKolSArmDa")) 1) 2 (if (= (atoi (get_tile "kUsivSte")) 0) 1.2 0.9)))
(setq Ll (* alfaa Lan))
(setq Lant (rtos Lan 2 5))
(setq Llt (rtos Ll 2 5))
(if (not(new_dialog "RasAnkSpImg" dcl_raa))(exit))
(set_tile "t2" Lant )
(set_tile "t4" Llt )
(action_tile "accept" "(term_dialog)")
(start_dialog)
)
(image я пока не обрабатывал...)
А вопрос следующий:
1)Вместо полученных значений переменных Lant и Llt (0,45 и 0,48 м ) text_part с ключами "t2" и "t4" показываются нули???
2)Вопрос по теории: например, могу ли я значение value атрибута из первого диалогового окошка присвоить (set _tile) другому атрибуту из другого диалогового окошка одной и той же DCL-ки  (new_dialog) даже если выполню (done_dialog) первого окна??
Заранее спасибо

Re: Возврат значении во вложенные окна

> ст
1. Не хватает зоны меню для вывода всего сообщения. Добавь:

:concatenation{key="c1";[b]width=40;[/b]
.......
:concatenation{key="c2";[b]width=40;[/b]

"...и будет тебе счастье..."
2. Да. До тех пор пока не вышел из программы или не выполнил (unload_dialog).

Re: Возврат значении во вложенные окна

Спаааасибо!! Я б в жизнь не догадался... У меня теперь есть счастье... smile). Продолжу работать над прогой... )