[WELCOME]

欢迎使用Gambas

Gambas是一个基于高级Basic语言解释器的图形界面的开发环境。

Gambas的目标是使你能轻易而快速地开发出功能强大的程序。但是高效而简洁的程序还得靠你自己的努力...

希望你能喜欢!

Benoît Minisini
English:gambas@users.sourceforge.net
中文:yizhou.he@gmail.com

[STARTUP]

每一个工程都需要有一个启动类,这个启动类必须定义一个名为Main的无参数的静态公用方法,它将成为你的程序的启动方法。

定义启动类的方法是,用鼠标右键点击工程目录树中要设为启动类的类,并在弹出的右键菜单中选中启动类

你不需要在启动窗体中定义一个Main方法,因为Gambas己经预定义好了。

这个预定义的启动方法创建并显示窗体就像Visual Basic™一样。

[OPEN]

GambasOPEN函数和Visual Basic的不太一样,它并不返回一个整型变量,而是返回一个文件对象。

所以,不要使用:

DIM handle AS Integer
...
OPEN "myfile" FOR READ AS #handle

而应该使用:

DIM handle AS File
...
handle = OPEN "myfile" FOR READ
[CATDIR]

你知道吗?你可以使用&/操作符连结文件路径中的目录和文件,此操作符处理路径尾的斜杠以免重复。

例如:

PRINT "/home/gambas" &/ ".bashrc"
/home/gambas/.bashrc

PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
/home/gambas/tmp/foo.bar

怎么样?好用吧!

[EXEC]

可以将你的整个工程生成一个可执行文件,在工程菜单中选择生成可执行文件

Gambas生成可执行文件时,默认将产生的可执行文件放到你的工程目录下,可执行文件名和你的工程名相同。

[PATH]

相对路径在Gambas中有特殊含义,它们总是指向你工程内的文件。

这里没有当前目录的概念,没有CHDIR之类的关键字来改变它。

注意:只能使用相对路径访问你的工程文件,因为绝对路径在你生成可执行文件后就不再可靠了。 [GLOBAL] Gambas里不再有全局变量了!

相应的,在你的主模块中声明它们为PUBLIC(公用类型)。

如果你的工程中没有主模块,只有主窗体,那么声明它们为STATIC PUBLIC(静态公用类型)。

要访问这些变量,你必须使用主模块名或主窗体名:MyMainModule.MyGlobalVariableMyMainForm.MyGlobalVariable。 [EMPTY]

要知道一个字符串是否为空,没必要使用Len()函数,你可以直接测试它,因为空字符串为FALSE非空字符串为TRUE

例如,你不用写:

IF Len(MyString) > 0 THEN ...
IF Len(MyString) = 0 THEN ...

你只需写:

IF MyString THEN ...
IF NOT MyString THEN ...
[TRANSLATE]

Gambas应用程序是可完全翻译的,条件是你应声明哪些字符串是必须要翻译的,哪些不必翻译。

用括号括起来就表明该字符串是可以被翻译的。

PRINT ("我可以被翻译!")
PRINT "我不能被翻译!"
[EVENT]

每个控件和每个对象都可以产生事件,都有一个event observer(事件观察器)和一个事件 group name(组名)。

事件观察器捕捉对象产生的每一个事件,事件组名将是你用来处理事件的类名的前缀。

默认的事件观察器是你创建的控件的容器对象,事件组名是控件名。

这梓,一个窗体接收你在它上面创建的所有控件发生的事件。

' Gambas form
DIM hButton AS Button

PUBLIC SUB _new()
  hButton = NEW Button(ME) AS "MyButton"
END

PUBLIC SUB MyButton_Click()
  PRINT "You have clicked MyButton !"
END
[FORM]

Gambas中,一个窗体是它自己的事件观察器,所以你可以直接在它自己的类代码中管理它的事件(像ResizeActivate, ...)。

这样,从Visual Basic转来的新手们就不会迷失方向:-)。

[EMBED]

Gambas中,你可以在窗体中嵌入窗体!

要实现如此强大的功能,只要在初始化窗体对象时将父容器做为最后一个参数传给窗体构建函数。

例如:

DIM hForm AS MyDialog
DIM hSuperControl AS MyForm

' 创建一个对话框
hForm = NEW MyDialog
' 在此对话框中插入一个窗体
' 注意此窗体需要三个参数,最后一个参数是容器对象
hSuperControl = NEW MyForm(Param1, Param2, MyDialog)
' 移动并改变窗体的大小
hSuperControl.Move(8, 8, 128, 64)

小心:嵌入后的窗体还是个窗体,它还是它自己的事件观察器。

[GROUP]

每个控件都有一个Group(组)属性,当此属性被设置,事件处理名称的前缀就将是组名而不是控件名。

假定你有一个Button(按钮)名叫btnAction 有一个Click事件处理:

PUBLIC SUB btnAction_Click()

如果你将btnAction(Group)属性设为MyGroup,那么事件处理从按钮收到的事件将是:

PUBLIC SUB MyGroup_Click()

此属性让你在一个函数中处理不同的控件的事件,同组中的控件不需要有相同的类型!

注释: Visual Basic老手可以认为是控件数组,但有更为强大的用法。:-)

[TAG]

每一个控件都有Tag属性,此属性是为编程者设计的,可以是任何你想要的VARIANT(变体类型)数据。

这在使用同组的公用事件处理中区别控件时非常有用。

[LAST]

LAST关键字返回发生事件的最近控件,当你要写一个独立于控件名的事件处理类就非常有用。

例如,假设你要写一个计算器程序。 你定义了十个按钮,每个数字一个,它们都在一个名叫"Digit"的,每个控件的Tag属性都被设为相应的数字。 你的处理程序将会是:

PUBLIC SUB Digit_Click()

  Display = Display & LAST.Tag
  RefreshDisplay

END

[LEFT]

大名鼎鼎的BASIC函数Left$Right$Mid$Gambas中有了新功能。

Left$Right$的第二个参数是可选的,默认值为1。

Left$("Gambas") 返回"G"
Right$("Gambas") 返回"s"

第二个参数可以是负数,它将指定反方向上将被切掉的字符个数。

Left$("Gambas", -2) 返回"Gamb"
Right$("Gambas", -2) 返回"mbas"

相同的,Mid$的第三个参数也可以是负数,指定字符串末端将被切掉的字符的个数。

Mid$("Gambas", 2, -2) 返回"amb" [OBSERVER]

Observer类允许你将对象发生的所有事件在被发送之前截获。

MyTextBox = NEW TextBox(ME) AS "MyTextBox"
MyObserver = NEW Observer(MyTextBox) AS "MyObserver"
...
PUBLIC SUB MyObserver_KeyPress()
  DEBUG "Got it first"
END

PUBLIC SUB MyTextBox_KeyPress()
  DEBUG "Got it next"
END
Observer能取消事件防止对象有效的发出它。 [STRING]

Gambas使用UTF-8字符编码在内存中描述字符串。

但是所有的标准Gambas字符串函数处理ASCII码: LeftMidRightUCase...

如果想处理UTF-8编码的字符串,必须使用String静态类的方法,它们有和标准字符串处理函数相同的名字。

PRINT Len("bébé");; Left$("bébé", 3)
6 bé
PRINT String.Len("bébé");; String.Left("bébé", 3)
4 béb
[ASSIGNMENT]

Gambas实现了C/C++程序员常用的快捷赋值。

MyVariable += 2 等价于 MyVariable = MyVariable + 2

MyVariable &= "Great" 等价于 MyVariable = MyVariable & "Great"

诸如此类... [DEBUG]

可以使用DEBUG语句打印调试信息到控制台(也就是标准错误输出),用法和PRINT语句完全一样。

调试信息前缀有类名,方法名和DEBUG语句所在行号。

调试信息在生成不包含调试信息的可执行文件时被自动删除。 [TRY]

Gambas使用下面的语句实现错误管理: TRYERRORCATCHFINALLY

TRY尝试执行一个语句而不引发错误,随后使用ERROR语句检测语句执行中是否发生错误。

TRY MyFile = OPEN "/etc/password" FOR WRITE
IF ERROR THEN PRINT "I cannot do what I want!"
[CATCH]

Gambas使用下面的语句实现错误管理: TRYERRORCATCHFINALLY

CATCH标明函数或者过程中错误管理部分(错误陷阱)的代码起始。

当错误发生于函数执行的起始到终止之间,执行错误陷阱部分。

如果错误发生于执行错误陷阱代码期间,会正常传送。错误陷阱不保护自己!

SUB ProcessFile(FileName AS STRING)
  ...
  OPEN FileName FOR READ AS #hFile
  ...
  CLOSE #hFile
CATCH ' 仅仅发生错误时执行
  PRINT "Cannot process file "; FileName
END
[FINALLY]

Gambas使用下面的语句实现错误管理: TRYERRORCATCHFINALLY

在函数的尾部,FINALLY语句引领的代码被执行,即使在其执行期间有错误发生。 FINALLY部分是非托管的。如果函数中有错误陷阱,FINALLY部分必须位于陷阱之前。

FINALLY部分是非托管的。如果函数中有错误陷阱,FINALLY部分必须位于陷阱之前。

如果错误发生于FINALLY部分执行期间,错误会正常传送。

SUB ProcessFile(FileName AS STRING)
  ...
  OPEN FileName FOR READ AS #hFile
  ...
FINALLY '总是执行,即使有错误发生
  CLOSE #hFile
CATCH ' 仅当错误发生时执行
  PRINT "Cannot print file "; FileName
END
[END]

你己读完所有今日提示。我希望你己经是一个Gambas的专家了!:-)

如果你想为Gambas贡献一份力量,用电子邮件发送新提示到:

英文:

gambas@users.sourceforge.net

中文:

yizhou.he@gmail.com

预先感谢!