खोज…
सर्वोत्तम प्रथाएं
एक 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
हो जाती है।