与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使用CATCH、FINALLY或TRY。
-
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允许用SHELL和EXEC这样干,用Process 类控制你启动的进程,并甚至读写它们,允许用辅助应用程序轻易的添加功能。这使得用Gambas写几乎任何命令行程序的前端变得不可思议的简单。
-
也能用设备和专用文件做上面所有的事情,诸如串口或并口。用=/proc=文件系统写RAID监视程序,比如,或者用命名的管道得到来自后端程序的信息的复合通道,该后端程序可以是用任何其他语言编写的。
-
生成奇异形状的窗口,仅仅将当前窗口的ME.Picture和ME.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=:请看TRY、CATCH和FINALLY。
-
Msgbox=:请看Message。正规是使用Message.info。
-
在Gambas中没有直接和VB的缺省=InputBox=函数(弹出一个dialog提示输入一个值并返回到调用的程序)等价的函数,但是可以查看InputBox页面,这是一个可以下载和包含在你的工程中的类,可以实现相同的目的(而且更多)。*发展版有InputBox 方法。*
-
DoEvents=:请看WAIT。WAIT也替换频繁使用的Windows API "sleep"函数。
-
在字符串中插入双引号:与其像VB中一样用两个连续的双引号不如像C或Perl中一样用一个反斜杠作为转意符(")。
-
VScrollBar, HScrollBar: Gambas用ScrollBar替换它们。它会根据控件的大小自动判断滚动条是水平的还是垂直的,控件宽度大,得到水平滚动条,控件高度大,得到垂直滚动条。
-
打开和保存对话框:可以用qt或增强的KDE对话框来替代windows通用对话框。许多属性的命名是不一样的,而且用一个字符串数组指定筛选条件,就像这样:=[ "Filter 1 (*.foo)" , "Filter 2 (*.bar)" ]=。*这个语法在发展版中有所改变。*
-
带验证的文本输入:在VB中,每个事件都有一个Cancel参数,可以处理程序执行时设置该参数来阻止事件按常规处理,例如这样就可以实现仅仅允许键入字母或数字,即对输入的域进行验证,或者强制输入为大写或小写字符。在Gambas中,通过使用STOP EVENT指令就能实现同样的功能。
-
键盘和鼠标事件处理程序不带参数,用Mouse和Key类的静态公共成员来替代。例如:
-
在Gambas中,Timer例程返回自程序启动以来逝去的秒数。在VB中它返回自午夜以来逝去的秒数。
-
不要使用Form.Load 方法。这是与VB的LOAD指令完全不同的方法。在Gambas中,它仅仅是一个创建隐含的窗体实例的静态方法。