Gambas 简介

作者:Mark Alexander Bain

您是否曾经想在 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)。

An Introduction to Gambas

图 1. Gambas 欢迎屏幕

Gambas 屏幕让您可以访问示例应用程序——如果您是编程新手,您会发现这些非常有用。在本例中,单击“新建项目”。Gambas 现在显示其项目创建向导,因此请按照说明创建您的第一个项目。当被要求创建图形项目时,将名称设置为 bugTracker(请注意不允许使用下划线),然后将标题设置为 Bug Tracker。您还会被问到将项目存储在哪里。我建议您在您的主目录中创建一个名为 Gambas 的新目录,然后将其用于所有未来的项目。

接下来,我们直接进入新窗体的创建。在项目窗口中单击鼠标右键,选择“新建”,然后选择“窗体”。Gambas 会将您带入其窗体创建向导。您现在需要做的就是给窗体命名——将其称为 frmBugTracker。(不要将其保留为 Form1。这是一个非常糟糕的做法)。

现在,您可以开始向窗体添加元素了——要添加的第一个元素是“关闭”按钮。为什么要先做这个?很简单,您总是希望能够干净利落地轻松关闭窗体或应用程序,因此请尽快养成这个习惯。要创建按钮,请单击工具箱中的图标(图标是一个带有 OK 字样的框),然后使用鼠标左键将其绘制到窗体上。默认情况下,按钮名为 Button1,但与窗体完全一样,我们对其进行重命名。单击按钮,然后按 F4 显示“属性”框。将其名称更改为 btnClose,将其文本更改为“关闭”。

按钮现在还不会执行任何操作——我们必须向其添加一些代码,这真的非常容易。如果您双击按钮,Gambas 会将您带到代码窗口,您会发现一个空的 btnClose_Click 子程序。修改它,使其显示为

PUBLIC SUB btnClose_Click()

  ME.Close

END
An Introduction to Gambas

图 2. 设计新的 Gambas 窗体

您应该注意到在您输入代码时发生了一些事情——当您输入句点后,会弹出一个下拉菜单,其中显示与 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)。

An Introduction to Gambas

图 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

An Introduction to Gambas

图 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 的一个非常简短的介绍,但希望它已经展示了使用它创建真正的可工作应用程序是多么容易。

An Introduction to Gambas

图 5. 最终应用程序

本文的资源: /article/8951

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

加载 Disqus 评论