从 Zip/语法编程 Gambas
编程是制作应用程序。它也称为“编码”,因为指令是用“代码”编写的。
编程语言有很多种。我们使用的是GAMBAS。(Gambas Almost Means BASic)。BASIC(Beginner's All-purpose Symbolic Instruction Code)于 1964 年 5 月 1 日首次出现(截至我写作的 2019 年,是 55 年前)。每个人都喜欢BASIC。它使我们普通人也能进行编程。Benoît Minisini 设计并编写了GAMBAS,并免费提供。他住在法国巴黎,2019 年 47 岁。他说:“编程是我自 12 岁起就热爱的事物之一”,以及“我正在使用许多其他语言,但我从未忘记我用 BASIC 学到了很多东西,也做了很多事情。”
这是一段代码
Public Sub Form_Open()
gridview1.Rows.count = 5
gridview1.Columns.count = 1
For i As Integer = 0 To 4
gridview1[i, 0].text = Choose(i + 1, "Red", "Yellow", "Green", "Blue", "Gold")
Next
gridview1.Columns[0].text = "Colour"
End
语言是 Gambas。这是一个子程序(也称为方法、过程或子例程。如果它给出了某种答案或结果,则可以称为函数)。
左侧是设计。它是一个窗体。可以将其视为一个窗口。右侧是应用程序运行时的状态。这就是您运行程序时看到的内容。
启动应用程序称为运行它。程序运行。程序中的每个语句都会被执行。Form_open 子程序(上面)填充了gridview 对象。
- 打开 Gambas。
- 双击左侧列表中的 FMain。窗体将打开。
- 在右下角的对象中查找 GridView。将其拖放到窗体上。通过拖动句柄(边缘的小方块)调整其大小。也调整窗体的大小。
- 右键单击窗体(而不是网格视图)> 事件菜单项 > 打开。
- 键入或粘贴打开事件的代码(如上所示)。
- 按 F5 运行程序。
使用包含您刚刚尝试过的网格视图的相同程序,将标签拖到窗体上。
右键单击网格视图 > 事件 > 输入,然后键入此代码
Public Sub gridview1_Enter()
Label1.text = "Hello"
End
右键单击网格视图 > 事件 > 离开,然后键入此代码
Public Sub gridview1_Leave()
Label1.text = ""
End
使用 F5 运行程序。将鼠标移入和移出网格视图。
Label1.text = "Hello" 是一种表示“将单词 Hello 放入 Label1 的文本属性中”的方式。
这是关于编程最重要的思想。编写良好程序的唯一方法是“分而治之”。从大思路开始,然后将其分解成多个部分。逐个编写程序。这称为自顶向下开发。相反的方法也很有用:自底向上开发。编写一个简单的程序,并不断向其中添加部分,直到它完成您希望它完成的所有事情。
最早的程序是简单的程序,只做一件事情。然后出现了菜单,您可以通过按一个键来选择其中的一件事。例如,“按 1 获取您的账户余额。按 2 充值。按 0 与接线员通话。”如今,应用程序可以完成许多事情。要进行选择,您可以在顶部使用菜单栏、下拉菜单以及每个菜单中可以单击的菜单项。您可以单击按钮。按钮可以是独立的,也可以彼此友好并聚集在工具栏中。您可以在任何位置弹出菜单。您可以键入快捷键以使事情发生。可以有多个窗口。在窗口(窗体)内,可以有多个页面,顶部可以带或不带索引选项卡。
按钮可以位于屏幕上,也可以是键盘上的物理按键。标准键盘有 101 个按键,但如果您在键入时按住CTRL-(控制键),则所有按键都可以赋予第二个功能。这为您提供了 202 个按键。不够吗?按住SHIFT-(换档键)会使所有按键再次不同,为您提供 303 个按钮。有ALT-(替代)使所有按钮再次不同:404 个按钮。组合按住的修饰键为您提供了更多按键集,就像更多键盘一样:SHIFT+CTRL、CTRL+ALT 和SHIFT-CTRL-ALT。现在我记不清了。幸运的是,没有应用程序使用它们全部。
良好编程的关键是将事物井然有序。整洁有序。安排事物。您经常执行的操作应将其按钮可见;您不常执行的操作可以隐藏在弹出菜单中。
将复杂的任务简化为一系列简单的步骤。编写大量的小子程序,而不仅仅是一个大子程序。编写“主子程序”,调用较小的子程序来完成小任务。其中最大的主程序是用户。您使用程序执行此操作,然后执行该操作,然后执行其他操作。程序表示,“为您服务!”并调用您编写的不同子程序来执行您想要的操作。同时,它等待并监听您的命令,检查键盘和鼠标,或者,如果它没有等待您,它会继续忙于执行您设置的工作。
上面的程序有两个事物(称为对象):一个窗体和一个网格视图。
发生的事情称为事件。
有一个事件在窗体打开时“触发”。它被称为(毫不奇怪)OPEN 事件。如果希望在窗体打开时发生某些事情,请编写一个名为Form_Open 的子程序。当OPEN 事件触发时,将执行那里的指令。应用程序启动时,窗体将打开。
您必须考虑两件事:什么会发生以及何时会发生。“什么”是子程序中的指令列表。“何时”是选择要处理的事件的问题。
一切事物都必须有名称。人有名字。窗体有名称。按钮有名称。您可以使用字母和数字进行选择,始终以字母开头,并且不包含任何空格。
主窗体称为FMain。其打开事件为Form_Open。
我喜欢将其称为FMain 的约定。“F”表示“窗体”。如果我有一个列出人员地址的窗体,我将将其称为FAddress。当它打开时——也许是单击按钮——其打开事件将查找名为FAddress_Open 的子程序。
右键单击对象,选择事件,然后单击要为其编写一些编程内容的事件
- 右键单击窗体 > 事件 > 打开 > 为打开事件编写代码。
会有一个又长又复杂的事件列表。不要惊慌:只有少数几个经常使用。学习这门语言很大一部分是熟悉对某些对象最有用的事件。例如,按钮喜欢被点击;你不会经常使用其他事件。可能,进入按钮会在窗口底部的一行中显示一些帮助文本,离开它会清除消息,但并不常见。我还没有见过按钮的双击处理程序:谁会双击按钮?你会习惯对象拥有的常用事件。
- 在您编写的程序中,键入或粘贴此子程序。每次您将鼠标滚轮滚动到网格视图中时,都会显示一条“Hello”消息。当您尝试过并且它足够烦人时,删除这三行代码。
Public Sub Gridview1_Enter()
Message("You have entered the gridview ... evil laugh...")
End
当您双击时,将发生Activate事件。输入这些行并双击任意一行。
Public Sub gridview1_Activate()
Message("You double-clicked row " & gridview1.row)
End
gridview1.row 是您双击的行。在您单击或双击时设置。 “&” 符号(与号)连接两个文本字符串。(字符串是文本……一个接一个的字符。)下一段代码将在您单击gridview1时执行某些操作。
Public Sub gridview1_Click()
Label1.text = "You clicked on row " & gridview1.Row & ", " & gridview1[gridview1.row, 0].text
End
有两个字符串。(1)“You clicked on row ” 和(2)“,”。字符串周围用双引号括起来。
等于右侧的内容进入左侧的内容。
您不会将内容放入Label1 中;您将其放入Label1的text属性中。
通常语言不允许这样做:Label1.text = 345。它必须是 Label1.text = "345" 或 Label1.text=Str(345),但 Gambas 不介意。Gridview1.Row 指的是您单击的行号。数字通常存储在存储数字的地方,字符串存储在存储字符串的地方,但 Gambas 会自动转换它。
gridview1[gridview1.row, 0].text 看起来很复杂,但让我们分解一下。从左边看,它与gridview1有关。从右边看,它是某物中的text。方括号中的部分是两个用逗号分隔的数字:您单击的行和零。在上面的示例中,它是 [2,0]。第二行,第零列。
网格视图的行和列从零开始编号。
在本部分中,示例不是 Gambas,但它们是用 Gambas 风格编写的。
看,约翰和琼
部件的引用方式类似于John.arm、Joan.head
有时部件有更小的部件,例如John.hand.finger
部件有属性,例如Joan.height
某些属性是整数(整数),例如Joan.Toes.Count
某些属性是浮点数(带小数部分的数字),例如John.height。这与John.Leg.Height不同。
某些属性是布尔值(真/假,是/否),例如戴帽/不戴帽。我们可以说,作为一类,人都具有一个名为 HatOn 的属性,“John.HatOn” 或“Joan.HatOn”。(它是真或假。)
它们属于名为“person”的类。约翰是一个人;琼是一个人。人都具有身高、体重、戴帽/不戴帽和其他属性。
人还有各种能力。“person”类可以唱歌、挥手和微笑。他们的腿可以行走。例如,John.sing(“Baby Face”)。有时约翰需要知道哪个版本,例如,John.sing(“Baby Face”, “Louis Armstrong”) 或 Joan.wave(“Hello”, “John”, 8)。这意味着“琼!向约翰热情地挥手打招呼!”
他们还可以对各种事件做出响应,例如被推,或者听到有人唱歌。这些事件是John_push()和Joan_push()、John_HearsSinging()和Joan_HearsSinging()
让我们用 Gambas 的风格编写对这些事件的响应。
当 Push 事件发生时,约翰可能会感到恼火。
Public Sub John_push()
John.Turn(180)
Message.shout(“Hey! Quit shoving!”)
End
琼可能会加入她听到的歌曲,并开始一起唱。
Public Sub Joan_HearsSinging(“Ave Maria”)
Joan.HatOn = False
Joan.sing(“Ave Maria”)
End
布尔属性是是/否、真/假、戴帽/不戴帽之类的东西。将 false 放入 HatOn 属性意味着在唱歌之前取下她的帽子。
约翰有转身的能力,但我们必须说明要转多少。他转动 180°,做一个转身,以便面对推他的人。
玛丽可以唱歌,但我们必须说明要唱哪首歌。是她正在听到的那首。我们说HearsSinging事件传递了歌曲的名称,“Ave Maria”。该歌曲标题传递给琼的唱歌能力,该能力称为Joan.sing。您传递的信息以便可以执行该操作称为参数。某些方法需要多个参数,它们可以是数字(整数、浮点数……)或字符串(如“Jingle Bells”或“Fred”或“别再推了,行吗?!”)或布尔值(戴帽/不戴帽、抱怨/不抱怨、真/假之类的东西),或其他对象,或者,好吧,任何东西。
让我们定义一个子程序,这次我们在其中添加一些重复。有两种重复——一种是重复一定次数,另一种是必须检查某些内容以查看是否该停止。(而且后者有两种,一种是在开始之前检查是否该停止,另一种是在完成之后检查——预测试循环或后测试循环。)以下是确定和不确定类型。
五次
Public Sub DoExercises()
For i as integer = 1 to 5
Hop()
Next
End
直到疲倦
Public Sub DoExercises()
Do Until Tired()
Hop()
Loop
End
只要不疲倦
Public Sub DoExercises()
While Not Tired()
Hop()
Wend
End
在第一个中,将会有 5 次跳跃,仅此而已。“i” 是在For i as integer = 1 to 5行创建的整数,它从 1 计数到 5。它由NEXT一词增大 1。重复的部分称为循环。
Tired() 是必须解决的问题。解决它的程序将在其他某个子程序中。最后会有一个答案:你累了吗?是或否,真或假。这将作为最终值返回。Tired() 看起来像一个单一事物,即函数返回的值。函数计算某些内容并提供答案。
如果“hop”尚未知道,则“Hop”可能需要进一步解释。您可以使用任何您喜欢的虚构词,只要您用 Gambas 内置且已知的术语来解释它们即可。以下是一个解释Hop程序的子程序。
Public Sub Hop()
GoUp()
GoDown()
End
将程序分解成更简单的程序的优点在于程序本身可以解释。您无需陷入如何完成的细节中,即可为复杂的任务命名。您不仅可以使用对阅读您程序的其他人有意义的词语,还可以更轻松地跟踪错误。您可以更轻松地测试每个部分。您还可以更轻松地修改程序。DoExercises() 可以保持原样,但您可以使用以下内容更改跳跃的定义:
Public Sub Hop()
GoUp()
ShoutAndPunchTheAir()
GoDown()
End
或
Public Sub Hop()
GoUp(LeftFoot)
GoDown()
GoUp(RightFoot)
GoDown()
End
单引号后的任何内容都是您自己的注释。Gambas 会忽略它。添加注释以提醒您正在做什么。它还可以向可能需要阅读您的程序的其他人解释您的想法。以下是一些伪代码:
Public Sub Joan_HearsSinging(“Ave Maria”) 'you must say what the song is
Joan.HatOn = False 'remove your hat
'now the fun starts
Joan.sing(“Ave Maria”) 'sing the same song
End
伪代码到此结束。下一部分将回到 Gambas。