Тема: Dialog-box (dcl)... Как заставить работать SLIDER???

При организации dialog-box столкнулся с проблемой. Мне необходимо менять некий параметр с помощью "ползунка" - slider, причем в момент, когда пользователь "отпускает" движок ползунка, диалог должен ненадолго выключится, произвести изменения в чертеже на экране, а затем снова включиться. Если же пользователь продолжает двигать ползунком, диалог должен продолжать считывать новые значения "ползунка" не пытаясь перерисовать картинку на экране. И вот здесь-то и возникает проблема - диалог позволяет изменять состояние "ползунка" всего лишь на один шаг, после чего пытается выключится и перерисовать картинку. Я попытался запретить перерисовку картинки, если с момента последнего изменения "ползунка" прошло слишком мало времени, - слегка полегчало, но работает почему-то неустойчиво - иногда позволяет двигать "ползунком" (но не дольше, чем указанный мной "лимит времени"), а иногда на первом же шаге снова замирает и ждет "отпускания ползунка", чтобы перерисовать картинку... Короче, чепуха получается...
Знает ли кто-нибудь, как сделать это грамотно?
Вот часть программы:
(defun time_point ( / x1)
    (setq x1 (rtos (getvar "CDATE") 2 8))
    (setq x1 (/ (atof (substr x1 (- (strlen x1) 3))) 100))
  ); Текущее значение секунд
 
.....................................часть программы пропущена
(action_tile "slide_r" (strcat "(progn (setq x (+ (* (/ (atof (get_tile \"slide_r\")) 10000) (- max_r min_r)) min_r))"
                   " (zam_r x)"
                   " (dial_korrect)"
                   " (if (= flag \"1\")"
                        " (if (= p 0)"
                            " (progn (setq p 1) (setq t0 (time_point)))"
                            " (if (>= (- (setq t1 (time_point)) t0 5) 0)"
                                " (progn (setq p 0) (setq koord (done_dialog 4)))"
                                " (setq t0 t1)"
                                ")"
                            ")"
                        ")"
                      ")"))

....................................
Пояснения:
(zam_r x) - ппрг замены элемента в списке;
(dial_korrect) - ппрг пересчета некоторых значений в окошках диалога;
flag - переменная, имеющая значение "1", когда включен режим "Мгновенной перерисовки изображения на экране", то есть именно то, что и не желает у меня корректно работать;
p - параметр;
t0, t1  - моменты времени (предыдущее срабатывание ползунка и текущее срабатывание ползунка);
koord - запоминание координат диалога, чтобы при последующем выводе его можно было отобразить в том же месте экрана...

Re: Dialog-box (dcl)... Как заставить работать SLIDER???

Тут без проверок, но идея, думаю, будет понятна.

Файл *.dcl:
slider_test : dialog {
   label = "Слайдер";
   : spacer {height = 1;}
   : slider {
     key = "slider";
     min_value = 0;
     max_value = 10;
     small_increment = 1;
   }
   : edit_box {
     key = "value";
     label = "Текущее значение:";
     edit_width = 15;
     edit_limit = 255;
   }
   : text {
     key = "finished";
     label = "";
     alignment = centered;
   }
   : spacer {height = 1;}
   : button {
     key = "OK";
     label = "OK";
     is_cancel = true;
     is_default = true;
     fixed_width = true;
     alignment = centered;
   }
}

Файл *.lsp:
(defun slider_test ( / dcl_id val reas)
   (setq dcl_id (load_dialog "tmp.dcl"))
   (new_dialog "slider_test" dcl_id) 
   (setq val "2")
   (set_tile "slider" val)
   (set_tile "value" val)
   (action_tile "slider" "(setq val $value reas $reason)
     (set_tile \"value\" val)
     (if (= reas 3)
       (set_tile \"finished\" \"\")
       (set_tile \"finished\" \"Slider Finished !!!\")
     );if
   ")
   (start_dialog)
   (unload_dialog dcl_id)
);defun

$reason можно использовать не только в slider, бывает нужно в list_box отследить двойной щелчок на каком-то элементе списка.

Re: Dialog-box (dcl)... Как заставить работать SLIDER???

Все отлично заработало! Теперь моя строка выглядит так:

(action_tile "slide_r" (strcat "(progn (setq x (+ (* (/ (atof $value) 10000) (- max_r min_r)) min_r))"
                   " (zam_r x)"
                   " (dial_korrect)"
                   " (if (and (= flag \"1\") (/= $reason 3)) (setq koord (done_dialog 4))))"))

Спасибо за помощь, я не знал ранее о сокращениях типа $value, $key, $reason...
Увы, книжки по Лиспу, в которой бы подробно расписывались диалоги, я так и не нашел, поэтому изучать их приходится по лисповскому Help, причем англоязычному, а там, прежде, чем что-то узнать, нужно понять, как "оно" правильно называется ;)