2010-09-01 25 views
17

में वेरिएंट सरणी का उपयोग कैसे करें मेरे पास दो डेल्फी 7 प्रोग्राम हैं: एक COM ऑटोमेशन सर्वर (EXE) और अन्य प्रोग्राम जो स्वचालन सर्वर का उपयोग कर रहा है।डेल्फी

मैं दूसरे के कार्यक्रम से बाइट्स की एक सरणी पारित करने के लिए की जरूरत है।

कुछ खोज के बाद मैंने पाया है कि संस्करण सरणियों का उपयोग कर (मुझे सही करें अगर आप किसी भी बेहतर तरीकों जानते हैं) जाने का रास्ता है।

मेरा प्रश्न है: मैं एक प्रोग्राम में एक संस्करण सरणी कैसे बना सकता हूं, और फिर मैं दूसरे में अपने मूल्य कैसे पढ़ूं?

मैं VarArrayCreate और VarArrayLowBound/VarArrayHighBound के बारे में पता है, लेकिन मैं यह कैसे ठीक से करने के बारे में अनिश्चित हूँ।

धन्यवाद!

उत्तर

25

आप इसे इस तरह बनाने के लिए:

घोषणा पहले

var 
    VarArray: Variant; 
    Value: Variant; 

फिर निर्माण:

VarArray := VarArrayCreate([0, Length - 1], varVariant); 

या आप भी

VarArray := VarArrayCreate([0, Length - 1], varInteger); 

टी पर निर्भर करता है हो सकता था वह डेटा का प्रकार। फिर आप इस तरह पुन: प्रयास करते हैं:

i := VarArrayLowBound(VarArray, 1); 
HighBound := VarArrayHighBound(VarArray, 1); 

while i <= HighBound do 
begin 
    Value := VarArray[i]; 
    ... do something ... 
    Inc(i); 
end; 

अंत में जब आप इसकी आवश्यकता नहीं है तो आप सरणी को साफ़ कर दें। संपादित करें: (यह वैकल्पिक है, In Delphi 2009 do I need to free variant arrays? देख)

VarClear(VarArray); 

है यही कारण है कि यह सब करने के लिए नहीं है। एक और उदाहरण के लिए आधिकारिक Embracadero Help

संपादित देखें:

सरणी केवल एक बार बनाई जानी चाहिए। फिर उपर्युक्त उदाहरण में दिखाए गए जैसे इसका इस्तेमाल करें।

+0

धन्यवाद! क्या आप क्लाइंट की तरफ सरणी को वापस पढ़ने के तरीके पर कुछ उदाहरण कोड भी दे सकते हैं? आइए मान लें कि क्लाइंट को एक वैरिएट में एक vararray पास किया गया है, आप इसे कैसे पढ़ते हैं? क्या आप VarArrayCreate को कॉल करते हैं या केवल VarArrayLowBound आदि का उपयोग करते हैं? – Steve

+0

बस दूसरी ओर सरणी का उपयोग करें। इसे केवल एक बार बनाएं। लेकिन देखें कि इसे साफ़ करने के लिए कौन जिम्मेदार है। – Runner

7

दूसरे पक्ष के लिए:

(यह मानते हुए मूल्य संस्करण पैरामीटर है और तत्व प्रकार है WideString)

var 
    Source: PWideStringArray; 

if VarIsArray(Value) then begin 
    Source:= VarArrayLock(Value); 
    try 
    for i:= 0 to TVarData(Value).VArray^.Bounds[0].ElementCount - 1 do 
     DoWhatEverYouWantWith(Source^[i]); 
    end; 
    finally 
    VarArrayUnlock(Value); 
    end; 
end; 
+0

VarArrayLock के लिए क्या है? मैं एक बाइट सरणी बीटीडब्ल्यू का उपयोग कर रहा हूँ। PWideStringArray कहां परिभाषित किया गया है? क्या कोई PByteArray भी है? धन्यवाद! – Steve

+2

PWideStringArray एक स्वयं परिभाषित प्रकार है, जैसा कि नाम का तात्पर्य है, वाइडस्ट्रिंग्स की एक सरणी के लिए एक सूचक। आप SysUtils में PByteArray पा सकते हैं। VarArrayLock सरणी को लॉक करता है और तेजी से पहुंच के लिए सरणी वाली मेमोरी में एक सूचक देता है। चूंकि आपके पास इस सरणी के साथ चारों ओर अलग-अलग प्रक्रियाएं हैं, इसलिए मैं इस कार्यक्षमता का उपयोग करने का सुझाव देता हूं। आप डी 7 सहायता में अधिक जानकारी देख सकते हैं। –