खोज…


सर्वोत्तम प्रथाएं

एक 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 हो जाती है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow