खोज…
सर्वोत्तम प्रथाएं
एक 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 प्रक्रियाओं के साथ मॉडल का पर्दाफाश 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 ईवेंट को हैंडल करें।
प्रपत्रों में आमतौर पर एक बंद बटन होता है, और संकेतों / संवादों में ओके और रद्द बटन होते हैं; उपयोगकर्ता प्रपत्र के नियंत्रण बॉक्स (लाल "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
इस तरह "एक्स" बटन कभी भी उदाहरण को नष्ट नहीं करेगा, और कॉल करने वाले सभी सार्वजनिक सदस्यों को सुरक्षित रूप से एक्सेस कर सकते हैं।
छिपाएँ, बंद न करें।
ऑब्जेक्ट बनाने वाला कोड इसे नष्ट करने के लिए ज़िम्मेदार होना चाहिए: यह स्वयं को अनलोड और समाप्त करने के लिए फ़ॉर्म की ज़िम्मेदारी नहीं है।
एक फॉर्म के कोड- Unload Me का उपयोग करने से बचें। मुझे कॉल करें Me.Hide इसके बजाय, ताकि कॉल कोड अभी भी उस ऑब्जेक्ट का उपयोग कर सके जो फॉर्म बंद होने पर बनाया गया था।
चीजों को नाम दें।
प्रपत्र पर प्रत्येक नियंत्रण को सावधानीपूर्वक नाम देने के लिए गुण टूलविडो ( F4 ) का उपयोग करें। एक नियंत्रण का नाम कोड-पीछे में उपयोग किया जाता है, इसलिए जब तक आप एक रिफलेक्टरिंग टूल का उपयोग नहीं कर रहे हैं जो इसे संभाल सकता है, एक नियंत्रण का नाम बदलने से कोड टूट जाएगा - इसलिए पहले की तुलना में चीजों को सही तरीके से करना बहुत आसान है, कोशिश करने की तुलना में 20 टेक्स्टबॉक्स में से कौन सा TextBox12 12 है, यह जानने के लिए।
परंपरागत रूप से, UserForm नियंत्रणों का नाम हंगेरियन-शैली के उपसर्गों के साथ रखा गया है:
-
lblUserNameएकLabelनियंत्रण के लिए जो एक उपयोगकर्ता नाम को इंगित करता है। -
txtUserNameएक के लिएTextBoxनियंत्रण जहाँ उपयोगकर्ता एक उपयोगकर्ता नाम दर्ज कर सकते हैं। - एक
ComboBoxनियंत्रण के लिएcboUserNameजहां उपयोगकर्ता एक उपयोगकर्ता नाम दर्ज या चुन सकता है। - एक
ListBoxनियंत्रण के लिएlstUserNameजहां उपयोगकर्ता एक उपयोगकर्ता नाम चुन सकता है। - "ओके" नामक एक
Buttonनियंत्रण के लिएbtnOkयाcmdOk।
समस्या यह है कि जब जैसे यूआई बदल दिया जाता है और एक है ComboBox एक में परिवर्तन ListBox - दसगुणा यह, कि वे क्या प्रतिनिधित्व के लिए नाम नियंत्रण बेहतर है बल्कि उनके नियंत्रण प्रकार के बाद से:, परिवर्तन के नाम जरूरतों को प्रतिबिंबित करने के लिए नए नियंत्रण प्रकार यूआई से कोड जितना संभव हो सके।
-
UserNameLabelकेवल-पढ़ने के लिए एक लेबल है जो उपयोगकर्ता नाम दर्शाता है। -
UserNameInputएक नियंत्रण के लिए जहां उपयोगकर्ता एक उपयोगकर्ता नाम दर्ज या चुन सकता है। -
OkButton"Ok" लेबल वाले कमांड बटन के लिए।
जो भी शैली चुनी जाती है, कुछ भी छोड़ने से बेहतर है कि सभी अपने डिफ़ॉल्ट नामों को नियंत्रित करें। नामकरण शैली में संगति आदर्श है, भी।
हैंडलिंग QueryClose
जब भी कोई फ़ॉर्म बंद होने वाला होता है, तो QueryClose ईवेंट उठाया जाता है, चाहे वह उपयोगकर्ता कार्रवाई के माध्यम से हो या प्रोग्रामेटिक रूप से। CloseMode पैरामीटर में VbQueryClose enum मान होता है जो इंगित करता है कि फ़ॉर्म कैसे बंद किया गया था:
| लगातार | विवरण | मूल्य |
|---|---|---|
vbFormControlMenu | उपयोगकर्ता कार्रवाई के जवाब में फॉर्म बंद हो रहा है | 0 |
vbFormCode | फॉर्म Unload स्टेटमेंट के जवाब में बंद हो रहा है | 1 |
vbAppWindows | विंडोज सत्र समाप्त हो रहा है | 2 |
vbAppTaskManager | विंडोज टास्क मैनेजर होस्ट एप्लिकेशन को बंद कर रहा है | 3 |
vbFormMDIForm | VBA में समर्थित नहीं है | 4 |
बेहतर पठनीयता के लिए, सीधे अपने मूल्य का उपयोग करने के बजाय इन स्थिरांक का उपयोग करना सबसे अच्छा है।
एक रद्द करने योग्य UserForm
रद्द करें बटन के साथ एक फॉर्म दिया

प्रपत्र का कोड-पीछे ऐसा दिख सकता है:
Option Explicit
Private Type TView
IsCancelled As Boolean
SomeOtherSetting As Boolean
'other properties skipped for brievety
End Type
Private this As TView
Public Property Get IsCancelled() As Boolean
IsCancelled = this.IsCancelled
End Property
Public Property Get SomeOtherSetting() As Boolean
SomeOtherSetting = this.SomeOtherSetting
End Property
'...more properties...
Private Sub SomeOtherSettingInput_Change()
this.SomeOtherSetting = CBool(SomeOtherSettingInput.Value)
End Sub
Private Sub OkButton_Click()
Me.Hide
End Sub
Private Sub CancelButton_Click()
this.IsCancelled = True
Me.Hide
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = VbQueryClose.vbFormControlMenu Then
Cancel = True
this.IsCancelled = True
Me.Hide
End If
End Sub
कॉलिंग कोड तब फ़ॉर्म प्रदर्शित कर सकता है, और जान सकता है कि क्या इसे रद्द कर दिया गया था:
Public Sub DoSomething()
With New UserForm1
.Show vbModal
If .IsCancelled Then Exit Sub
If .SomeOtherSetting Then
'setting is enabled
Else
'setting is disabled
End If
End With
End Sub
रद्द किया गया बटन क्लिक करने पर, या जब उपयोगकर्ता नियंत्रण बॉक्स का उपयोग करके प्रपत्र बंद कर देता है, तो IsCancelled संपत्ति True हो जाती है।