2008-09-24 14 views
17

जीयूआई लिखते समय, मैं अक्सर निम्नलिखित समस्या पर आ जाता हूं: मान लें कि आपके पास एक मॉडल और नियंत्रक है। नियंत्रक के पास विजेट W है जिसका उपयोग मॉडल के X को दिखाने के लिए किया जाता है।जीयूआई में ब्रेकिंग इवेंट चक्र

क्योंकि मॉडल नियंत्रक के बाहर से बदला जा सकता है (उसी मॉडल का उपयोग कर अन्य नियंत्रक हो सकते हैं, पूर्ववत ऑपरेशन इत्यादि), नियंत्रक मॉडल पर परिवर्तनों को सुनता है। नियंत्रक विजेट W पर घटनाओं को भी सुनता है और तदनुसार संपत्ति X अद्यतन करता है।

अब, निम्न होता है:

  1. W में मूल्य
  2. एक घटना उत्पन्न होता है बदल गया है, नियंत्रक शुरू हो जाती है में हैंडलर
  3. नियंत्रक नया मान सेट मॉडल
  4. मीटर Odel घटनाओं का उत्सर्जन करता है, क्योंकि यह बदल दिया गया है
  5. नियंत्रकमॉडल से एक परिवर्तन घटना
  6. नियंत्रकX का मूल्य हो जाता है प्राप्त करता है और विजेट
  7. गोटो 1.
  8. में यह सेट

उस के लिए कई संभावित समाधान हैं:

  1. मॉडल अद्यतन होने पर ध्वज सेट करने के लिए नियंत्रक को संशोधित करें, और यदि यह ध्वज सेट किया गया है तो मॉडल से किसी भी घटना पर प्रतिक्रिया न दें।
  2. डिस्कनेक्ट नियंत्रक अस्थायी रूप से (या मॉडल बता कुछ समय के लिए किसी भी घटनाओं को भेजने के लिए नहीं)
  3. विजेट

अतीत में से अपडेट फ्रीज, मैं आमतौर पर विकल्प 1. के लिए, चला गया क्योंकि यह सबसे सरल बात इसमें झंडे के साथ आपकी कक्षाओं को छेड़छाड़ करने की कमी है, लेकिन अन्य तरीकों में भी उनकी कमी है।

बस रिकॉर्ड के लिए, मुझे जीटीके +, क्यूटी और एसडब्ल्यूटी सहित कई जीयूआई टूलकिट्स के साथ यह समस्या आई है, इसलिए मुझे लगता है कि यह सुंदर टूलकिट-अज्ञेयवादी है।

कोई भी सर्वोत्तम प्रथाओं? या क्या वास्तुकला मैं बस गलत उपयोग करता हूं?

@Shy: यह कुछ मामलों के लिए एक समाधान है, लेकिन अगर आपको X नियंत्रक के बाहर से बदल दिया गया है (उदाहरण के लिए, पूर्ववत/redo के लिए कमांड पैटर्न का उपयोग करते समय), तो फिर भी आप अनावश्यक घटनाओं का दौर प्राप्त करते हैं, क्योंकि तब मान बदल गया है, W अद्यतन किया गया है और एक घटना को आग लगती है। मॉडल के लिए एक और (बेकार) अपडेट को रोकने के लिए, विजेट द्वारा उत्पन्न घटना निगलनी होगी।
अन्य मामलों में, मॉडल अधिक जटिल हो सकता है और वास्तव में जो कुछ भी बदला गया है, उस पर एक सरल जांच संभव नहीं हो सकती है, उदा। एक जटिल पेड़ दृश्य।

+0

मुझे हर समय एमएफसी में सूची बॉक्स के साथ यह समस्या है। –

उत्तर

3

आमतौर पर आपको विजेट में इनपुट ईवेंट का जवाब देना चाहिए और ईवेंट को नहीं बदला जाना चाहिए। यह इस प्रकार के लूप को होने से रोकता है।

  1. उपयोगकर्ता विजेट में इनपुट में परिवर्तन
  2. विजेट का उत्सर्जन करता है परिवर्तन घटना (स्क्रॉल किया/क्लिक किया/माउस छुट्टी, आदि में प्रवेश)
  3. नियंत्रक प्रतिक्रिया करता है, मॉडल में परिवर्तन करने के लिए अनुवाद
  4. मॉडल घटना का उत्सर्जन करता है
  5. नियंत्रक प्रतिक्रिया करता है, विजेट में मूल्य में परिवर्तन
  6. मूल्य परिवर्तन घटना उत्सर्जित, लेकिन नियंत्रक द्वारा की बात सुनी नहीं
+0

सुझाव के लिए धन्यवाद। अफसोस की बात है, जीयूआई टूलकिट के आधार पर यह हमेशा संभव नहीं होता है। –

5

इस से निपटने का मानक क्यूटी तरीका और उनके बहुत उपयोगी ट्यूटोरियल में सुझाए गए एक को भी नियंत्रक में मूल्य में परिवर्तन करना है, यदि नया मान वर्तमान मूल्य से अलग है।
इस तरह का संकेत valueChanged()

see this tutorial

1

झंडे के शब्दों updaing काम इंगित करने के लिए है है। आप उन्हें BeginUpdate और EndUpdate जैसी विधियों में लपेट सकते हैं।

+0

क्या यह एक आम प्रथा है, या आप सिर्फ एक शिक्षित अनुमान बना रहे हैं? – Statement

+0

मैंने एमएफसी विंडोज विकास में अद्यतन स्थिति को इंगित करने के लिए झंडे का उपयोग किया है जिसमें एकाधिक व्यू आर्किटेक्चर वाला दस्तावेज़ था। हाल ही में .Net विंडोज़ विकास में मैंने झंडे का इस्तेमाल यह इंगित करने के लिए किया था कि चयन परिवर्तन घटना को init के दौरान निकाल दिया गया था और इसे अनदेखा किया जा सकता था। – Leah

संबंधित मुद्दे