今天是2025年6月15日,关于Twinbasic和Radbasic:截至今天Twinbasic的大致情况是正在逐步推进,说是要复现VB6的所有语言特性甚至包括冷门语法;截至今天Radbasic的大致情况是暂时无法拥有良好的使用体验(引用TB作者韦恩的话)。
复现VB6的所有语言特性甚至包括冷门语法,那就先简单说说VB6的冷门语法,VB6支持许多旧式语法(包括遗留语句和关键字)。VB6这一种历史悠久的语言最终会有一些过时的语法特征。如果代码包含未记录的关键词或你不常使用的命令,理解旧代码可能会很困难。这同样适用于 VB6。其实VB 的许多旧语法来自其 DOS 前身。VB 的前身是 Microsoft QuickBasic,一种用于 DOS 的编程语言。从语法上讲,QuickBasic 和 VB 非常相似。为了向后兼容,VB 支持许多在 QuickBasic 中有用的语法特性,尽管在 VB 中它们现在已经不再非常有用。此外,Visual Basic 语言在各个版本之间进行了更新,使得语言的一部分变得冷门过时,简单说说如下:
(01) Call
Call subname(arguments)
Call
作为VB的一个关键字来调用子程序,你可以移除它。但是,如果你确实移除了它,你还需要移除参数列表周围的括号。否则你可能会遇到错误。因此,通常来说,最好保留 Call
不变,除非你希望在程序中引入新的错误。
说说一个案例是 Call
有一个参数: Call MySub(x)
. 如果你删除单词 Call
, 代码保持不变,对吗?不对。去掉了 Call
的语法中的括号 MySub (x)
强制以值传递 x。如果 MySub
碰巧将参数声明为 ByRef
并故意更改其值,更改后将不再传递回调。这可能会破坏现有的代码。所以,如果你真的删除了 Call
,记得也一起删除括号。
(02)Date
和 Time
Date = expr : Time = expr
Date$ = expr : Time$ = expr
你可以通过Date 和 Time 来设置当前日期和时间。只有管理员可以执行此操作。否则,你将收到运行时错误 70:Date = dateTime = time
权限被拒绝输入:
为什么一个VB程序会更改系统时间?如果电脑没有电池供电的时钟,让用户设置日期和时间可能是个好主意。现代电脑从在线时间服务器获取时间。不需要询问用户今天的日期是什么。有趣的是,这些无谓的陈述有两种版本:带美元符号和不带美元符号。
(03) DefType
DefBool | DefByte | DefInt | DefLng | DefLngLng | DefLngPtr | DefCur | DefSng | DefDbl | DefDate | DefStr | DefObj | DefVar letter1[-letter2]
这些语句为本会成为变体的变量声明一个数据类型。它们影响没有数据类型指定的已声明变量和未声明的局部变量。
DefType
在 QuickBasic 时代非常方便。默认的数据类型是 Single
,并且没有要求声明变量的方法。你会使用类型声明后缀,例如 s$
用于 String
和 i%
用于 Integer
。
在VB中,默认的数据类型是Variant
,如果你忘记声明变量,它会更加灵活。变体如此灵活,即使你对数据类型一无所知,你的代码通常也能按预期工作。更重要的是,你可以使用Option Explicit
来要求显式声明所有局部变量,所以现在变得不那么有用。
(04) Dim Shared
Dim Shared varname
Shared
是以前与 Dim
语句一起使用的关键字。Shared
为了与 Microsoft QuickBasic 等 VB 的前身语言并使其向后兼容而存在。在 QuickBasic 中,Dim Shared
用于声明模块级变量,使其在过程中可用,类似于 VB 中的模块级变量。Shared
在 VB 中没有效果,因为所有模块级变量在模块的过程汇总始终可用。如果你在 VB6 中编写 Dim Shared
,单词 Shared
会消失,只剩下 Dim
。
(05) Global
Global
是 Public
的同义词。在过去,Global
是唯一一个可以修改变量或常量作用域的 VB 关键字。而其它关键字 Public
、Private
和 Friend
都不可以。
VB6仍然允许你使用Global
来定义变量和常量。但是,如果你Sub
、Function
、Property
、Enum
或Type
上尝试这样做,VB将会(通常会)删除这个词,并且表现得好像你写了Public
。
(06) GoSub
输入:,Return
GoSub line
line: … : Return
GoSub
是程序本身中调用子程序的一种方式。 GoSub
将跳转到指定的行直到执行其后的语句 Return
语句。一个 Return
将从 GoSub
的下一条语句恢复执行。
但是,在很久很久以前。通常你不大会在VB中使用GoSub
。因为Sub和Function更加结构化。
在VB中,GoSub
仍然有一个特殊用途。那就是在有许多局部变量的VB程序中。如果你需要在另一个
Sub
或 Function
中访问局部变量,你需要将它们作为参数传递或者将变量定义移动到模块级别。通过使用 GoSub
和 Return
实现子例程,你可以避免传递局部数据,这可能会派上用场。然而,这也可能导致一个不必要的复杂例程。所以,如果你真的不需要它,最好让 GoSub
不使用。
(07)If..GoTo
If condition GoTo line
在VB中,If..GoTo
等同于If..Then GoTo
(仅限于单行If
语句)。VB6和VBA会自动添加Then
关键字,但技术上If..GoTo
仍然可以接受。
(08) Width #
Width #filenum, value
此Width
语句用于编写文本文件。它对输出文件施加固定的行长度。此Width
语句影响后续Print #
语句,但不适用于Write #
语句。如果一行变得比预期更长,文本将在输出文件中换行。虽然这在某些情况下可能有用,但在单词中间强制换行并不是一种现代的做法。
(09) On..GoSub
输入:,On..GoTo
On number GoSub line1, line2, line3…
On number GoTo line1, line2, line3…
On..GoSub
和 On..GoTo
基本上是可以替代 Select Case
。这两个语句都提供了一种根据数字执行多个分支之一的方法。如果 数字 是 1,执行将继续在 line1,如果是 2,那么 line2,依此类推。
仅凭 GoSub
和 GoTo
这些语句并不是结构化编程。一般情况下,也可以说 On..GoSub
和 On..GoTo
这些语句在VB转换为TB的代码中需要进行重写。
(10) Option Private Module
这个语句在VB6中完全无用。但在VBA中却有用途。Option Private Module
在VBA中,它防止模块的内容在项目之外被使用。
👍👍👍