Visual Basic/JArithmetic Round Two
現在,有了東西真正可以執行的興奮感已經消失,我們可以批判地看看我們做了什麼。
我們做了什麼?我們已經證明了
- 我們可以'建立'一個編輯器,讓我們用文字屬性(如粗體、斜體等)格式化文字。
- 我們可以執行文字並將結果放回文字中。
聽起來不錯,但我們沒有做和沒有考慮的事情清單要長得多。以下是一些明顯的條目
- 不屬於公式的文字怎麼辦?
- 結果應該放在哪裡?肯定不是在頁面底部。
- 我們不是在願望清單中提到了圖表嗎?
- 格式化不僅僅是粗體、斜體和下劃線。
- 當用戶寫了程式不理解的東西時,應該發生什麼?
為了取得一些可見的進展,通常先解決簡單的問題是一個好主意,至少如果它們是必須解決的問題,而不是模糊的願望。問題是,我們不知道在不檢查的情況下哪些問題最容易解決。有時檢查問題只會出現更多問題,有時會發現它根本不是問題。
讓我們依次考慮我們沒有做的事情。
我們的原型透過將文件的整個文字傳遞給 Script 物件來工作。這意味著整個文字必須在指令碼引擎的語言中是合法的。我們的公式只是該語言中的語句。程式由三種類型的元素組成
- 語句
- 註釋
- 空白
因此,不屬於公式的文字,定義上要麼是空白,要麼是註釋。如果它包含任何可列印字元,那麼它就不能是空白,所以它一定是註釋。因此,只要可以包含在註釋中,我們就可以包含任何我們喜歡的文字,因為指令碼引擎只會將其視為空白並忽略它。
註釋有幾種不同的語法,有時一種語言會允許不止一種型別。當純粹用於程式設計時,註釋是如何分隔的通常並不重要,但在我們的情況下,註釋將成為文字中非常重要的部分,因此語法不會造成阻礙很重要。我們已經決定將自己限制在 VBScript 或 JScript 中,所以我們只需要決定哪種語言的註釋語法更好,同時記住我們可能出於其他原因想要改變主意。
VBScript 中的註釋語法非常簡單,與 Visual Basic 相同。註釋由一個單一的 ASCII 引號符引入
' this is a comment
或 REM 關鍵字(不區分大小寫)
rem this line ReM and this line are both comments
JScript 有點不同
// this is a single line comment
/* this is also a single line comment */
但
/* This
is
a
multiline
comment */
就我們的目的而言,我認為 JScript 語法對於編寫文字段落來說更方便。如果我們使用 JScript,那麼我們就可以很自然地編寫我們的文字和公式,除了要記住將文字塊括在 /*..*/ 中。最棒的是我們不需要進行任何額外的程式設計來使這工作。
- 執行程式並使用兩種不同的註釋風格添加註釋。執行文件以說服自己註釋不會影響結果。
到目前為止,輸出只是簡單地附加到文件的末尾。這顯然不是很有用。我們可能希望能夠將答案放在問題附近,將值放在確定它們的公式附近。
此外,我們不希望重複的評估將答案的新副本新增到文件末尾。解決此問題的一種方法是在文字中放置一些特殊的字元序列,這些字元序列將被答案替換。例如,我們可以編寫一個看起來像這樣的文件
Ttop=55 // deg C Tbot=Ttop-6 /* The bottom temperature is <Tbot>. Which is six degrees below the top. */
第一行將變數 Ttop 設定為 55,下一行計算 Tbot 的值。然後我們有一個多行註釋,其中嵌入了字元序列 <Tbot>; 這被稱為 宏。
現在我們可以執行程式,它將設定變數的值,然後我們可以掃描程式文字以查詢 宏。當我們找到一個宏時,我們可以向 Script 物件詢問它命名的變數的值,並將宏替換為值。
找到 宏 很容易,只需幾個 InStr 呼叫即可,或者我們可以更復雜地使用 正則表示式。在評估和宏替換後,文件將如下所示
Ttop=55 // deg C Tbot=Ttop-6 /* The bottom temperature is 49. Which is six degrees below the top. */
不幸的是,這個方案有一個嚴重的缺陷:它只在第一次評估文件時起作用。這是因為我們已經 替換 了 宏,就像我們在執行正常的宏處理器一樣;例如,參見 m4 Macro Processor Overview。如果我們修改文件將常量 6 更改為 9 並重新評估文件,結果將不會改變。
在我們的例子中,輸入文件也是輸出文件,所以我們必須以一種可以重新評估並更新結果的方式插入輸出。
一種解決方案是修改我們顯示結果的方法,以便不替換宏,而是對其進行修改。然後,在評估後,文件可能如下所示
Ttop=55 // deg C Tbot=Ttop-6 /* The bottom temperature is <Tbot=49>. Which is six degrees below the top. */
現在我們只需要對程式碼進行一些簡單的修改,這些程式碼還沒有編寫,用於掃描文字以查詢宏以及用於插入結果的程式碼。所需的一切就是識別宏並將其拆分為兩個部分:名稱 和 值。名稱和用於指示這是宏的字元保持不變,而值被替換。當您編寫文件時,您可以這樣編寫宏
<Tbot=>
也就是說,值為空,將在值已知時填入。
- 嘗試思考一個通用的程式來用變數的值替換佔位符。
- 如果同一個變數在文件的不同部分有不同的值,會發生什麼?應該發生什麼?
理解同一事物的不同檢視方式 以及 不同事物可以以相同方式檢視,這是在計算機程式設計中要學習的最重要的一課。
如果我們將圖表視為另一種型別的價值,那麼所有關於圖表生成和包含的問題都變成了關於必須編寫哪種函式來生成價值以及如何自動在文件中插入該價值的問題。一旦問題以這種方式表達,就變得很明顯,我們可以使用與我們用於顯示數字相同的宏技術來顯示圖表。現在我們只需要建立一個建立圖表的函式。
當然,還有很多細節需要處理。但是,如果我們簡單地假設某個地方有一個函式可以建立圖表,也許是作為點陣圖影像,我們所要做的就是找到一種呼叫它的方法。
原則上,我們可以使用 Rich Text Box 控制元件支援的任何格式。 我們應該能夠提供熱鍵、選單和工具欄按鈕來設定字型、字號、縮排、對齊方式等。
待辦事項。
- 建立一個包含 Rich text Box 控制元件的新專案。 嘗試使用控制元件的屬性和方法來設定字型、大小、縮排等。 為每個功能建立一個按鈕。
- 擴充套件應用程式,讓使用者透過顯示字型選擇對話方塊來選擇字型等。
| 前一頁:JArithmetic | 內容 | 下一頁:Jarithmetic Round Two 實現 |