最佳實踐
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
控制元件,使用者可以在其中選擇使用者名稱。btnOk
或cmdOk
用於標記為Ok
的Button
控制元件。
問題是,當如使用者介面被重新設計和 ComboBox
變為 ListBox
,名稱需要改變以反映新的控制型:這是最好的名字控制他們代表什麼,而不是他們的控制型別之後 -對分離的來自 UI 的程式碼儘可能多。
UserNameLabel
用於指示使用者名稱的只讀標籤。UserNameInput
用於控制元件,使用者可以在其中輸入或選擇使用者名稱。OkButton
用於標有Ok
的命令按鈕。
無論選擇哪種風格,任何事情都比將所有控制元件保留為預設名稱更好。命名風格的一致性也是理想的。