2014年4月7日 星期一

Visual Lisp 輸入 getkword 函數

       說 (getkword) 是一行函數,事實上是錯的,因為它通常和的搭檔 (initget) 一起出現,實務常常在使用者與程式互動需要限定使用者回覆限訂之訊息,例如程式要求使用者確認,於發出

 ARE YOU SURE?

的訊息於命令列上,但是你能確定使用者是按下 Y y N n 四個鍵嗎? 要如何做 ,先用 (initget)設定使用者所能輸入之字串

(initget "Y N")

再呼叫
(getkword "\nARE YOU SURE : (Y/N)")

程式執行至此,命令列上便出現

ARE YOU SURE : (Y/N)

    等待使者者輸入 Y y N n 四個字元,若是輸入別的字元,則會一直重複要求輸入,直到獲得限定字元後才會繼續向下執行。

    VL 程式內可利用 (getkword "\nARE YOU SURE : (Y/N)") 所傳回字元進行判斷使用者之意圖

    還有一個問題,事實上執行時若使用者只按下 ENTER,(getkword) 仍會接收到 nil 後向下執行,這不是函數設計之 BUG,事實上在 (initget) 函數可以設定防止按下 ENTER 選項,那這項 "失誤" 目的為何?

    我們使用程式時,有的選項幾乎佔大多數,最直覺的反應就是按下 ENTER 或 SPACE 鍵,換句話說 (getkword) 的預設選項可以設計成 ENTER,於是我們改寫如下

(getkword "\nARE YOU SURE : N / <Y>")

使用者看到的提示就成了

ARE YOU SURE : N / <Y>

    很自然的,知道按下 ENTER 就是 "Y" 的意思,而不用到處找 Y 鍵,那 (getkword) 收到 nil 怎麼辦,加個 (or) 函數就好了,下面的函數完整將前面的內容再整合一遍

(defun C:TEST( / s)
    (initget "Y N")
    (setq s (getkword "\nARE YOU SURE:N/<Y>"))
    (if (or (= s nil) (= s "Y"))
        (alert "Yes")
        (alert "No")   
    )        
)

沒有留言:

張貼留言