2012-05-14 16 views
7

वीबीस्क्रिप्ट में, आप COM स्वचालन का उपयोग कर कुछ .NET कक्षाओं का उपयोग कर सकते हैं। जब आप गतिशील सरणी, सूचियां, कतार इत्यादि का उपयोग करना चाहते हैं तोक्या वीबीस्क्रिप्ट में .NET स्ट्रिंग ऑब्जेक्ट इंस्टेंस प्राप्त करना संभव है?

यह अच्छा होगा अगर मैं वस्तुओं के रूप में तारों का उपयोग कर सकूं, इसलिए मैं all fancy string stuff कर सकता हूं, लेकिन जब भी मैं किसी अन्य ऑब्जेक्ट से स्ट्रिंग पास करता हूं

Set s = CreateObject("System.Text.StringBuilder") 
s.Append_3 "I love deadlines. I like the whooshing sound they make as they fly by." 

' This gives me the literal string 
MsgBox s.ToString 
text = s.ToString 

' But unfortunately this won't work 
MsgBox s.ToString.Length 
Set stringRef = s.ToString 

इसके अलावा एक COM वस्तु के रूप में एक स्ट्रिंग बनाने से काम नहीं चलेगा:

Set s = CreateObject("System.String")  ' Nope. 

वहाँ कोई है जो प्रबंधन कैसे किया है, यह एक शाब्दिक स्ट्रिंग के रूप में और नहीं एक स्ट्रिंग वस्तु के रूप में VBScript द्वारा देखा जाता है यह, या इसके बारे में अन्य विचार है?

+0

आपको शक्तियों को देखने पर विचार करना चाहिए। –

+3

स्ट्रिंग जो ऑब्जेक्ट से पता है .NET से VBScript में उपलब्ध नहीं है। आपको मानक वीबीस्क्रिप्ट फ़ंक्शंस (लेन, लेंस, यूकेस इत्यादि) का सहारा लेना होगा। –

+2

संभव नहीं है। सीएलआर में निर्मित COM इंटरऑप * हमेशा * इसे एक BSTR, COM स्ट्रिंग प्रकार में परिवर्तित करेगा। CreateObject कॉल विफल रहता है क्योंकि System.String में पैरामीटर-कम कन्स्ट्रक्टर नहीं है। –

उत्तर

7

आप कुछ विधियों और गुणों का उपयोग कर सकते हैं, बस उन सभी को नहीं। निम्नलिखित कार्य करता है, लेकिन जिस क्षण से आप स्ट्रिंग का उपयोग करते हैं, उसके पास आपके पास एक vbscript चर है जो इस तरह व्यवहार करता है।

Set s = CreateObject("System.Text.StringBuilder") 
s.Append_3 "I love deadlines. I like the whooshing sound they make as they fly by." 
s.Append_3 "and the rest." 
wscript.echo s.Length 
wscript.echo s.Capacity 
wscript.echo chr(s.chars(0)) 
wscript.echo s.Replace("t", "d").Replace("l", "k").toString 

देता

83 
140 
I 
I kove deadkines. I kike dhe whooshing sound dhey make as dhey fky by.and dhe resd. 

लेकिन जैसे निम्नलिखित काम नहीं करता है, हालांकि यह stringbuilder की एक विधि http://msdn.microsoft.com/en-us/library/system.text.stringbuilder_methods.aspx मुझे मत पूछो यही वजह है कि

s.Insert 1, "insert this" 

और

s.Insert_2 7, "insert this" 

काम करता है

मैं रूबी में भी प्रोग्राम करता हूं जहां आप इन वस्तुओं का भी उपयोग कर सकते हैं और वहां भी वही व्यवहार है। कुछ वस्तुओं के लिए मैं एक्सेल

के लिए गुण या जैसे जैसे तरीकों की गणना कर सकते हैं
require 'win32ole' 
excel = WIN32OLE.new('Excel.Application') 
properties = excel.ole_get_methods 
properties.each do |property| 
    p property.to_s 
end 

System.Text.Stringbuilder के लिए बहुत तरह

"Application" 
"Creator" 
"Parent" 
"ActiveCell" 
"ActiveChart" 
"ActiveDialog" 
"ActiveMenuBar" 
"ActivePrinter" 
"ActiveSheet" 
"ActiveWindow" 
"ActiveWorkbook" 
etc etc 

लेकिन नहीं एक बहुत लंबी सूची देता है, मैं इसे की वजह से है लगता है जिस तरह से प्रोग्रामर बाहर के लिए अपनी विधियों और गुणों का खुलासा करता है।

अफसोस की बात है, मुझे नहीं लगता कि सीधे सिस्टम का उपयोग करना संभव है। Vbscript में स्ट्रिंग।

+0

धन्यवाद। और मुझे पता है क्यों है। प्रविष्ट करें (1, "इसे सम्मिलित करें") काम नहीं कर रहा है: क्योंकि आप इसके सामने 'कॉल' कथन नहीं डालते हैं, इसे 'सब' के रूप में देखा जाता है और आप कॉल नहीं कर सकते कंस्ट्रैसिस के साथ subs। – AutomatedChaos

+0

आप सही हैं, कॉल को कॉपी करने के साथ छोड़ दिया गया था, ब्रांडेसिस मेरे जावास्क्रिप्ट कोडिंग से "खराब" आदत है लेकिन मैं जो कहना चाहता हूं वह है। 1 प्रविष्ट करें, "इसे सम्मिलित करें" कभी काम नहीं करेगा क्योंकि इसमें इसका खुलासा नहीं हुआ है कॉम जबकि Insert_2 है और challegne यह पता लगाने के लिए है कि क्या काम करता है और – peter

+0

का प्रयोग करके और फिर क्या नहीं कर रहा है, मैं .NET 'system.collections' का उपयोग करता हूं, और मुझे सही पाने के लिए एक और तरीका नहीं पता प्रयोग करने या इसे गुगल करने की तुलना में संख्या (या आप इसे कैसे कहते हैं)। अधिकांश समय मैं एक रैपर वर्ग बनाता हूं, इसलिए मैं आसान विधि/फ़ंक्शन नामों का उपयोग कर सकता हूं (और जटिलता की एक अतिरिक्त परत पेश कर सकता हूं: - \)। – AutomatedChaos

0

क्या आपने कोशिश की है। MsgBox लेन (s.ToString) या बस MsgBox (s.Length)

वैकल्पिक रूप से आप अपने खुद के नेट वर्ग बना सकते हैं और कॉम जो स्थिर स्ट्रिंग कार्यों आप को बेनकाब करना चाहते हैं के लिए एक आवरण के रूप में कार्य करेंगे करने के लिए इसे बेनकाब कर सकता है ...

+0

लेन (एस। टॉस्ट्रिंग) पाठ्यक्रम का काम करता है, क्योंकि लेन एक मानक वीबीस्क्रिप्ट फ़ंक्शन है, लेकिन यह बिंदु नहीं है। एस लम्बाई मुझे स्ट्रिंगबिल्डर की लंबाई संपत्ति देता है और यह 70 लौटाता है, इसलिए यह सही है, लेकिन मैं स्ट्रिंग विधियों का उपयोग नहीं कर सकता, जैसे एस।कम करने के लिए या वास्तव में s.ToString.ToLower। – AutomatedChaos

+0

देशी वीबीएस फ़ंक्शंस होने पर आपको उन विधियों की आवश्यकता क्यों होती है जो समान रूप से वही काम करते हैं। (जैसे 'एलसीएएस') – Nilpo

+1

@ नीलपो, बस मेरी जिज्ञासा को बैठने के लिए। इस प्रकार, स्ट्रिंग ऑब्जेक्ट में कुछ विधियां होती हैं जिन्हें VBS फ़ंक्शन सेट (स्वरूपण, पैडिंग, डालने, अनुक्रमणित) में मूल रूप से शामिल नहीं किया जाता है। और मुझे विधि chaining की प्रथा पसंद है, जैसे 'myArray = myString.Trim()। ToLower()। विभाजन (",")', यह 'myArray = split (lCase (trim (myString)) से neater है,", ")' – AutomatedChaos