跳转至内容

Visual Basic/JArithmetic

来自Wikibooks,开放的书籍,开放的世界

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,直到以后。

处理文档,原则上,只是将文本发送到脚本控件并读取答案的问题。

让我们将脚本控件添加到这个小实验应用程序中。不需要可见的控件,只需添加引用即可:

Add Script control reference

现在向窗体添加一个命令按钮:

带有命令按钮的窗体

现在将此代码添加到窗体中:

 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 第二轮
华夏公益教科书