最佳實踐

UserForm 是具有設計器和預設例項的類模組。的設計者可以通過按被訪問 Shift + F7 在觀看程式碼隱藏,並且隱藏程式碼可以按被訪問 F7,同時觀看的設計者

每次都使用新例項

作為一個類模組,一個形式因此是藍圖用於物件。因為表單可以儲存狀態和資料,所以使用類的新例項而不是預設/全域性例項更好的做法 :

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        '...
    End If
End With

代替:

UserForm1.Show vbModal
If Not UserForm1.IsCancelled Then
    '...
End If

當使用紅色 X 按鈕關閉表單和/或在程式碼隱藏中使用 Unload Me 時,使用預設例項可能會導致細微錯誤。

在其他地方實施邏輯

表單應該只關注表示 :一個連線到資料庫並根據使用者輸入執行引數化查詢的按鈕 Click 處理程式正在做太多事情

相反,在程式碼中實現應用程式邏輯,該程式碼負責在專用模組和過程中顯示錶單,甚至更好。

編寫程式碼的方式使得 UserForm 只負責知道如何顯示和收集資料:資料來自何處,或之後資料發生的情況,都不是它的問題。

來電者不應該受到控制的困擾

為要使用的表單建立一個定義良好的模型,可以在其自己的專用類模組中,也可以封裝在表單的程式碼隱藏本身中 - 使用 Property Get 過程公開模型,並讓客戶端程式碼使用這些:這使得形成對控制元件及其細節的抽象,僅將相關資料暴露給客戶端程式碼。

這意味著程式碼如下所示:

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        MsgBox .Message, vbInformation
    End If
End With

而不是這個:

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        MsgBox .txtMessage.Text, vbInformation
    End If
End With

處理 QueryClose 事件

表單通常有一個 Close 按鈕,提示/對話方塊 Ok 和 Cancel 按鈕; 使用者可以使用表單的控制元件框 (紅色的 X 按鈕) 關閉表單,預設情況下會破壞表單例項( 每次都使用新例項的另一個好理由 )。

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then 'if QueryClose isn't handled, this can raise a runtime error.
        '...
    End With
End With

處理 QueryClose 事件的最簡單方法是將 Cancel 引數設定為 True,然後隱藏表單而不是關閉它:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
    Me.Hide
End Sub

這樣,X 按鈕永遠不會破壞例項,並且呼叫者可以安全地訪問所有公共成員。

隱藏,不要關閉

建立物件的程式碼應該負責銷燬它:解除安裝和終止自身不是表單的責任。

避免在表單的程式碼隱藏中使用 Unload Me。改為呼叫 Me.Hide,這樣呼叫程式碼仍然可以使用窗體關閉時建立的物件。

命名的東西

使用屬性 toolwindow( F4 )仔細命名錶單上的每個控制元件。控制元件的名稱在程式碼隱藏中使用,因此,除非你使用可以處理此問題的重構工具,否則重新命名控制元件將破壞程式碼 - 因此,首先要做的事情要比嘗試更容易,而不是嘗試準確地解決了 TextBox12 代表的 20 個文字框中的哪一個。

傳統上,UserForm 控制元件以匈牙利風格的字首命名:

  • lblUserName 用於指示使用者名稱的 Label 控制元件。
  • txtUserName 用於 TextBox 控制元件,使用者可以在其中輸入使用者名稱。
  • cboUserName 用於 ComboBox 控制元件,使用者可以在其中輸入或選擇使用者名稱。
  • lstUserName 用於 ListBox 控制元件,使用者可以在其中選擇使用者名稱。
  • btnOkcmdOk 用於標記為 OkButton 控制元件。

問題是,當如使用者介面被重新設計和 ComboBox 變為 ListBox,名稱需要改變以反映新的控制型:這是最好的名字控制他們代表什麼,而不是他們的控制型別之後 -對分離的來自 UI 的程式碼儘可能多。

  • UserNameLabel 用於指示使用者名稱的只讀標籤。
  • UserNameInput 用於控制元件,使用者可以在其中輸入或選擇使用者名稱。
  • OkButton 用於標有 Ok 的命令按鈕。

無論選擇哪種風格,任何事情都比將所有控制元件保留為預設名稱更好。命名風格的一致性也是理想的。