跳转到内容

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 实现
华夏公益教科书