跳轉到內容

從 Zip/模組程式設計 Gambas

來自 Wikibooks,開放世界中的開放書籍

模組和類

[編輯 | 編輯原始碼]

隨著向程式新增更多功能,程式往往會變得很大。更多的選單項意味著更多的選單處理程式。更多的按鈕、更多的列表、更多的表格——所有這些都意味著更多的子程式。需要一種方法來組織它們,並且確實存在。計算機中的檔案被組織成資料夾。程式中的子程式被組織成模組和類。

模組就像容器。就像各種物種的動物。

您可以將您喜歡的任何東西放入容器中。您可以收集所有以某種方式相關的子程式並將它們放入模組中。例如,您可以建立一個名為 Time 的模組,並將所有與時間和日期相關的程式部分放入其中。您可能會將您編寫的用於計算出給定出生日期的某人年齡的出色函式放入其中。您稱之為

Public Sub AgeThisYear(DOB as date) as string

有了它,您可以將該函式放入其中,該函式將您完成拼圖所需的時間(以秒為單位)轉換為分鐘和秒格式

Public Sub TidyTime(Secs as integer) as string

它們可以放入 Time 模組中,以節省表單程式碼的混亂。即使沒有這些函式,也會有足夠多的事件處理程式來填充它。您無法將這些事件處理程式移動到模組中。它們必須位於表單程式碼中,等待表單上的某項操作以觸發它們。

如何呼叫已放入模組中的子程式?您必須引用它們所在的模組以及子程式的名稱。這就像一群人聚集在公園裡。您可以喊出“約翰!”或“瑪麗!”約翰或瑪麗會走上前來。但是,一旦您開始將人們放入房屋中,就必須是“HollyCottage.John”或“FernyVale.Mary”。可能有多個約翰或瑪麗,一方面。因此我們將引用

Time.AgeThisYear(“1/6/1955”)

Time.TidyTime(258)

模組中的任何內容在您的整個程式中都是可用的。模組就像盒子、資料夾或檔案櫃:只是您可以停放子程式的地方。要呼叫它們,請放入模組名稱、句點,然後是子程式。

,就像動物的種類。在動物世界中,物種被分組到屬中,屬被分組到科中,依此類推直到界(現在還有一個更高的層次,),它曾經是動物植物,但現在包括其他(原核生物,主要是細菌,原生生物,包括藻類和原生動物,以及真菌,包括蘑菇、黴菌和酵母菌)。每種動植物都有一個由組成的兩部分名稱。“屬”的意思是“一般”,“種”的意思是“特定”。我的名字是,比如,Luke Bilgewater。Bilgewater 家族中有很多不同的人,但只有一個 Luke Bilgewater。Luke 是特指名稱,Bilgewater 是通稱或泛稱。分類系統如下所示

域 → 界 → 門 → 綱 → 目 → 科 → 屬 → 種

您會注意到“”在那裡。在程式設計中,類是可以有示例的事物。表格檢視是一個類。您可以在程式中擁有多個表格檢視。按鈕是一個類。您可以擁有多個按鈕。選單是一個類。您可以擁有多個選單。表單是一個類。您可以擁有多個表單。

您還可以從其他類派生類。

讓我們以馬為例。維基百科說:“目前,家養馬和野馬被認為是一個物種,馬的有效科學名稱是Equus ferus”。想象一匹長著翅膀的馬。它將擁有普通馬的所有特徵(屬性,如尾巴和蹄子),並且可以做普通馬可以做的一切(方法,如奔跑和嘶鳴),並且可以對普通馬會做出反應的事物做出反應(事件,如接近水槽或被裝上馬鞍)。然而,除了這些之外,它還將擁有翅膀。這個新類,Equus Pegasus,將繼承Equus的所有東西,但也將有Public Sub Wings() … End 特定於這種特殊型別的Equus

類(不像模組)可以擁有任意多個實際存在的示例。每個示例都將擁有自己的翅膀。每個都將擁有自己的名稱。“建立一個這些動物種類的新示例”在程式語言中是“例項化”或“建立一個新例項”。

類是一個抽象事物(就像一種動物)。您需要類的例項才能擁有任何您可以處理的東西。

在說類定義就像藍圖一樣,這是通常的情況。如果您想讓類作為唯一的動物存在,您可以透過使其靜態來做到這一點。Gambas 有靜態類。它們是始終存在的類。模組是靜態類:始終存在,並且您只有一個。

靜態類的示例是Key。在聯機幫助中,關於Key,它說:“此類用於獲取有關鍵盤事件的資訊,幷包含表示鍵的常量。...此類是靜態的。” 它始終存在;它是一次性事物;像引用野獸的名字一樣引用它,而不僅僅是它的種類。因此剛剛鍵入的鍵是Key.Text,該鍵的數字程式碼是Key.Code。就像馬肯定有腿一樣,Key 有幾個您可以引用的常量,比如Key.EnterKey.ReturnKey.DelKey.Esc,它們是這些鍵的程式碼號。並且就像馬可以有馬鞍或沒有馬鞍一樣,存在屬性Key.ShiftKey.Control,它們可以是向上或向下,也就是說,truefalse

讓我們以表格檢視為例,並賦予它翅膀。我們的新類將包含表格檢視的所有功能,但額外增加了透過鍵入幾個字母來定位行。它是我們的SearchBox 再次出現,只是這次我們將它做成一個類。然後我們可以建立任意多個新SearchBox。我們只需要設計新車的原型;之後,我們就可以從裝配線上生產任意多的汽車。

製作一個 SearchBox 類

[編輯 | 編輯原始碼]

Gambas form with searchbox instance Form with searchbox instance, running


檔案選單有兩個條目,向下退出。不要給向下設定鍵盤快捷鍵。(如果在單元格中鍵入,您可能會陷入無限迴圈——沒有任何反應。)選單項分別稱為MenuGoingDownMenuQuit

選單項向下使用其複選框。如果選中,則透過鍵入來搜尋名稱將被關閉。Enter 將游標向下移動到下一個單元格,一如往常。如果未選中(程式以這種方式啟動),請鍵入幾個字母來定位某人的姓名,然後按 Enter 輸入分數。然後再次按 Enter 離開單元格並準備好搜尋下一個姓名。此處關鍵的表格檢視屬性是NoKeyboard。選單項設定或取消設定它。

步驟

  1. 啟動一個新的圖形應用程式。
  2. 建立一個新類,將其設為匯出並將其命名為“SearchBox”。(右鍵單擊“源”資料夾 > 新建 > 類...)
  3. 在類的頂部輸入行 INHERITS TableView。
    Searchbox class INHERITS from TableView
    該類被匯出並繼承了 TableView 的所有內容。
  4. 按 F5 執行應用程式。立即退出程式。
    Gambas Tools showing the new Searchbox class
    SearchBox 類將出現在工具箱中。
    現在應該在類中有一個 SearchBox。將它拖到表單FMain 上。您剛剛建立了一個新例項。您可以剝離任意多個副本。目前,我們只需要一個。現在,我們教我們的馬飛翔。這段程式碼位於 SearchBox 類中
Export 'Without this you will not see the class in the toolbar of classes
Inherits TableView

Private ss As String
Public SearchColumn As Integer
Event EnterOnLine

Public Sub CheckKey()

  Select Case Key.Code
    Case Key.Esc, Key.BackSpace, Key.Del
      ss = ""
      Me.UnSelectAll
    Case Key.Enter, Key.Return
      Raise EnterOnLine 'action on pressing Enter
      ss = ""
    Case Key.Tab
      SearchDown
    Case Key.BackTab
      SearchUp
    Case Else
      ss &= Key.Text
      SearchDown
  End Select

End

Private Sub SearchUp()

  Dim i, Start As Integer
  If Me.Rows.Selection.Count = 0 Then Start = -1 Else Start = Me.Rows.Selection[0] 'the selected line
  For i = Start - 1 DownTo 0
    If InStr(LCase(Me[i, SearchColumn].text), LCase(ss)) Then
      Me.Rows.Select(i)
      Return
    Endif
  Next
  For i = Me.Rows.max DownTo Start
    If InStr(LCase(Me[i, SearchColumn].text), LCase(ss)) Then
      Me.Rows.Select(i)
      Return
    Endif
  Next

End

Private Sub SearchDown()

  Dim i, Start As Integer
  If Me.Rows.Selection.Count = 0 Then Start = -1 Else Start = Me.Rows.Selection[0]
  For i = Start + 1 To Me.Rows.Max 'if no selected line, start at top, else start at next line
    If InStr(LCase(Me[i, SearchColumn].text), LCase(ss)) > 0 Then
      Me.Rows.Select(i)
      Return
    Endif
  Next
  For i = 0 To Start 'if no more occurrences, you will end up at the line you are on
    If InStr(LCase(Me[i, SearchColumn].text), LCase(ss)) > 0 Then
      Me.Rows.Select(i)
      Return
    Endif
  Next

End

Public Sub HandleClick()
  If Me.Column = SearchColumn Then Return 'searchable column is not editable by clicking
  ss = ""
  Me.Edit
End

上面的程式碼現在是所有 SearchBox 的一部分。它仍然必須在適當的時候被呼叫。如果沒有,它永遠不會完成。因此,以下是主表單FMain 的程式碼

Public Sub sb1_EnterOnLine()
  sb1.Column = 1
  sb1.Edit
End

Public Sub Form_Open()

  Dim Names As New String[]
  Dim i As Integer
  Names = ["Mereka AIKE", "Ernest AIRI", "John AME", "Stanley ANTHONY", "Natasha AUA", "Veronica AUFA", "John Taylor BUNA", "Romrick CLEMENT", "Philomena GAVIA", "Richard GHAM", "Gerard BUZOLIC", "John HEARNE", "Thomas EDISON"]
  sb1.Rows.Count = Names.count
  sb1.Columns.Count = 2
  For i = 0 To Names.Max
    sb1[i, 0].text = Names[i]
    If i Mod 2 = 0 Then
      sb1[i, 0].Background = &hDDDDFF
      sb1[i, 1].Background = &hDDDDFF
    End If
  Next
  sb1.Columns[0].Width = 140 '-1 for max needed width
  sb1.Mode = Select.Single
  sb1.NoKeyboard = True 'start with sb1 selecting the line when Enter is pressed in a cell
  sb1.Expand = True
  sb1.SetFocus

End

Public Sub MenuQuit_Click() 'Yes, I put in a Quit menuitem in a File menu.
  Quit
End

Public Sub sb1_KeyPress()
  sb1.CheckKey()
End

Public Sub sb1_DblClick()
  sb1.Edit 'to edit the names in the searchable column, double-click one of them
End

Public Sub sb1_Save(Row As Integer, Column As Integer, Value As String)
  sb1[Row, Column].text = Value
End

Public Sub sb1_Click()
  sb1.HandleClick
End

Public Sub MenuGoingDown_Click()
  MenuGoingDown.Checked = Not MenuGoingDown.Checked
  sb1.NoKeyboard = Not sb1.NoKeyboard
End

這匹馬知道如何飛翔。此表格檢視現在以著名的和高貴的SearchBox 之名而聞名,它知道如何搜尋您鍵入的內容的出現。

當馬在傾聽時,您與它交談。當 SearchBox 向您提供可以攔截的事件時,您與它交談。我們特定的 SearchBox,sb1,向我們提供了表格檢視的所有事件,以及更多。它有一個自制事件EnterOnLine

如果您使用它理解的詞語,馬會按照您的指示做。當表單從搜尋框中獲取keypress 事件時,告訴它CheckKey。SearchBox 知道如何檢查您的鍵。SearchBox 將樂意向上或向下掃描,以查詢您鍵入內容的下一個出現位置。如果您對它呈現給您的選定行感到滿意,它會透過EnterInLine 事件通知您。否則,它會將該鍵新增到您已經鍵入的字母字串中,並進行更多搜尋,從下一行開始。

EnterOnLine 在您鍵入的鍵被檢查時被觸發。如果您鍵入了EnterReturn,則會發生EnterOnLine 事件。在主視窗中,您決定要對它做什麼(如果有的話)。在我們的例子中,這意味著我們找到了我們想要的行,我們想在第二列中鍵入。

  • 從某種意義上說,您透過事件與類對話,類透過它自己觸發的事件與您對話。

您的類向您提供的自制事件可能就像簡單的問候語(“你好!”)或傳遞引數(“你好,我 5 分鐘後到那裡!”)。我們的EnterOnLine 可能會告訴我們您按了Enter 的哪一行。然後事件定義將讀取

Event EnterOnLine(LineNum as integer)

事件處理程式可能讀取

Public Sub sb1_EnterOnLine(LinNum As Integer)
  sb1.Row = LinNum
  sb1.Column = 1
  sb1.Edit
End

當一行被突出顯示時,它的Row 屬性被設定為該行,因此沒有必要。比如,當您已經在該行時,為什麼要發出移動到該行的命令?因此LinNum 引數不是必需的,但馬透過它觸發的事件與您對話,並且可以在向您傳送EnterOnLine 事件時告訴您您在哪個行如果您想讓它那樣做。

設定一個類

[編輯 | 編輯原始碼]

如果在建立類的新的例項時需要做一些事情,例如設定表格檢視中應該有多少行和列或列標題的名稱,那麼這樣做的地方是在一個名為_new() 的特殊子程式中。每當使用New 運算子建立一個新類的示例時,都會呼叫此事件。

在上面的 SearchBox 程式中,我們可以將所有在Form_Open() 事件處理程式中完成的設定移動到類本身中。刪除Form_Open() 事件,並將程式碼放在 SearchBox 類中。執行程式後,它將以完全相同的方式工作。

現在,類自行設定。該表單不需要單獨設定每個元素。

Public Sub _new()

  Dim Names As New String[]
  Dim i As Integer
  Names = ["Mereka AIKE", "Ernest AIRI", "John AME", "Stanley ANTHONY", "Natasha AUA", "Veronica AUFA", "John Taylor BUNA", "Romrick CLEMENT", "Philomena GAVIA", "Richard GHAM", "Gerard BUZOLIC", "John HEARNE", "Thomas EDISON"]
  Me.Rows.Count = Names.count
  Me.Columns.Count = 2
  For i = 0 To Names.Max
    Me[i, 0].text = Names[i]
    If i Mod 2 = 0 Then
      Me[i, 0].Background = &hDDDDFF
      Me[i, 1].Background = &hDDDDFF
    End If
  Next
  Me.Columns[0].Width = 140 '-1 for max needed width
  Me.Mode = Select.Single
  Me.NoKeyboard = True 'start with sb1 selecting the line when Enter is pressed in a cell
  Me.Expand = True
  Me.SetFocus

End
從 Zip 檔案程式設計 Gambas
 ← 儲存設定 模組 SQLite → 
華夏公益教科書