मुझे राज्य चर के रूप में कमांड बटन के कैप्शन का उपयोग करने के लिए मेरे अंतिम प्रश्न (How to gracefully exit from the middle of a nested subroutine when user cancels?) पर कुछ उचित आलोचनात्मक प्रतिक्रिया मिली। मैंने ऐसा इसलिए किया क्योंकि यह बहुत ही कम कोड के साथ एक बार में दो या तीन उद्देश्यों की सेवा करता है, लेकिन मैं समझता हूं कि यह समस्याएं कैसे पैदा कर सकता है, खासतौर से थोड़ा सा गड़बड़ तरीका जिसे मैंने मूल रूप से प्रस्तुत किया था।वीबी 6 में चर के रूप में बटन कैप्शन का उपयोग करने के बारे में इतना बुरा क्या है?
मुझे लगता है कि यह अपनी चर्चा के योग्य है, इसलिए यहां एक ही विचार है जिसे थोड़ा सा साफ किया गया है और इसे "सही" करने के लिए संशोधित किया गया है (जिसका मूल रूप से एक ही स्थान पर स्ट्रिंग को परिभाषित करना है ताकि आपका कोड विफल नहीं हो पाएगा क्योंकि आपने बस कमांड बटन का टेक्स्ट बदल दिया है)। मुझे पता है कि मेरा चर और नियंत्रण नामकरण सम्मेलन खराब है (ठीक है, nonexistent), तो अग्रिम में माफ़ी। लेकिन मैं राज्य परिवर्तनीय चर्चा के रूप में कैप्शन पर ध्यान केंद्रित करना चाहता हूं।
तो यहाँ हम चले:
' Global variables for this form
Dim DoTheThingCaption(1) As String
Dim UserCancel, FunctionCompleted As Boolean
Private Sub Form_Initialize()
' Define the possible captions (is there a #define equivalent for strings?)
DoTheThingCaption(0) = "Click to Start Doing the Thing"
DoTheThingCaption(1) = "Click to Stop Doing the Thing"
' Set the caption state when form initializes
DoTheThing.Caption = DoTheThingCaption(0)
End Sub
Private Sub DoTheThing_Click() ' Command Button
If DoTheThing.Caption = DoTheThingCaption(0) Then
UserCancel = False ' this is the first time we've entered this sub
Else ' We've re-entered this routine (user clicked on button again
' while this routine was already running), so we want to abort
UserCancel = True ' Set this so we'll see it when we exit this re-entry
DoTheThing.Enabled = False 'Prevent additional clicks
Exit Sub
End If
' Indicate that we're now Doing the Thing and how to cancel
DoTheThing.Caption = DoTheThingCaption(1)
For i = 0 To ReallyBigNumber
Call DoSomethingSomewhatTimeConsuming
If UserCancel = True Then Exit For ' Exit For Loop if requested
DoEvents ' Allows program to see GUI events
Next
' We've either finished or been canceled, either way
' we want to change caption back
DoTheThing.Caption = DoTheThingCaption(0)
If UserCancel = True Then GoTo Cleanup
'If we get to here we've finished successfully
FunctionCompleted = True
Exit Sub '******* We exit sub here if we didn't get canceled *******
Cleanup:
'We can only get to here if user canceled before function completed
FunctionCompleted = False
UserCancel = False ' clear this so we can reenter later
DoTheThing.Enabled = True 'Prevent additional clicks
End Sub '******* We exit sub here if we did get canceled *******
तो वहाँ यह है। क्या अभी भी कुछ भी वास्तव में है जो इस तरह से करने के बारे में बुरा है? क्या यह सिर्फ एक शैली मुद्दा है? क्या कोई और चीज है जो मुझे इन चार चीजों को एक और वांछनीय या रखरखाव योग्य तरीके से देगी?
- त्वरित जीयूआई राय है कि उपयोगकर्ता के बटन प्रेस कार्रवाई में बदल गया है
- स्थान जहां उपयोगकर्ताओं का ध्यान पहले से ही है, तो कार्रवाई उपयोगकर्ताओं के लिए
- एक एक बटन रास्ता भी आवश्यक न हो कैसे रद्द करने के लिए कर रहे हैं में त्वरित जीयूआई प्रतिक्रिया शुरू करने के लिए/एक कार्रवाई को रद्द
- एक सरल, तत्काल आदेश बटन (जीयूआई पर अव्यवस्था की मात्रा को कम) एक से अधिक पास रोकने के लिए अनुरोध करता है को निष्क्रिय
मैं देख सकता हूँ एक चिंता का विषय हो सकता है टी वह कोड और जीयूआई के बीच युग्मन (कई तरीकों से) बंद कर देता है, इसलिए मैं देख सकता था कि बड़ी परियोजनाओं (या कम से कम बड़े जीयूआई) के लिए यह बड़ी समस्या कैसे हो सकती है। यह एक छोटी परियोजना होती है जहां केवल 2 या 3 बटन होते हैं जो इस तरह के "उपचार" प्राप्त करेंगे।
आईएमओ, यदि आप यूआई को हटाते हैं तो कोड उसी तरह काम करना चाहिए। यह केवल उपयोगकर्ता के साथ बातचीत करने के लिए है। – Deanna