LISPのダイアログ・プログラムについて



単純なダイアログボックスとしてラジオボックスが
標準で用意されています。
以下のコードを打て見てください

(choose-item-dialog "性別" (list "男" "女" "その他"))

戻り値は選んだ項目のリストナンバーが返されます。

しかし、複雑なダイアログを作りたい場合、
自らがダイアログをデザインをしなければなりません。
(defun dialog-box ()
  (let* ((gender (send choice-item-proto :new (list "男" "女" "その他") :value 0))
         (ok     (send modal-button-proto :new "OK"
                          :action #'(lambda () (send self :dialog-result))))
         (dialog-design (send modal-dialog-proto :new
             (list
                (list gender)
                (list ok)
         ))))
     (defmeth ok :dialog-result ()
        (send gender :value)
     )
     #+msdos (send dialog-design :modal-dialog)
))

:action 以下でボタンの動作を指定します。
ここでは内部関数(defmeth)を呼び出して、genderのリストを表示させました。
自己紹介Dialogを完成させます。

(defun dialog-box ()
  (let* ((name-txt (send text-item-proto   :new "名前:"))
         (name     (send edit-text-item-proto :new "" :text-length 15))
         (gender   (send choice-item-proto :new (list "男" "女" "その他") :value 0))
         (age-txt  (send text-item-proto   :new "年齢:"))
         (age-null (send text-item-proto   :new "  "))
         (age      (send interval-scroll-item-proto 
                           :new (list 1 100) :points 100 :text-item age-null))
         (married  (send toggle-item-proto :new "実は既婚" :value t))
         (ok     (send modal-button-proto :new "OK"
                          :action #'(lambda () (send self :dialog-result))))
         (dialog-design (send modal-dialog-proto :new
             (list
                (list name-txt name)
                (list gender)
                (list age-txt age age-null)
                (list married)
                (list ok)
         ))))
     (defmeth ok :dialog-result ()
        (list 
          (send name :text)
          (send gender :value)
          (send age :value)
          (send married :value)
     ))
     #+msdos (send dialog-design :modal-dialog)
))
と、こんな感じです。
年齢の値が59.99999…などとなってしまうのはWindows版LISPの仕様みたいです。
このバグ解消と日本語が打てればいいのですが、バージョンはあがらないようです。


以下にモードレス・ダイアログ(ダイアログと画面の連動など)
のコードを乗せておきます。
normal_shift.lsp
:action 項目で、プログラムと連動することにより実現しています。


戻る戻る Produce:Teranishi