Visual Basic/JArithmetic
JArithmetic 是一款原型應用程式,旨在成為一種簡易版的 MathCad。
當你開始編寫程式時,你需要一組需求。有時目標非常明確,可以詳盡地描述,但通常情況下,雖然目標明確,但詳細描述程式要做什麼既不可取也不實用。JArithmetic 就是第二種型別的例子。
基本需求如下:
- 一種文件型別的編輯器,可以包含公式並顯示公式和結果,
- 編輯器必須支援文字格式化(字型、字號、字形)。
顯然,這樣一組需求對開發人員的限制並不大。在這種情況下,還有一個額外的考慮因素:
- 我們不確定不同功能的成本和收益。
- 我們不確定“公式”的含義,
- 我們不確定“文字格式化”的含義,
- 我們不確定“結果”的含義。
這意味著我們必須在開發程式一段時間後才能決定應該新增哪些額外的需求。儘管如此,我們也不應該在程式設計領域漫無目的地遊蕩。因此,我們定義了一組期望的功能,一個願望清單:
- 應該可以在文件中包含圖形,
- 結果應該可以顯示為圖表。
另一個有價值的特徵列表是一個否定列表。即一個不需要的東西的列表。這並不意味著它們是被禁止的,只是說不應該花費時間來開發它們,而犧牲了必需的功能或願望清單中的功能。
- 我們不會要求能夠以教科書風格格式化數學公式。也就是說,我們追求的是 Mathcad 的一些功能,但並不試圖製作印刷質量的副本。
牢記基本需求、願望清單和非需求,我們可以開始勾勒實現的概要。但是,在我們繼續之前,我們應該提醒自己程式設計師的主要優點。
首先是那些推動程式設計過程前進的,充滿激情的優點:
- 懶惰
- 只要能“偷”程式碼就不要自己寫,永遠不要寫兩次相同的東西,
- 急躁
- 現在就需要結果,
- 傲慢
- 對自己的能力感到自豪。
然後是那些讓它繼續前進的:
- 勤奮
- 不要滿足於粗製濫造的工作,
- 耐心
- 當事情變得緩慢和困難時不要氣餒,
- 謙遜
- 樂於接受來自任何人和任何地方的幫助。
這些標題來自 Larry Wall,但定義是我的。
那麼讓我們看看我們的基本需求和充滿激情的優點能讓我們走多遠。
沒有任何規定說我們必須按照需求提出的順序來處理它們,所以讓我們將第二個需求
- 編輯器必須支援文字格式化(字型、字號、字形)
與前兩個優點:懶惰和急躁結合起來,以獲得一個基本的編輯器。一旦我們有了它,我們就可以開始考慮另一個主要需求:
- 一種文件型別的編輯器,可以包含公式並顯示公式和結果。
此需求的本質是,程式必須以某種方式讀取文件,計算執行公式的結果,然後將答案放回文件中。
Windows 中內建了一個名為富文字編輯器的元件。Visual Basic Classic 可以使用此元件。此元件實現了一個花哨的文字框,支援 Windows 可以使用的所有字型,以及字號和字形,例如斜體、粗體等。這看起來應該可以滿足需求和第一個優點。現在讓我們變得急躁起來。
您只需建立一個新專案並新增對富文字控制元件的引用即可。在 NT、Windows 2000 和 XP 上,它通常位於
x:\WINNT\system32\RICHTX32.OCX
您可以透過單擊“專案”選單上的“元件”來新增引用。File:VBClassicRichTextReference.png
現在將一個富文字框新增到窗體中。現在不用擔心命名和調整大小。富文字示例窗體。
現在執行專案。即使沒有程式碼,您也有一個可以鍵入並理解制表符和換行的編輯器。
現在將以下程式碼新增到窗體中:
Private Sub RichTextBox1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case Asc("B") - 64
RichTextBox1.SelBold = Not RichTextBox1.SelBold
Case Asc("U") - 64
RichTextBox1.SelUnderline = Not RichTextBox1.SelUnderline
Case Asc("I") - 64
RichTextBox1.SelItalic = Not RichTextBox1.SelItalic
End Select
End Sub
不用擔心缺少正確的命名、常量等;這只是一些臨時程式碼,供您在接下來的五分鐘內玩玩。
執行程式,輸入一些文字,突出顯示一些文字(使用滑鼠或 Shift 和箭頭鍵)。現在按 Ctrl+B、Ctrl+I 或 Ctrl+U。檢視文字樣式的變化。
這個小實驗證明,我們幾乎不用任何程式碼就可以獲得一個至少滿足我們一個主要需求的編輯器。
- 閱讀富文字控制元件的文件,
- 擴充套件程式以包含字型選擇和縮排段落,
- 想出一個其他的擴充套件並實現它,
- 如果您還沒有嘗試過使用 Ctrl+I 將文字設定為斜體,現在就試試。解釋為什麼它不起作用。
- 提供設定粗體、斜體和下劃線屬性的另一種方法。
現在我們必須看看是否可以找到一種方法來滿足我們的另一個需求:
- 一種文件型別的編輯器,可以包含公式並顯示公式和結果。
這非常模糊,並將許多關鍵詞的定義留給了讀者的想象
- 公式
- 什麼是公式?它看起來像你在教科書中看到的二次方程嗎?
- 結果
- 結果是一個數字嗎?它可以是一組數字嗎?圖表呢?文字呢?
現在,我們可以透過深入研究這些詞的真正含義並與我們的終端使用者訪談他們想要什麼來回答所有這些問題,但還有另一種方法:轉身面對另一個方向,問問我們已經擁有了什麼可以勝任這項工作。
從你自己的經驗和周圍環境中尋找想法。你是一個或想要成為一個程式設計師,所以問問你自己“我們的需求讓我想起了什麼?”。看看我們的文件型別,它由公式和結果組成;公式只是一種指令,它們說諸如“將 a 加到 b 上並將答案乘以 c”和“結果”只是從該過程中產生的任何東西。聽起來非常像一個計算機程式。
因此,如果我們的文件要成為一個計算機程式,我們需要決定它將使用哪種語言編寫。原則上,我們可以使用任何東西,從帶有所有花哨符號的教科書數學表示式到 Fortran、Lisp、Basic、Pascal、Prolog 等,不勝列舉。
我們應用 Larry Wall 的優點:
- 傲慢
- 告訴我們我們可以實現我們喜歡的任何東西,
- 懶惰
- 說那將是艱苦的工作,
- 急躁
- 說我等不及了!
那麼,在我們的小程式可以使用的方式中,是否有任何語言已經可用?答案是響亮的肯定。我們可以使用其中一種指令碼語言:Ruby、Python、VBScript、JavaScript 等。
我們應該選擇哪一個?我們可以直接排除一些,因為它們需要我們付出太多工作或使最終程式變得太大:
- Ruby 或 Python
- 很棒的語言,簡潔而強大,但在執行之前需要安裝大量的東西,
- VBScript 或 JavaScript
- 你可能已經以 Microsoft Script Control 的形式擁有了這些。
因此,為了快速執行並能夠將其交付給沒有 Python 或 Ruby 的使用者,我們將選擇指令碼控制元件。我們將延遲選擇 VBScript 或 JavaScript,直到以後。
處理文件,原則上,只是將文字傳送到指令碼控制元件並讀取答案的問題。
讓我們將指令碼控制元件新增到這個小實驗應用程式中。不需要可見的控制元件,只需新增引用即可:
現在向窗體新增一個命令按鈕:
現在將此程式碼新增到窗體中:
Private Sub Command1_Click()
Dim oSC As ScriptControl
Set oSC = New ScriptControl
oSC.Language = "JScript"
oSC.Eval RichTextBox1.Text
With RichTextBox1
.SelStart = Len(.Text)
.SelText = vbCrLf & oSC.Eval("a")
End With
End Sub
執行專案並鍵入:
a=1
在富文字框中。確保刪除可能存在的任何其他內容。
現在是真相時刻:單擊命令按鈕。如果一切順利,數字 1 應該出現在a=1語句後面的那一行。
雖然有點無聊。嘗試一些更令人興奮的事情,清除文字並新增以下內容
b=2 c=3 a=b*c
再次點選按鈕。應該顯示6。再次點選,另一個6應該出現。
現在是時候解釋一下發生了什麼。指令碼控制元件實際上是一個直譯器或直譯器的前端。事實上,它可以解釋 VBScript 和 JScript。VBScript 是一種 Visual Basic,其中所有資料都是 Variant,而 JScript 是微軟對 JavaScript 的實現。
命令按鈕事件處理程式中的那段小程式碼只是建立了指令碼控制元件,告訴它使用哪種語言,然後要求它評估富文字框中的程式碼。之後,它要求評估最簡單的語句
a
這將變數a的值作為Eval方法的值返回。然後,使用富文字框的一點技巧將該值新增到文字的末尾。
這個小程式從本質上滿足了我們所有的要求。在進入下一節之前,先做一些練習,在下一節中,我們將批評我們這個可憐的小程式並進行一些改進。
- 檢查命令按鈕事件,併為每一行編寫一兩句解釋和說明。不要重複程式碼的內容,專注於解釋它做了什麼以及為什麼。
- 嘗試粗體、斜體和下劃線格式命令。它們會影響結果嗎?
- 新增更多語句、更多變數,使設定a變數的語句更復雜。
- 如果你瞭解 JavaScript,你可以新增一個函式,使用該函式來設定a的值。如果你不瞭解 JavaScript,那麼現在是時候學習了。
| 上一頁:案例研究 | 目錄 | 下一頁:JArithmetic 第二輪 |
