从 Zip/SaveSettings 开始学习 Gambas 编程
本节建立在上一页的单选按钮练习的基础上。
Gambas 提供了一种简洁的方式来保存设置。设置可以是上次数据文件的路径,这样下次程序启动时就不必重新定位了。它们可以是用户输入或选择的任何内容,您希望下次记住它们。这里我们将保存所选的单选按钮。
首先,确保设置组件已启用,作为您项目的一部分。启动一个新的 QT 图形项目后,选择项目菜单 > 属性…,查找 gb.settings 组件并选中它
使用与上一页 (RadioButtons) 相同的表单,包含水果和交通按钮,但将代码更改为以下内容
Public Sub rbTransport_Click()
Settings["Radiobuttons/Transport"] = Last.Text
End
Public Sub rbFruit_Click()
Settings["Radiobuttons/Fruit"] = Last.Text
End
Public Sub Form_Open()
Select Case Settings["Radiobuttons/Transport"]
Case "Road"
rbRoad.value = True
Case "Sea"
rbSea.Value = True
Case "Air"
rbAir.value = True
End Select
Select Case Settings["Radiobuttons/Fruit"]
Case "Apple"
rbApple.value = True
Case "Orange"
rbOrange.Value = True
Case "Pear"
rbPear.value = True
End Select
End
运行程序。选择一种交通工具和一种水果。关闭程序。再次运行它:您的选择已恢复。您可以在表单关闭时保存您的设置。Gambas wiki 有 这个例子,展示了如何将窗口恢复到上次拖动到的位置,以及上次程序运行时调整到的尺寸
Public Sub Form_Open() 'Restore settings
Me.Top = Settings["Window/Top", Me.Top]
Me.Left = Settings["Window/Left", Me.Left]
Me.Height = Settings["Window/Height", Me.Height]
Me.Width = Settings["Window/Width", Me.Width]
End
Public Sub Form_Close() 'Save settings
Settings["Window/Top"] = Me.Top
Settings["Window/Left"] = Me.Left
Settings["Window/Height"] = Me.Height
Settings["Window/Width"] = Me.Width
End
我 指的是当前表单。
这些设置实际上存储在哪里?在您的主文件夹中有一个隐藏的用于设置的文件夹,名为 .config 。在 Linux 中,任何以点开头的文件或文件夹都是隐藏的。在 .config 中查找 Gambas3 文件夹。在其中,您将找到一个与您的程序同名的文本文件。打开它,您将看到设置文件。
设置在标题下整齐排列。现在您可以看到带有斜杠的字符串的重要性:第一个项目是标题。Settings["Radiobuttons/Fruit"] 是 Radiobuttons 标题下的 Fruit 设置。
您需要注意:第一次运行程序时可能没有设置文件。如果您的表单打开并查找特定设置,而设置文件不存在,则会出现问题。测试空字符串(null)。
表单上有一个复选框 cbSurnameFirst,一个面板 Panel1,一个带有文本“选择颜色:”的标签,一个颜色按钮 ColorButton1,一个标签 Label1,其文本为“填充”,颜色为蓝色并带下划线,以及一个表格视图 tv1。
运行程序。用随机字母填充表格视图。选择一种颜色。突出显示完全无用的按钮“姓氏在前”。关闭程序。再次运行程序。设置已恢复。
Public Sub ColorButton1_Change()
Panel1.Background = ColorButton1.Color
Settings["Colours/PanelColour"] = Panel1.Background
End
Public Sub Label1_MouseDown()
tv1.Columns.count = 2
Settings["TableView/Columns"] = tv1.Columns.count
tv1.Rows.count = 4
Settings["TableView/Rows"] = tv1.Rows.count
For i As Integer = 0 To tv1.Rows.Max
For j As Integer = 0 To tv1.Columns.Max
tv1[i, j].text = Chr(Rand(Asc("A"), Asc("Z")))
Settings["TableView/" & i & "," & j] = tv1[i, j].text
Next
Next
End
Public Sub cbSurnameFirst_Click()
Settings["Names/SurnameFirst"] = cbSurnameFirst.Value
End
Public Sub Form_Open() 'restore settings
Dim Surname As String = Settings["Names/SurnameFirst"]
cbSurnameFirst.Value = If(IsNull(Surname), False, Surname)
Dim nCols As String = Settings["TableView/Columns"]
tv1.Columns.count = If(IsNull(nCols), 2, nCols)
Dim nRows As String = Settings["TableView/Rows"]
tv1.Rows.count = If(IsNull(nRows), 4, nRows)
For i As Integer = 0 To tv1.Rows.Max
For j As Integer = 0 To tv1.Columns.Max
tv1[i, j].text = Settings["TableView/" & i & "," & j]
Next
Next
Dim colour As String = Settings["Colours/PanelColour"]
Panel1.Background = If(IsNull(colour), &hFFFFFF, colour)
End
IF...THEN...ELSE 语句有一种特殊形式,可以节省编写多行代码的工作。它以函数的形式存在。以下两者是等效的
if IsNull(colour) Then
Panel1.Background = &hFFFFFF 'white
Else
Panel1.Background = colour
EndIf
等效于
Panel1.Background = If(IsNull(colour), &hFFFFFF, colour)
在一行语句中,If(IsNull(colour), &hFFFFFF, colour) 是一个整体。它是一个代表颜色的数字。哪种颜色?括号中有三个项目:一个结果为 true 或 false 的测试,如果测试结果为 true 则为答案,如果测试结果为 false 则为答案。模式为 if( TrueOrFalseThing, ValueIfTrue, ValueIfFalse)。&hFFFFFF 是 White 的十六进制数(所有红、绿、蓝 LED 灯都完全开启)。
这是一个示例设置文件。左侧复选框未选中。右侧复选框已选中。