今天是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 关键字。而其它关键字 PublicPrivate 和 Friend 都不可以。

VB6仍然允许你使用Global来定义变量和常量。但是,如果你SubFunctionPropertyEnumType上尝试这样做,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 #filenumvalue

Width语句用于编写文本文件。它对输出文件施加固定的行长度。此Width语句影响后续Print #语句,但不适用于Write #语句。如果一行变得比预期更长,文本将在输出文件中换行。虽然这在某些情况下可能有用,但在单词中间强制换行并不是一种现代的做法。

(09) On..GoSub输入:,On..GoTo

On number GoSub line1line2line3

On number GoTo line1line2line3

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中,它防止模块的内容在项目之外被使用。

Hi, I’m vbaman365

One Comment

发表回复