從 Zip/三件事程式設計 Gambas
本節中的程式碼是 Gambas。上一節是虛擬碼。
計算機可以做三件事:記憶體、重複和條件執行。重複是像處理數百萬個數字或數千條記錄一樣一遍又一遍地做事。條件執行意味著做出選擇。
計算器有時有 M+ 和 MR 鍵。當您按下 M+ 時,顯示的任何數字都會進入記憶體。每當您需要再次使用該數字時,為了避免重新輸入,請按下記憶體召回按鈕,MR。記憶體就像您給自己做的一個便條,提醒您記住這個數字。
計算機擁有您喜歡的任意數量的記憶體,您可以為它們命名。將東西放入記憶體就像輸入Age = 23一樣簡單。右側的內容將放入左側的記憶體中。要檢視名為Age的記憶體中的內容,請將其打印出來或將其放到您可以看到的地方。Label1.text = "您的年齡是" & Age。
在您使用某些名稱作為記憶體之前,您必須告訴 Gambas 將儲存在其中的內容的型別。這就是DIM語句的作用。您在使用它之前宣告它。例如,Dim Age As Integer 或 Dim FirstName as String。如果記憶體與某個東西相關聯,它們被稱為變數或屬性。
您可以在一行中宣告記憶體並將內容放入記憶體中
Dim FirstName as String = "Michael"
您可以使用記憶體來計算某些內容,並將答案放入另一個記憶體中
Dim Speed as float = 45
Dim Time as float = 1.5
Dim Distance as Float = Speed * Time
Label1.text = Format(Distance, "##0.##") & "km/hr"
要DIMension 東西,您需要知道允許的型別。這是一份資料型別列表
| 姓名 | 描述 | 例子 | 預設值 |
布林值
|
真或假 | 1 = 2 | 假 |
整數
|
從 -2147483648 ... +2147483647 的整數 | 123 | 0 |
浮點數
|
帶小數部分的數字,如 2.34 | 2.34 | 0.0 |
日期
|
日期和時間,每個都儲存在一個整數中。 | 空值 | |
字串
|
字母、數字和符號串在一起。文字。 | "ABC 12%" | 空值 |
變體
|
任何資料型別。它必須在使用之前轉換為某種型別。 | 空值 |
有六個標籤,三個文字框和一個按鈕。標籤的名稱無關緊要,但文字框和按鈕的名稱應如所示。該程式是
Public Sub bCalculate_Click()
tbSpeed.text = Val(tbKilometres.text) / Val(tbHours.text)
End
“Val”接受字串並將其轉換為數字。它的意思是“的值”。它可以這樣寫,使用變數,但這將需要更多行
Public Sub bCalculate_Click()
Dim d As Float = Val(tbKilometres.text)
Dim t As Float = Val(tbHours.text)
Dim s As Float = d / t
tbSpeed.text = s
End
如果您想為變數賦予更好的名稱,
Public Sub bCalculate_Click()
Dim distance, time, speed As Float
distance = Val(tbKilometres.text)
time = Val(tbHours.text)
speed = distance / time
tbSpeed.text = speed
End
您可以編寫一個接受距離和時間並返回速度的函式。教計算機做事是件好事。在這裡,我們已經教會了計算機,Speed(5,2) 是 2.5。我們的計算按鈕使用它。我們可能有一個也使用它的選單項。
Public Sub bCalculate_Click()
tbSpeed.text = Speed(Val(tbKilometres.text), Val(tbHours.text))
End
Public Sub Speed(d As Float, t As Float) As Float
Return d / t
End
現在讓我們欺騙我們的程式。不要為距離或時間輸入任何內容。只需點選“計算”按鈕。可憐的傢伙無法應對。我們得到這個錯誤
問題出現在極端情況下。在重複的節段中,它們最有可能出現在第一次或最後一次重複中。這裡有一個極端的輸入:什麼都沒有,零,空。Gambas 無法獲得那個的 Val( )。
tbKilometres.text 是Null。我們應該預料到有人可能會在不輸入任何數字的情況下點選按鈕。這裡有兩種方法來處理這種情況,第二種方法更好,因為“預防勝於治療”
1. 提前結束(從子程式中提前返回)
Public Sub bCalculate_Click()
Dim d, t, s As Float
If IsNull(Val(tbKilometres.text)) Then
Message("Hey, you there! Give me a NUMBER for the kilometres.")
Return
Else
d = Val(tbKilometres.text)
Endif
If IsNull(Val(tbHours.text)) Then
Message("A number would be nice for the hours. Please try again.")
Return
Else
t = Val(tbHours.text)
Endif
s = d / t
tbSpeed.text = s 'To round to 2 decimal places, change s to format(s,"#.00")
End
2. 只有在計算能夠繼續進行時才啟用按鈕。將按鈕的 Enabled 屬性設定為 False,作為開始。我們需要處理一些事件。
Public Sub bCalculate_Click()
tbSpeed.text = Val(tbKilometres.text) / Val(tbHours.text)
Fmain.SetFocus 'otherwise the button stays highlighted; focus the form
End
Public Sub tbKilometres_Change()
CheckBothAreNumbers
End
Public Sub tbHours_Change()
CheckBothAreNumbers
End
Public Sub CheckBothAreNumbers()
bCalculate.Enabled = Not IsNull(Val(tbKilometres.text)) And Not IsNull(Val(tbHours.text))
End
bCalculate.Enabled = 表示“將按鈕的 Enabled 屬性設定為...”
Not IsNull(Val(tbKilometres.text)) 表示如果公里文字框中的文字可以轉換為數字,則為是。
每個文字框都有一個 Change 事件。它在框中的文字發生更改時觸發。每次您按下某個鍵時,該 Change 事件都會檢視是否該啟用 bCalculate 按鈕。
因為我不能讓事情順利進行,我為引入“Group”屬性表示歉意。您可能需要咖啡。或者跳過本節。您是否注意到這兩個文字框必須以相同的方式分別處理 Change 事件?tbKilometres 和 tbHours 都檢查是否有數字,並相應地啟用或停用按鈕。如果這兩個文字框都像一個文字框一樣,那不是很好嗎?Gambas 可以做到這一點。將它們放在一個Group中。然後,這個單一的組將有一個Change事件,您可以只處理一次。Group 是一個屬性。找到每個的 Group 屬性並將其設定為“InputBox”。現在您的程式碼變得最簡單
Public Sub bCalculate_Click()
tbSpeed.text = Val(tbKilometres.text) / Val(tbHours.text)
Fmain.SetFocus 'otherwise the button stays highlighted; focus the form
End
Public Sub InputBox_Change()
CheckBothAreNumbers
End
Public Sub CheckBothAreNumbers()
bCalculate.Enabled = Not IsNull(Val(tbKilometres.text)) And Not IsNull(Val(tbHours.text))
End
就好像這兩個文字框變成了輸入框(您剛發明的名稱),具有相同的事件。一組用於多個物件的事件處理程式。
它很健壯(能夠抵抗那些堅持不按您期望的方式使用您的應用程式的使用者)。它很簡潔(3 個事件處理程式,4 行程式碼)。它有效。只有一件事:一個寫著 QUIT 的按鈕,它的 Click 事件中只有一件事:Quit 命令。交給你了。
這個遊戲很容易玩:一個人在 1 到 100 之間想一個數字。您嘗試用盡可能少的猜測來找出這個數字。每次都會告訴你“太高了!”或“太低了!”。
有三個標籤和一個文字框。上面寫著“猜...”的大標籤名為labMyReply。文字框名為tbGuess。左下角的小標籤名為labCount。
Public MyNumber As Integer
Public Sub Form_Open()
MyNumber = Rand(1, 100)
End
Public Sub tbGuess_KeyPress()
If Key.Code = Key.Enter Or Key.Code = Key.Return Then GiveMessage
End
Public Sub GiveMessage()
If IsNull(tbGuess.text) Then 'no guess at all
labMyReply.text = "Guess..."
Return
Endif
Dim YourGuess As Integer = Val(tbGuess.text)
If MyNumber = YourGuess Then
labMyReply.Text = "Right! " & MyNumber
MyNumber = Rand(1, 100)
tbGuess.text = ""
FMain.Background = Color.Green
labCount.text = "0"
Return
Endif
If YourGuess > MyNumber Then labMyReply.Text = "Too High!" Else labMyReply.Text = "Too Low!"
tbGuess.text = ""
FMain.Background = Color.Pink
labCount.text = Val(labCount.text) + 1
End
該程式在文字框中按下 ENTER 或 RETURN 時檢查猜測。Key 類是靜態的,這意味著它始終存在——您不必宣告或建立它。如果您需要檢查某個鍵(例如 SHIFT-C)是否被按下,您將編寫
If Key.SHIFT And Key.Text = "C" Then
GiveMessage
Stop Event
Endif
Stop Event 行是為了防止大寫 C 被列印在文字框中,這在您在文字框中輸入 Shift-C 時通常會發生。
Public MyNumber As Integer 表示我們要一個名為MyNumber的公共屬性。您可以說 Private 而不是 public。私有屬性只能在屬於該表單的程式碼中訪問。如果我們有其他表單(即視窗),它們看不到另一個表單的私有屬性。將屬性宣告為private 是一種告訴您(程式設計師)的方式,您只在您正在檢視的此表單的程式碼中使用了此屬性。此外,另一個表單可以有它自己的屬性並使用相同的名稱。
在Event Form_Open()事件處理程式中,Rand(1,100)是一個內建函式,表示1到100之間的隨機數。
在Event tbGuess_KeyPress()事件處理程式中,剛剛輸入的鍵與Enter鍵和Return鍵進行比較。如果它其中之一,則檢查猜測。每個鍵都有一個數字。Enter是16777221,Return是16777220。我們不需要知道這些數字,因為它們儲存在Key.Enter和Key.Return中。這些是Key類中的常量。因為Key類是靜態的,所以我們不必建立它的新例項:它始終存在,我們可以透過其名稱引用它。我們永遠不需要另一個例項。鍵盤只有一個。我們永遠不必說“ACER筆記型電腦鍵盤的Key”或“在HP筆記型電腦鍵盤上輸入的Key”。
If IsNull(tbGuess.text) Then … End避免了使用者在沒有任何數字的情況下按Enter鍵的糟糕情況。
Dim YourGuess As Integer = Val(tbGuess.text)將輸入內容的數值放入名為YourGuess的變數中。這是一個整數。如果使用者輸入了34.56,則只有34會被放入YourGuess中。
If MyNumber = YourGuess Then…檢查YourGuess是否與MyNumber匹配。如果是,則顯示“正確!”訊息並使表單的背景顏色變為綠色。選擇另一個隨機數以備下次遊戲,然後Return,因為不需要再做其他操作。
If YourGuess > MyNumber Then labMyReply.Text = "太高了!" Else labMyReply.Text = "太低了!"將相應的訊息放入labMyReply文字框中。這是一個單行If...Then...Else語句。無論哪種情況,都會繼續使背景變成粉紅色。
從Gambas幫助頁面中,這些是Key類的屬性和常量

常量返回整數。屬性是輸入的內容。因此,您可以透過if Key.Code = Key.PgDown then…來檢查使用者是否輸入了PgDown鍵。瀏覽和閱讀幫助頁面本身就是一項技能。
Select … Case … — 多種選擇
[edit | edit source]評分學生成績
[edit | edit source]讓我們將數字輸入TableView並使其計算出每個學生是否獲得了A、B、C、D、E或F等級。我們需要兩列。第一列用於分數,第二列用於等級。
目前我們將跳過為學生姓名新增一列。為了避免使用許多IF...THEN...語句,我們將使用它的“兄長”SELECT...CASE…。
TableView的名稱是tvMarks。文字框的名稱是tbRows。雙擊表單的空白部分,輸入表單的open事件的程式碼。
Public Sub Form_Open()
tvMarks.Columns.count = 2
End
雙擊文字框並輸入
Public Sub tbRows_KeyPress()
If Key.Code = Key.Return Or Key.Code = Key.Enter Then tvMarks.Rows.Count = Val(tbRows.Text)
End
右鍵單擊TableView > 事件 > 點選,然後右鍵單擊 > 事件 > 儲存,並輸入以下內容
Public Sub tvMarks_Click()
If tvMarks.Column = 0 Then tvMarks.Edit
End
Public Sub tvMarks_Save(Row As Integer, Column As Integer, Value As String)
tvMarks[Row, Column].Text = Value
Dim x As Float = Val(Value)
Select Case x
Case 90 To 100
tvMarks[Row, 1].Text = "A"
Case 80 To 89
tvMarks[Row, 1].Text = "B"
Case 70 To 79
tvMarks[Row, 1].Text = "C"
Case 60 To 69
tvMarks[Row, 1].Text = "D"
Case 50 To 59
tvMarks[Row, 1].Text = "E"
Case Else
tvMarks[Row, 1].Text = "F"
End Select
End
tvMarks_Click()處理程式允許您在列為0時在單元格中輸入內容。如果單擊列1,則您將無法輸入內容:單擊時不會發生任何事情。
您可能會認為您在單元格中輸入的任何內容都應該顯示出來。但事實並非如此。它會引發Save事件。您可能希望顯示的內容與輸入的內容不同。在Save事件期間,將輸入的文字實際放入單元格的text屬性中。
tvMarks[Row, Column].Text = Value
Save事件帶三個引數,您可以在事件處理程式過程中自由使用:tvMarks_Save(Row As Integer, Column As Integer, Value As String)。這行程式碼將輸入的值放入單元格的文字中。哪個單元格?tvMarks[row, column]。這就是單元格。
您可以使用方括號引用單元格:tvMarks[1,0]指的是第1行第0列。(請記住,行和列從零開始編號。)tvMarks.Rows[2]是第2行。tvMarks.Columns[1]是整個第1列。
一個不錯的補充 - 交替著色行
[edit | edit source]TableView_Data()事件非常有用。它會在每次需要在螢幕上重新繪製單元格時引發(發生)。(請記住,它處理的是單元格,而不是行或列或整個表格。)右鍵單擊TableView,然後 > 事件 > 資料,並輸入以下內容
Public Sub tvMarks_Data(Row As Integer, Column As Integer)
If Row Mod 2 = 0 Then tvMarks[Row, Column].Background = &F0F0FF
End
這將使交替行顯示淺藍色(非常漂亮)。解釋一下,單元格有一個名為“background”的屬性。它是一種顏色。可以使用多種方式描述顏色:使用直接數字是最簡單的。數字是&F0F0FF。
顏色編號
[edit | edit source]
什麼是&F0F0FF這樣的數字?“&”符號表示數字是用十六進位制表示的。通常我們使用十進位制系統,它是10進位制。您從零計數到九,然後數字回到零,並將左側數字增加一。以下是10進位制的正常計數:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,16… 使用十六進位制,您有16個數字,而不是十個。以下是16進位制的計數:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 1C, 1D, 1E, 1F, 20, 21… 十進位制系統中的第十一個數字寫為11。十六進位制系統中的第十一個數字寫為B。
現在,&F0F0FF是什麼顏色?十六進位制數字F0F0FF實際上是三個兩位數:F0、F0、FF。第一個數字表示多少紅色。第二個數字表示多少綠色。第三個數字表示多少藍色。這就是RGB,即紅綠藍。每個數字從00到FF。第一個位置的00表示“完全沒有紅色”。第一個位置的FF表示“最大紅色!”。純紅色是&FF0000。純綠色是&00FF00,純藍色是&0000FF。因此,純黑色是&000000。純白色是&FFFFFF,即所有顏色都儘可能明亮。
這種顏色是灰色:&F0F0F0。紅色、綠色和藍色的燈光大部分都亮著,但沒有完全亮。F0不如FF亮。要獲得更深的灰色,請降低數字,但要同時降低所有數字,例如,C0C0C0。再深一些,B0B0B0。比這稍微深一點的是AFAFAF,因為AF之後是B0。重點是,當所有數字都相同時,您將獲得灰色陰影。因此,請檢視F0F0FF。它是一種非常淺的灰色(F0F0F0),但最後一個數字(用於藍色)稍微亮一點。它是FF。因此,這種顏色是一種非常淺的灰色,只是藍色稍微亮一點。也就是說,它是一種非常淺的藍色。它完全取決於三種顏色的混合,即紅色、綠色和藍色。這是淡粉色:FFD0D0。這是淡綠色:D0FFD0。這是淡黃色:FFFFD0。(紅色=最亮,綠色=最亮,藍色=稍微暗一些)。這是滿黃色:FFFF00。
這完全取決於您螢幕上的微型LED燈。它們有數百萬個,但它們以三個一組排列 - 一個紅色、一個綠色和一個藍色。您可以控制每個微型燈的亮度。亮度範圍從00到FF,或者用十進位制表示,從0到255。(FF=255)。一個紅色、一個綠色和一個藍色就像一個彩色點。它被稱為畫素。典型的筆記型電腦螢幕的解析度為1366 x 768畫素。即1,049,088個畫素。每個畫素都有三個微型LED燈,總共有3,147,264個燈光在您的螢幕上,每個燈光有256個亮度等級。太神奇了!
新增退出選單
[edit | edit source]
單擊“+插入”。將此選單命名為MenuFile,並將標題設定為File。標題是使用者看到的內容。名稱是我們用於在程式設計中引用選單的方式。
再次單擊“+插入”。我們希望它成為File選單的一部分,因此請單擊工具欄上的向右推按鈕。趁此機會,為選單設定快捷鍵CTRL-Q。


現在編寫一個處理程式,用於處理使用者單擊MenuQuit時的事件。(要執行此操作,請在表單中找到File選單並單擊它,然後單擊選單項Quit。)
Public Sub MenuQuit_Click()
Quit
End
程式碼的重複部分稱為迴圈。有幾種不同的重複方式。
Gambas 幫助列表在 http://Gambaswiki.org/wiki/cat/loop
計數固定次數
For i as integer = 1 to 5
'do something
Next
i 是一個整數,計數 1、2、3、4、5。如果你已經有了 DIM i As Integer,不要放“as integer”。
你可以在迴圈中使用 i,但不要改變它的值。NEXT 這個詞會把它加 1,並將計算機送回開頭(FOR 行),在那裡 i 會被檢查是否大於 5。如果它大於 5,就會去 NEXT 後的那行。
Repeat
'do something
Until x > 50
While x < 50
'do something
Wend
要退出迴圈,用 BREAK。要退出子程式,用 RETURN。要進行下一個重複,用 CONTINUE。
還有無限迴圈 DO ... LOOP,以及用於編號列表中專案的 FOR EACH ... NEXT。
Public Sub Button1_Click()
Do
Repeat 'move to the right
Button1.x += 1
Wait 0.001
Until Button1.x + Button1.w = FMain.Width
Repeat 'move to the left
Button1.x -= 1
Wait 0.001
Until Button1.x = 0
Loop
End
Public Sub Form_KeyPress()
Quit
End
當你按下鍵盤上的一個鍵時,程式結束。Wait 0.001 將進度延遲千分之一秒。此延遲允許重新繪製按鈕。X 和 Y 通常用於表示 橫向 和 縱向。按鈕從左到右移動,然後再返回,所以我們需要改變的是 Button1 的 X。按鈕一直向右移動,直到它的左邊加上它的寬度等於窗體的寬度。換句話說,當按鈕的右邊到達窗體的右邊時,它停止向右移動。在那之後,我們開始從 X 中減去,直到它到達窗體的左邊。嘗試在按鈕移動時改變視窗的大小:按鈕仍然會移動到邊緣。
鍵入任意數字,每個數字用 Enter 鍵結束,以進入下一行。當你按下 Enter 鍵時,總計會更新。
Public Sub Form_Open()
tv1.Rows.Count = 6
tv1.Columns.Count = 1
End
Public Sub tv1_Save(Row As Integer, Column As Integer, Value As String)
Dim t As Integer
tv1[Row, Column].Text = Value
For i As Integer = 0 To 4
If IsNull(tv1[i, 0].text) Then Continue
If Not IsNumber(tv1[i, 0].text) Then Continue
t += Val(tv1[i, 0].text)
Next
tv1[5, 0].Background = Color.LightGray
tv1[5, 0].Foreground = Color.Blue
tv1[5, 0].RichText = "<b>" & t & "</b>" 'tv1[5, 0].text = t
End
Public Sub tv1_Click()
If tv1.Row < 5 Then tv1.Edit
End
注意總計單元格是如何在淺灰色上顯示藍色,以及文字是如何加粗的。"<b>" & t & "</b>" 是總計兩側的標籤。富文字是帶有標籤的文字。第一個標籤是“開啟加粗”,第二個標籤帶斜線,是“關閉加粗”。
當按下 Enter 鍵或 Return 鍵時,就會發生 Save 事件。將鍵入的數字放入帶有 tv1[Row, Column].Text = Value 的單元格後,新的總計會放入單元格 tv1[5, 0] 的富文字中。
Gambas 允許在富文字中使用這些標籤。它們是 HTML(超文字標記語言)的一部分,網頁瀏覽器用它來顯示網頁。每個標籤都會先開啟,然後在末尾關閉,例如 "<b><i>這是加粗斜體</b></i>"。
| <h1>,<h2>, <h3>, <h4>, <h5>, <h6> →標題 | <sup> 上標 |
| <b> 加粗字型 | <small> 小字型 |
| <i> 斜體 | <p> 段落 |
| <s> 刪除線 | <br> 換行 |
| <u> 下劃線 | <a> 連結 |
| <sub> 下標 | <font> 字型 |
字型標籤的使用方式如下:"<Font Color=#B22222>" & "<Font Face=Candara>" & t & "</Font>"
段落標籤表示段落,瀏覽器通常用空行將它們隔開。它可以使用這種方式:<p align=right>一些文字</p>,但在一個關於 HTML 的網頁上,它說,“<p> 標籤上的 align 屬性已過時,不應該使用”。(https://mdn.club.tw/en-US/docs/Web/HTML/Element/p)。同時,它也能使用。
| <tt> 單行原始碼文字 | <pre> 預格式化文字(保留空格) |
| <hr> 水平線(不需要結束標籤) | <ul> 無序列表 |
| <li> 列表項 | <ol> 列表 |
<ul><li>吉姆</li><li>約翰</li><li>安</li></ul> 將在垂直列表中顯示專案符號。
<ol><li>吉姆</li><li>約翰</li><li>安</li></ol> 將在垂直列表中顯示編號。
此程式在你鍵入 4 x 5 網格中的數字時將其加起來。
Public Sub Form_Open()
tv1.Rows.Count = 5
tv1.Columns.Count = 4
End
Public Sub tv1_Save(Row As Integer, Column As Integer, Value As String)
Dim i, j, t As Integer
tv1[Row, Column].Text = Value
For i = 0 To tv1.Rows.Max
For j = 0 To tv1.Columns.Max
If IsNull(tv1[i, j].text) Then Continue
If Not IsNumber(tv1[i, j].text) Then Continue
t += Val(tv1[i, j].text)
Next
Next
Label1.Text = t
End
Public Sub tv1_Click()
tv1.Edit
End
迴圈巢狀在一起。它們的意思是“對於每一行,遍歷所有的列”。
For i = 0 To tv1.Rows.Max 'for every row going down...
For j = 0 To tv1.Columns.Max 'go across every column
...
Next
Next






