說 (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")
)
)
(initget "Y N")
(setq s (getkword "\nARE YOU SURE:N/<Y>"))
(if (or (= s nil) (= s "Y"))
(alert "Yes")
(alert "No")
)
)
沒有留言:
張貼留言