2011-12-17 4 views
7

मैं करने में सक्षम होना चाहते हैं:मैं "संदर्भ समानता" के लिए वर्ड इंटरऑप ऑब्जेक्ट्स की तुलना कैसे कर सकता हूं और संग्रह या अभिभावक ऑब्जेक्ट को निर्धारित कर सकता हूं, जिसमें एक पैराग्राफ संबंधित है?

  1. तुलना एक "संदर्भ समानता" के आधार पर पद इंटरॉप COM प्रॉक्सी; और एक विशिष्ट वस्तु (जैसे कि एक पैराग्राफ) संग्रह यह से आता है, या कम से कम
  2. करने से
  3. नक्शा निर्धारित करते हैं कि दो पैराग्राफ एक ही अनुभाग से कर रहे हैं और एक पिछले एक
से पहले अपेक्षाकृत आता है जो

मैं ऐसा क्यों करना चाहता हूं? मैं वर्ड ऐड-इन बनाने की कोशिश कर रहा हूं जो इस अर्थ में एक वर्तनी-परीक्षक के समान कार्य करता है कि यह पृष्ठभूमि में चलता है (पृष्ठभूमि से मेरा मतलब है कि नियमित रूप से SendMessage का उपयोग करके मुख्य शब्द धागे से समय चुरा रहा है) और दस्तावेज़ को निश्चित रूप से स्कैन करता है पाठ "टोकन"। मैं टोकन का संग्रह रखने और दस्तावेजों के परिवर्तन के रूप में उन्हें अपडेट करने में सक्षम होना चाहता हूं। इसका एक विशिष्ट उदाहरण यह है कि यदि उपयोगकर्ता किसी दिए गए पैराग्राफ को संपादित करता है, तो मैं पैराग्राफ को पुन: स्कैन करना चाहता हूं और अपनी डेटा संरचना को अपडेट करना चाहता हूं जो उस पैराग्राफ को इंगित करता है। यदि अनुच्छेद के बीच मैप करने का कोई तरीका नहीं है जिसमें उपयोगकर्ता संपादित किया गया है (यानी अनुच्छेद जहां चयन सीमा की शुरुआत है) और एक पैराग्राफ जिसे मैंने डेटा संरचना में "संग्रहीत" किया है, मैं यह नहीं कर सकता।


उदाहरण आइटम # 1 के लिए कोड,

ऊपर अगर मैं निम्नलिखित VBA कोड लिखें:

"Para2a Is Not Para2b" 

:

Dim Para1 As Paragraph 
Dim Para2a As Paragraph 
Dim Para2b As Paragraph 
Set Para1 = ActiveDocument.Paragraphs(1) 
Set Para2a = Para1.Next 
Set Para2b = Para1.Next.Next.Previous 
If Para2a Is Para2b Then 
    Debug.Print ("Para2a Is Para2b") 
Else 
    Debug.Print ("Para2a Is Not Para2b") 
End If 

तब मैं उत्पादन हो रही है जो शायद शारीरिक रूप से सच है (विभिन्न COM प्रॉक्सी) लेकिन तार्किक रूप से टी नहीं है रुए। मुझे उन अनुच्छेदों की तुलना करने और यह निर्धारित करने की आवश्यकता है कि वे तर्कसंगत रूप से समान अंतर्निहित अनुच्छेद हैं या नहीं।

(मैं सी # में ऐड-इन लिखने की योजना बना रहा हूं, लेकिन उपरोक्त वीबीए कोड बहुत अधिक कोडिंग करने से पहले मुझे जिस तरह की समस्या को दूर करने की आवश्यकता है) दिखाता है।

ऊपर 2 और 3 आइटम के लिए, उम्मीद है कि वे आत्म-व्याख्यात्मक होंगे। मान लें कि मेरे पास एक पैराग्राफ (इंटरऑप प्रॉक्सी) संदर्भ है। मैं दस्तावेज में "कहां" यह पता लगाना चाहता हूं। क्या यह धारा 1 से संबंधित है? क्या यह एक पाद लेख में है? इस क्षमता के बिना, मैं जो कुछ भी कहता हूं, उसके बारे में एक विचार प्राप्त करने के लिए मैं उचित रूप से कर सकता हूं, हर बार जब यह बदलता है, तो पूरे दस्तावेज़ को पुन: स्कैन कर देता है, जो निश्चित रूप से बेतुका अक्षम है और ऐप उपयोगकर्ता के लिए समय पर पर्याप्त नहीं होगा।

किसी भी विचार की बहुत सराहना की! मुझे आवश्यकतानुसार अतिरिक्त जानकारी पोस्ट करने में खुशी है।

+0

हां, वही वस्तु वापस पाने पर भरोसा न करें। उनके रेंज की तुलना करें। –

उत्तर

2

COM इंटरऑप के संदर्भ में संदर्भ समानता के विवरणों को नेविगेट करना हमेशा एक दिलचस्प अभ्यास है।

मैं Paragraph.Next() और Paragraph.Previous() विधियों के कार्यान्वयन विवरणों के लिए गोपनीय नहीं होगा, हालांकि वे जो व्यवहार दिखाते हैं वह समान है कि रन-आधारित संग्रह सामान्य रूप से रनटाइम कॉलबल रैपर निर्माण के संबंध में कैसे कार्य करता है।

आमतौर पर, यदि संभव हो, तो फ्रेमवर्क उन वस्तुओं के अतिरिक्त संदर्भों के जवाब में नए आरसीडब्ल्यू उदाहरण बनाने से बचाता है जिनके पास आरसीडब्ल्यू प्रारंभिक और असाइन किया गया है।यदि कोई आरसीडब्ल्यू पहले से ही किसी विशेष सूचक के लिए IUnknown पर मौजूद है, तो उस आरसीडब्ल्यू द्वारा बनाए गए आंतरिक संदर्भ गणना में वृद्धि हुई है, और फिर आरसीडब्ल्यू वापस कर दिया गया है। यह फ्रेमवर्क को वास्तविक COM ऑब्जेक्ट की संदर्भ गणना (AddRef) में वृद्धि से बचने की अनुमति देता है।

COM-आधारित संग्रह, जो COM ऑब्जेक्ट्स हैं जो IEnumerable को लागू करने वाले प्रस्तुतियों को प्रबंधित करते हैं, हर बार किसी आइटम को एक्सेस होने पर एक नया आरसीडब्ल्यू उत्पन्न करने लगते हैं, भले ही उस आइटम को सत्र के दौरान पहले ही एक्सेस किया जा सके।

उदाहरण के लिए:

Word.Document document = Application.ActiveDocument; 
Paragraphs paragraphs = document.Paragraphs; 

Paragraph first = paragraphs[1]; 
Paragraph second = paragraphs[1]; 

bool thisIsFalse = (first == second); 

आप "संदर्भ समानता" जाँच किसी भी प्रकार का क्या करना चाहते हैं, तो आप, COM आधारित संग्रह से बचने के लिए की जरूरत है विशेष रूप से अपने मामले में: Paragraphs वस्तु। आप बस अपने बच्चों को हथियाने और उन्हें अपने खुद में भंडारण के द्वारा यह कर सकते हैं, विशुद्ध रूप से कामयाब रहे और उम्मीद के मुताबिक संग्रह है, तो जैसे:

List<Paragraph> niceParagraphs = paragraphs.Cast<Paragraph>().ToList(); 

हालांकि COM इंटरॉप साथ LINQ का उपयोग कर थोड़ा डरावना लग सकता है (अगर यह नहीं करता है आप ... यह वास्तव में चाहिए!) मैं निश्चित रूप से निश्चित हूं कि उपरोक्त कोड सुरक्षित है और वहां कोई भी खतरनाक संदर्भ नहीं छोड़ेगा, या कुछ भी बुरा नहीं होगा। हालांकि, मैंने ऊपर दिए गए कोड का परीक्षण नहीं किया है, हालांकि।

जब आप उनके साथ किए जाते हैं तो उन संसाधनों को ठीक से जारी करना न भूलें, कम से कम यदि आपकी आवश्यकताओं को समझदारी के स्तर की आवश्यकता होती है।

+0

तो, कभी-कभी ऑब्जेक्ट्स इवेंट आदि के माध्यम से वस्तुओं को पारित किया जाता है - क्या वैसे भी, यह अनदेखा कर रहा है कि आरसीडब्ल्यू एक अलग उदाहरण हो सकता है - हुड के नीचे पोक करने के लिए और देखें कि आरसीडब्ल्यू कहां इंगित कर रहा है? तो ऊपर की जांच '(पहले == सेकंड)' का एक अधिक महंगा संस्करण हो सकता है, लेकिन यह सच हो जाता है? – BrainSlugs83

+1

तो, मैंने गुगल रखा, और मैंने पाया, जो मुझे विश्वास है, वह लेख है जिसे आपने लिखा है, @ मैट। इसे यहां ऊपर रखकर मेरे प्रश्न का उत्तर दें: http://badecho.com/2010/09/outlook-com-interop-and-reference-equality-for-unique-runtime-callable-wrapper-objects/ – BrainSlugs83

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

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