与Visual Basic的区别

虽然Gambas不是有意要克隆微软的Visual Basic,但是它也是BASIC而且在这两种语言之间有很多相似处,而且在这些特点中有很多是一一对应的关系。

也许相似处要比不同处多,但是不能简单的复制VB上面的工程到Gambas下,并指望能它们能编译通过。

%vb%标志会常常出现在这个文档的页面中,描述如何使用该页面上描述的与VB中不同特性来完成同样任务的可用提示,以帮助那些从VB迁移到Gambas的程序员。

非语言指定差异

  • VB在同一个窗体定义文件中嵌入每一个窗体对象的类代码。Gambas保持它们分隔在一个.form和.class文件中。

  • 文件的扩展名:

文件类型 Visual Basic Gambas
工程定义文件 .vbp .project (每个目录仅有一个.project文件)
模块 .bas .module
类文件 .cls .class
窗体定义文件 .frm .form
二进制资源文件 .frx 存储在工程目录的任何其他文件。

  • Gambas工程被定义为一个里面带有.project文件的目录,并且所有的文件都在这个目录里。VB可以在一个目录里有多个工程文件,并且可以从不同的目录拖相同的源文件到不同的工程,这样做有利有弊。

  • 在VB中屏幕的度量单位是“缇”(twips),单位是一英寸的1440分之一;在Gambas中使用实际像素作为单位。

  • 在Gambas程序中Form控件缺省是私有的。可以通过在工程属性对话框中选中/使窗体控件公用/选择框来改变。

  • Str$, Val, CStr...转换函数行为不同。例如,在Gambas中Str$Val用本地设置,这点与在VB中不同。更多细节请仔细阅读文档。注意,Gambas的行为更符合逻辑。 :-)

Visual Basic中有的,Gambas不这样干。

  • 在Gambas中不能在中断模式下编辑程序代码;如果要编辑需要先结束程序运行。

  • 在Gambas中,简单数据类型(整型数、字符串、等等)的参数是通过值传递给过程和函数。它们不能像VB中那样通过引用传递参数。注意,如果不使用ByVal关键字,VB通过引用传递参数,所以当试图移植VB工程时要小心。而且在两种语言中,对象数据类型的内容(数组类型、集合、对象)都总是通过引用传递!

通过引用传递参数已在发展版中实现。

  • 在Gambas中没有整个工程范围的全局变量这样的东西。作为替代办法,考虑构建一个名为Global的类并在这个类中声明静态公共变量来作为你的全局变量,然后在工程中用Global.变量名 来使用它们。这还是不好的编程习惯,但是至少每当使用它们时还是会被认同为全局变量。;-)

  • 在VB的模块中,不需要在使用变量之前声明它,除非在模块中包含=Option Explicit=命令。Gambas的行为就像=Option Explicit=总是打开,这是为了得到更好、更规范的代码要付出的一点工作。

  • Gambas没有直接与VB窗体控件的index属性等价的属性。当然也可以容易的创建控件数组,但是必须在代码中实现。目前没有在图形方式下实现的办法。因此,当你复制一个控件并插入到它所在的窗体上,不会提示你创建一个控件数组,而是自动给控件的副本重命名一个适当的名称。

  • 目前在Gambas中不能创建透明的标签:背景总是不透明的。

透明标签在发展版中已经实现。

  • 在Gambas中MouseMove事件仅仅当鼠标按钮没有按下时才会发生。有个例外是DrawingArea控件,它有一个甚至允许在鼠标按键按下时获得鼠标移动事件的Tracking 属性。

  • 在VB中可以用符号=+=来连接两个字符串。由于在Gambas中符号=+=仅仅用于数学加法运算,所以当想将两个字符串连接在一起时应该用&符号。

  • 在Gambas中,冒号=:不能用来分隔代码。必须使用新行来分隔。

  • 在VB3.0中打印命令不产生换行。如果用它的printer.print打印出一些文本,那么文本会混乱。在Gambas中打印命令处理一行中所有内容。不会发生混乱。

  • 在VB中可以用Mid$()作为一个命令切除一个子串并插入其他的内容。在Gambas中,不能用于为其赋值新的子串。例如,在VB中: in VB MyString = "The dog jumps" MID(MyString, 5, 3) = "fox" PRINT MyString ---- The fox jumps

在Gambas中这样不会工作。必须像这样做:
'in Gmabas
MyString = "The dog jumps"
MyString = LEFT(MyString, 4) & "fox" & MID(MyString, 8)
PRINT MyString

The fox jumps
Mid$()语法在发展版中已经实现。

  • 非ASCII码字符可以在VB代码中作为合法的标识符使用,这在Gambas中是不允许的。

  • 谢天谢地,在Gambas中不使用GOTO语句,所以不会造成流程混乱和死循环!作为替代Gambas使用CATCHFINALLYTRY

  • ENUM不能用于枚举整型常数。作为替代必须定义每一个ENUM元素为常数。

Examples

 CONST ADDITION AS Integer = 1
 CONST SUBSTRACTION AS Integer = 2

Gambas有的,Visual Basic不这样干。

  • 不像VB,如果想写一个Gambas命令行应用程序,编译不需要GUI支持。仅仅在工程属性对话框中不选中gb.qt4 组件并确定定义了一个SUB Main()过程。

  • 代替=WITH EVENTS=关键字,必须为发生事件的对象提供一个“事件名”。更多信息参看NEW文档。

  • Gambas有控件组的概念,这允许用一个事件处理子程序处理来自任意数量的不同控件的事件。这样可以减少冗余代码并能完成VB的控件索引能完成的工作,以及一些VB不能干的事情。

  • 考虑到VB下没有学习如何进行API 调用(Shell只在背景中启动程序)时不可能同步运行程序并接收其输出,Gambas允许用SHELLEXEC这样干,用Process 类控制你启动的进程,并甚至读写它们,允许用辅助应用程序轻易的添加功能。这使得用Gambas写几乎任何命令行程序的前端变得不可思议的简单。

  • 也能用设备和专用文件做上面所有的事情,诸如串口或并口。用=/proc=文件系统写RAID监视程序,比如,或者用命名的管道得到来自后端程序的信息的复合通道,该后端程序可以是用任何其他语言编写的。

  • 生成奇异形状的窗口,仅仅将当前窗口的ME.PictureME.Mask 属性设置为一个有透明区域的图片。VB却需要调用API 和做更多的工作。

  • 可以动态的创建控件和菜单,仅仅需要用NEW指令实例化。

  • 可以将一个Gambas窗体嵌入到另一个窗体中:当实例化第一个窗体时,指定第二个窗体作为其父类。

  • 控件有Enter和Leave事件,它们允许获知鼠标指针进入或离开控件。用它们能容易的实现鼠标越过效果。

  • 能读取二进制文件中的数据并通过使用Stream 类的ByteOrder 属性自动管理文件格式的字节序。

  • Gambas内部使用UTF-8字符集,所以工程可以容易并完全国际化。

  • Gambas是自由软件,它的开发环境就是用它自己写成的,允许你用BASIC编程经验来大规模的定制它。

还有很多很多其他事情...可以添加你感兴趣的那些内容!:-)

同样的功能,不同的术语

  • End Sub=/=End Function=:请看END

  • Exit Sub=/=Exit Function=:请看RETURN。而且,与其设置一个与函数同名的变量并随后退出函数,不如简单的将要返回的值作为RETURN的参数。

  • End (结束程序):请看QUIT

  • 数组用中括号“[]”取代小括号“()”。所以用=DIM x[9] AS= 代替=DIM x(9) AS Float=

  • 数组没有额外的元素来保存像1..n这样的索引,索引必须是0..(n-1)。

  • On Error Goto=:请看TRYCATCHFINALLY

  • Msgbox=:请看Message。正规是使用Message.info

  • 在Gambas中没有直接和VB的缺省=InputBox=函数(弹出一个dialog提示输入一个值并返回到调用的程序)等价的函数,但是可以查看InputBox页面,这是一个可以下载和包含在你的工程中的类,可以实现相同的目的(而且更多)。*发展版有InputBox 方法。*

  • DoEvents=:请看WAITWAIT也替换频繁使用的Windows API "sleep"函数。

  • 在字符串中插入双引号:与其像VB中一样用两个连续的双引号不如像C或Perl中一样用一个反斜杠作为转意符(")。

  • VScrollBar, HScrollBar: Gambas用ScrollBar替换它们。它会根据控件的大小自动判断滚动条是水平的还是垂直的,控件宽度大,得到水平滚动条,控件高度大,得到垂直滚动条。

  • 打开和保存对话框:可以用qt或增强的KDE对话框来替代windows通用对话框。许多属性的命名是不一样的,而且用一个字符串数组指定筛选条件,就像这样:=[ "Filter 1 (*.foo)" , "Filter 2 (*.bar)" ]=。*这个语法在发展版中有所改变。*

  • 带验证的文本输入:在VB中,每个事件都有一个Cancel参数,可以处理程序执行时设置该参数来阻止事件按常规处理,例如这样就可以实现仅仅允许键入字母或数字,即对输入的域进行验证,或者强制输入为大写或小写字符。在Gambas中,通过使用STOP EVENT指令就能实现同样的功能。

  • 键盘和鼠标事件处理程序不带参数,用MouseKey类的静态公共成员来替代。例如:

  • 在Gambas中,Timer例程返回自程序启动以来逝去的秒数。在VB中它返回自午夜以来逝去的秒数。

  • 不要使用Form.Load 方法。这是与VB的LOAD指令完全不同的方法。在Gambas中,它仅仅是一个创建隐含的窗体实例的静态方法。