Gambas 简介
您是否曾经想在 Linux 上使用 Visual Basic?为什么?好吧,您可能像我一样,花了多年时间用 VB 编程,但又想迁移到 Linux,而无需学习一门新语言。也可能是您是编程新手,需要一些可以快速轻松学习的东西——并且仍然能够生成高质量的应用程序。
好吧,现在您可以了——几乎。
Gambas 是 Gambas is—almost—Basic 的缩写,它的设计目的是借鉴 VB 为 Windows 所做的优点,然后将其应用于 Linux。最重要的是,Gambas 易于使用——正如本文所示。我将解释如何在 Gambas 中构建一个有用的应用程序——一个将其信息存储在 MySQL 数据库中的错误跟踪系统。
安装也很简单。首先访问 Gambas 网站,并查看“发行版和操作系统”页面——这只是为了确保您的 Linux 版本没有任何已知的特殊性。然后,转到“下载”页面,获取最新的稳定版本(在撰写本文时为 1.09)。如果您以前做过这类事情,只需继续并准备好使用 Gambas;如果不是,请不要担心——我们快完成了。
打开终端并移动到您保存 bz2 文件的目录。如果您要使用 1.09,它将被称为 gambas-1.0.9.tar.bz2。现在bunzip2该文件,并按照安装说明进行操作(除非发行版页面为您的发行版提供了其他参数)。
这样,您就可以使用 Gambas 了。输入gambas在命令行中,欢迎屏幕就会出现(图 1)。
Gambas 屏幕让您可以访问示例应用程序——如果您是编程新手,您会发现这些非常有用。在本例中,单击“新建项目”。Gambas 现在显示其项目创建向导,因此请按照说明创建您的第一个项目。当被要求创建图形项目时,将名称设置为 bugTracker(请注意不允许使用下划线),然后将标题设置为 Bug Tracker。您还会被问到将项目存储在哪里。我建议您在您的主目录中创建一个名为 Gambas 的新目录,然后将其用于所有未来的项目。
接下来,我们直接进入新窗体的创建。在项目窗口中单击鼠标右键,选择“新建”,然后选择“窗体”。Gambas 会将您带入其窗体创建向导。您现在需要做的就是给窗体命名——将其称为 frmBugTracker。(不要将其保留为 Form1。这是一个非常糟糕的做法)。
现在,您可以开始向窗体添加元素了——要添加的第一个元素是“关闭”按钮。为什么要先做这个?很简单,您总是希望能够干净利落地轻松关闭窗体或应用程序,因此请尽快养成这个习惯。要创建按钮,请单击工具箱中的图标(图标是一个带有 OK 字样的框),然后使用鼠标左键将其绘制到窗体上。默认情况下,按钮名为 Button1,但与窗体完全一样,我们对其进行重命名。单击按钮,然后按 F4 显示“属性”框。将其名称更改为 btnClose,将其文本更改为“关闭”。
按钮现在还不会执行任何操作——我们必须向其添加一些代码,这真的非常容易。如果您双击按钮,Gambas 会将您带到代码窗口,您会发现一个空的 btnClose_Click 子程序。修改它,使其显示为
PUBLIC SUB btnClose_Click() ME.Close END
您应该注意到在您输入代码时发生了一些事情——当您输入句点后,会弹出一个下拉菜单,其中显示与 ME 对象关联的所有方法和参数——在本例中,ME 指的是窗体,因此 ME.Close 表示关闭此窗体。
假设您现在想看看您的辛勤工作的成果。转到“项目”窗口,然后单击绿色的小运行按钮。这就是您的第一个 Gambas 应用程序。您甚至可以使用您全新的按钮关闭窗体。
在构建应用程序本身之前,我们需要考虑我们希望错误跟踪器做什么。然后,我们需要查看数据——如何安排数据,以及将要存储什么。
错误跟踪器必须执行以下操作
输入新错误的详细信息。
记录谁提出了错误。
将错误分配给程序员。
更新错误的状态。
记录错误提出的时间。
记录错误修复的版本。
提供查看新的、正在处理的和已完成的错误的能力。
因此,所需的数据是
谁提出了错误。
谁在修复错误。
错误详细信息。
开发人员详细信息:ID、名字、姓氏和用户名。
错误详细信息:ID、描述、创建日期、提出者 ID、开发人员 ID、状态、版本号和应用程序详细信息。
由此,我们可以开始构建数据库模式。首先创建一个文件(例如 database_schema.sql),我们将使用该文件来创建数据库
/* First you must create the database. The listing table includes only the user ids for "raised by" and "coder". */ create database bugtracker; create table bugtracker.listing ( id int auto_increment primary key, details longtext, application_id int, release float, raised_by_id int, coder_id int, status_id int, created datetime, priority int, status int); /* The coder table is simple but includes the user name. */ create table bugtracker.coder ( id int auto_increment primary key, surname varchar(50), firstname varchar(50), username varchar(50)); /* Finally you can create reference tables for storing application names and status titles. */ create table bugtracker.application ( id int auto_increment primary key, name varchar(50)); create table bugtracker.status ( id int auto_increment primary key, title varchar(50)); /* With the tables created you can add a user account to the database for the bugTracker application to log on to. */ GRANT select,insert,delete,update ON bugtracker.* TO bugtracker@localhost IDENTIFIED BY 'mypassword'; /* Next you can start loading the data that will make the application work. The key information is the coder data. */ insert into bugtracker.coder (username,surname,firstname) values ('bainm','bain','mark'); /* Finally add some dummy data so that you can see the application working as soon as possible */ insert into bugtracker.application (name) values ('bugtracker'); insert into bugtracker.status (title) values ('new'); insert into bugtracker.status (title) values ('worked on'); insert into bugtracker.status (title) values ('rejected'); insert into bugtracker.status (title) values ('completed');
通过键入以下内容创建数据库
mysql -uroot -p<root password> mysql < database_schema.sql
因此,在数据库就位后,是时候回到 Gambas 进行一些实际编程了。
现在我们已经构建了数据库并将数据加载到数据库中,要做的第一件事是连接到数据库,以便我们可以开始与之通信。Gambas 使这非常非常容易。它带有组件,我们所要做的就是告诉应用程序使用适当的组件来连接到数据库。我们也必须编写一些代码,但这也很容易。
转到“项目”窗口,单击“项目”,然后单击“属性”。将出现“属性”屏幕——单击“组件”选项卡,然后选中 gb.db(图 3)。
Gambas 现在可以使用该组件与数据库通信。我们所要做的就是添加少量代码,我们在模块中执行此操作,模块是用于存储代码的文件,以便应用程序可以通用地使用它,而不仅仅是一个窗体。例如,我们已经创建的“关闭”功能仅适用于一个窗体。我们希望创建可供我们创建的任何窗体访问的代码。
在“项目”屏幕上单击鼠标右键,单击“新建”,然后单击“模块”。Gambas 显示“模块创建”向导。就像我们之前制作的窗体和按钮一样,不要将模块名称保留为 Module1。将其称为有用的名称。在本例中,将其称为 Data。创建后,您可以开始向其中添加代码。创建将用于数据库访问的变量
PRIVATE myDB AS NEW Connection PUBLIC tmpRec AS Result
如果您使用过 VB,您会对格式感到满意。如果您是新手,请注意 PUBLIC 语句使变量成为全局变量——整个应用程序都可以访问。如果您不希望整个应用程序都可以访问它,请将其定义为 PRIVATE。
下一个(公共)函数建立连接
PUBLIC FUNCTION connect2db() AS Boolean WITH myDB .Type = "mysql" .Host = "localhost" .Login = "bugtracker" .Password = "mypassword" .Name = "bugtracker" END WITH TRY myDB.Open IF ERROR THEN Message ("Cannot Open bugtracker:" & Error.Text) RETURN FALSE END IF RETURN TRUE END PUBLIC FUNCTION Exec(sql AS String) AS Result RETURN myDB.Exec(sql) END
我们可以从我们创建的任何窗体中调用这些函数。在本例中,我们从 frmBugTracker 中调用它们。双击“项目”窗口中的 frmBugTracker,然后双击窗体本身的任意位置。这将带您进入代码窗口,您应该看到
PUBLIC SUB Form_Open() END
现在我们添加代码来告诉窗体连接到数据库,并且我们还添加一个函数来执行简单的安全检查
PUBLIC SUB Form_Open() Data.connect2db IF (check_id() = FALSE) THEN message ("Unable to log on as " & system.user) ME.close END IF END PRIVATE FUNCTION check_id () AS Boolean data.Exec("select id" & " from coder" & " where username='" & system.user & "'") IF (data.tmpRec.Available ) THEN RETURN TRUE ELSE RETURN FALSE END IF END
如果您现在运行项目,除了加载时间稍长之外,几乎没有什么变化——它现在必须连接到数据库。但是,窗体将使用 check_id 函数根据数据库上的编码员列表检查用户的 Linux 用户 ID。如果 ID 丢失,它将显示一条消息然后关闭窗体。
接下来(保持简单),我们创建一对组合框。一个 (cmdBugId) 显示分配给当前用户的错误 ID 列表。另一个 (cmdStatus) 显示可能的状态列表。然后我们添加一个子程序 (loadCombos) 来填写组合框的详细信息。从工具包中添加组合框后,编写所需的子程序
将其添加到 Data 模块
PUBLIC SUB loadCombo (combo AS ComboBox, sql AS String) combo.Clear tmpRec = myDB.Exec(sql) FOR EACH tmpRec combo.Add (tmpRec[0]) NEXT END
将其添加到 frmBugTracker
PRIVATE SUB loadCombos () data.loadCombo(cmbBugid,"select l.id" & " from listing l, coder c" & " where l.coder_id=c.id" & " AND c.username='" & system.User & "'") data.loadCombo(cmbStatus,"select title from status") END
为了使代码运行,我们必须更改 Form_Open
IF (check_id() = FALSE) THEN message ("Unable to log on as " & system.user) ME.close ELSE loadCombos END IF
现在我们可以单击组合框以选择所需的错误 ID,并使用它来运行另一个查询以查看特定详细信息。为此,我们需要一个文本区域 (txtDetails) 和一些文本框 (txtCreated 和 txtRaisedby、txtPriority、txtApplication 和 txtVersion)。
双击 cmbBugId,进入代码编辑模式,并编辑代码,使其读取为
PUBLIC SUB cmbBugid_Click() data.Exec ("SELECT l.priority,l.created, " & "l.details,l.release," & "s.title, c.username, a.name" & " from listing l,coder" & " c,status s,application a" & " where l.id=" & cmbBugid.Text & " AND l.status=s.id" & " AND l.raised_by_id=c.id" " and l.application_id = a.id") txtDetails.Text = data.tmpRec!details txtCreated.Text = data.tmpRec!created txtRaisedby.Text = data.tmpRec!username txtPriority.Text = data.tmpRec!priority txtApplication.Text = data.tmpRec!name txtVersion.Text = data.tmpRec!release cmbStatus.Text = data.tmpRec!title END

图 4. 查看错误详细信息
下一个阶段是能够记录新错误。我们需要创建一个新窗体 (frmAddBug),并在 frmBugChecker 中添加一个额外的按钮——将其称为 btnAddBug 并将文本更改为“添加错误”。在做任何其他事情之前,不要忘记添加“关闭”按钮。接下来,添加一个文本区域 (txtDetails)、一个文本框 (txtPriority) 和一个组合框 (cmbApplication)。您还需要另一个按钮 (btnSave)
PUBLIC SUB Form_Open() loadCombos END PRIVATE SUB loadCombos() data.loadCombo(cmbApplication,"select name from application") END
我们的第三个窗体将查看所有错误。创建一个新窗体 (frmViewAll),然后转到 frmBugManager,复制所有元素并将它们粘贴到 frmViewAll 中。您需要更改对象的顺序,以便状态组合框位于窗体的顶部。还要添加另一个文本框 (txtCoder)。最后,选择新的“添加错误”按钮,将名称更改为 btnAccept,并将文本更改为“接受”。
对于此窗体,我们需要一些代码首先加载 cmbStatus,因为这将驱动其他窗体
PUBLIC SUB Form_Open() loadCombos cmbStatus_Click END PRIVATE SUB loadCombos() data.loadCombo(cmbStatus, "select title from status") END PUBLIC SUB cmbStatus_Click() data.loadCombo(cmbBugid,"select l.id" & " from listing l, status s" & " where l.status = s.id" & " and s.title = '" & cmbStatus.Text & "'") cmbBugid_Click IF (cmbStatus.Text = "new") THEN btnAccept.Enabled = TRUE ELSE btnAccept.Enabled = FALSE END IF END PUBLIC SUB cmbBugid_Click() txtDetails.Text = "" txtCreated.Text = "" txtRaisedby.Text = "" txtCoder.Text= "" txtPriority.Text = "" txtApplication.Text = "" txtVersion.Text = "" IF ( cmbBugid.Text <> "" ) THEN data.Exec ("SELECT l.priority,l.created," & " l.details,l.release," & " s.title, r.username," & " c.username coder,a.name" & " from listing l,coder" & " r,status s,application a" & " left join coder c on l.coder_id=c.id" & " where l.id=" & cmbBugid.Text & " AND l.status=s.id" & " AND l.raised_by_id=r.id" & " and l.application_id = a.id") txtDetails.Text = data.tmpRec!details txtCreated.Text = data.tmpRec!created txtRaisedby.Text = data.tmpRec!username txtCoder.Text = data.tmpRec!coder txtPriority.Text = data.tmpRec!priority txtApplication.Text = data.tmpRec!name txtVersion.Text = data.tmpRec!release END IF END PUBLIC SUB btnAccept_Click() data.runSQL("update listing" & " set coder_id = " & data.coder_id(system.User) & ",status=2" & " where id = " & cmbBugid.Text) Form_Open END
您需要的最后一件事是 frmBugTracker 中的状态更改代码
PUBLIC SUB cmbStatus_Click() DIM version AS String version = txtVersion.Text IF (version="") THEN version = "Null" END IF data.runSQL(" update listing" & " set status = " & data.get_id("status","title", cmbStatus.Text) & " ,release = " & version & " where id = " & cmbBugid.Text) END
这只是对 Gambas 的一个非常简短的介绍,但希望它已经展示了使用它创建真正的可工作应用程序是多么容易。

图 5. 最终应用程序
本文的资源: /article/8951。
Mark Alexander Bain 在 Vodafone 工作了近 20 年,学习了他的行业技能——使用 UNIX 和 Oracle。最近,他曾在英国一所大学担任讲师,并担任自由撰稿人。您可以在 www.markbain-writer.co.uk 找到他的作品。