在此正式介紹 AutoIt 最直接的使用者互動方式,用 InputBox 輸入資料,用 MsgBox 輸出結果,以及輸入輸出時必要的資料型態概念。其實輸入輸出不只有此方式,還有來自終端機 (console), 檔案等的訊息。 其實,電腦上所有輸入輸出都應該以 Binary 的最底層型態進行,但是程式中對資料的處理往往基於高階的邏輯,底層的事情都由負責輸入輸出媒介的函式庫做掉了。因此,下面所見的輸入輸出皆以「字串」為主,它是所有高階資料型態裡最通用能表達任何資料的。 下面的程式碼示範如何透過 InputBox 從使用者獲取輸入: InputBox 函式也會引起彈出視窗,視窗上有一個單行編輯區,和 OK, Cancel 紐,分別表示「確定」跟「取消」。第一個參數表示該視窗的標題,第二個參數則是顯示在編輯區前的提示。 當 InputBox 被按下 OK, 輸入的字串就會被傳送回來,此十可以將結果指定給變數 $name 來收下使用者輸入。若輸入 John Smith 則 OK 後 $name 存的就是字串 "John Smith". 要求輸入密碼時 InputBox 多二個參數,第三個參數是預設在編輯區裡的內容,這邊一對雙引號間沒有夾任何字表示內容為空,第四個參數表示密碼字元,若被指定則打字只會顯示該字元,就是平常輸入密碼時受保護顯示的樣子。這二個參數未指定時都是 "", 所以其實觀念上只要指定第四個參數就好了。可是 AutoIt 不允許跳著指定,所以第三個參數還是要寫出來。 MsgBox 將顯示剛才輸入的結果,整串訊息由姓名、密碼跟其他固定部分用 & 串接起來。 輸入的字串通常不會如上例般毫不處理就印出結果,下面的範例將展示如何設計一個計算身體質量指數 (BMI) 的互動小程式: 執行這個範例時,三次請求輸入都能打任何字元,不過本篇假設使用者不會故意在身高、體重輸入不合理的內容如非正數值或不切實際的數值(比如嬰兒及巨人的身高體重)。當使用鍵盤輸入時,你就該體會到,一切的輸入都來自字串,當連續打了 1, 6, 0 這三個字,它是字串 "160", 卻被「解釋」成一個「三位數」,這個三位數是一百六十。 AutoIt 會在背後替我們做資料型態的隱含轉換,當遇到 $BMI 等於右方的算式,參與的 $height, $weight 都是「字串」,但是必須拿來計算「除」和「次方」,這些是 Number 型態才支援的運算,此時 AutoIt 就企圖將輸入字串解釋成 Number, 當輸入格式都合理就會獲得合理的答案。 可是,算出 $BMI 後還是要輸出給使用者看,於是它跟之前的姓名、密碼一樣用 & 連接前後的字串,它是數學計算出來的結果,所以也是 Number 型態,卻要被當成字串跟前後相連,此處又是 AutoIt 在背後做了隱含轉換,把它從數字變成字串。 這個範例仍有兩個主要改善空間:一、阻擋不合理的輸入,二、讓輸出內容更具可讀性。下例展示利用 InputBox 的參數及 Stringformat 來接近這些目標: 這個範例跟之前的差異在於二個地方,第一為身高、體重的 InputBox 都多二個參數,第二為 MsgBox 的內容變成 StringFormat. InputBox 的第四個參數除了指定顯示密碼用的保護字元外,還可指定其他行為。當它的第一個字不是空白字元,可讓輸入的內容原樣顯示,因為也有需求只要設置後面的行為而不是輸入密碼。它的第二個字元若為半形大寫 M, 表示禁止傳回空字串,也就是沒有輸入情況下按 OK 不會讓輸入框消失而繼續下去。從第三個字起的數字(若中間無 M 則從第二個字開始算),用來限制輸入資料長度,這邊身高體重都限制輸入三個字。設置這些限制行為可以阻止使用者不輸入就繼續,不過仍無法擋住大多數的無效輸入,要達到完整還必須藉助本文範圍之外的 IF...Else...EndIf 判斷。 MsgBox 用了 StringFormat 後,答案從原本一堆小數位數變成只有一位小數,清爽很多。StringFormat 的參數數量不固定,第一個參數字串必須用來指定「格式」,第二個參數之後無限制型態,但是會受到「格式」的約束。「格式」就是把字串裡會變動的部份寫成 % 開頭的「變數」,不是真正的變數,但內容的確會參考到後面給的參數而定。範例中的格式有二個「變數」,分別是 %s 和 %.1f, 前者表示格式之後第一個參數是一個字串,這裡代入的是 $name, 後者表示格式之後第二個參數是浮點數,而且小數點後只顯示一位小數,這裡代入 $BMI. 這邊的格式化相當重要,除了讓輸出好看外,一般而言此種做法比一直連接字串來得有效率。再者,它在程式的地方化 (localization, l10n) 上舉足輕重,「地方化」就是將程式中的訊息對每種語言都列出對應的翻譯,比如這個訊息的英譯為 "Hi %s, your BMI is %.1f" . 翻譯時遇到最麻煩的問題是語言結構上的排列不一致,也就是 % 的「變數」跟其他固定訊息的擺設方式不同,如果用連接字串的方法,英譯時就只能針對「嗨」、「您的 BMI 是」等字串分別翻譯,無法改變 $name 與 $BMI 代入的位置。當然,要是對每種語言都寫一個自己的 MsgBox 訊息,可解決變數代入順序的問題,然而這將讓程式碼管理不易,像 NVDA 這種多國語言的軟體都是只有一個訊息給全球翻譯。
回 · 我的 AutoIt 學習筆記 這一篇文章封面 |
本站公告:〔您越需要我們,我們就越有創意〕 | 本站說明書:〔發現故鄉還有改進的地方,請來信告訴原丁們〕 |
觀察應用學習點數 :〔咱的故鄉有您的參與,會使我們有更大的發揮空間,展現更豐富精彩的學習畫面〕 | 〔期待藉由無障礙網頁設計,能讓視障小朋友更愛看書、更愛寫作且更愛學習〕:盲用電腦「心得分享」 |