2010-11-01 12 views

उत्तर

42

कोशिश इस

Const 
Elements =3; 
MyArray : array [1..Elements] of string = ('element 1','element 2','element 3'); 
+0

धन्यवाद, thow मैं तत्वों के उपयोग से बचने और डेल्फी की गणना करते हैं करने के लिए किया गया था हॉपिंग सरणी का आकार। – none

+4

आप एलिमेंट्स निरंतर से बच सकते हैं, लेकिन आपको सरणी आकार को वैसे भी घोषित करना होगा। आप "शॉर्ट फॉर्म" सरणी का उपयोग कर सकते हैं [x] जहां x एक समेकित प्रकार है, जो कि प्रकार के अंतिम तत्व से पहले से एक सरणी बना रहा है। कंपाइलर सरणी [] = (1,2,3) सरणी आकार की गणना और 0..2 सीमा स्वचालित रूप से सेट करने का समर्थन नहीं करता है। –

+0

शानदार, इस बार मैंने सोचा कि यह संभव नहीं था: डी –

14

आप गतिशील सरणियों का उपयोग करें और यह कोशिश कर सकते हैं:

var 
    FMyArray: TArray<string>; 

function MyArray: TArray<string>; 
begin 
    if Length(FMyArray) = 0 then 
    FMyArray := TArray<string>.Create('One', 'Two', 'Three'); 
    Result := FMyArray; 
end; 

इस ढेर पर एक गतिशील सरणी के एक रन-टाइम प्रारंभ करता है, यह यह भी दिखाता है कि डेल्फी गतिशील सरणी पर "स्यूडो-कन्स्ट्रक्टर" का समर्थन करता है जो प्रारंभिक स्थान की अनुमति देता है। (नोट: उपरोक्त कोड थ्रेड-सुरक्षित नहीं है)।

अब आपको सरणी की लंबाई जानने के लिए क्या करना है, लंबाई() मानक फ़ंक्शन का उपयोग करें, या अनुमत अनुक्रमणिका सीमा को खोजने के लिए, निम्न() और उच्च() मानक फ़ंक्शंस का उपयोग करें।

आप डेल्फी के एक पुराने संस्करण का उपयोग कर रहे हैं, तो इस तरह के रूप में अपने गतिशील सरणी स्ट्रिंग प्रकार के साथ TArray बदल देते हैं:

type 
    TStringArray = array of string; 
+0

सच है, यह मान्य है, हालांकि इसे स्थिरांक और रनटाइम नहीं होना चाहिए। – none

+0

तत्व स्थिर हैं, केवल सरणी नहीं है। स्टार्टअप लागत के अलावा, बहुत कम रनटाइम ओवरहेड होता है। क्या परंपरा की वजह से इसे केवल आधार की आवश्यकता है या क्या आपके मामले में कुछ विशिष्ट है जिसके लिए कॉन्स की आवश्यकता है? –

+3

यदि सरणी नहीं है तो सरणी बदल सकती है। आवश्यकताओं को फिट नहीं करता है। विचार अच्छा था। – none

32

XE7 में आप इस तरह एक गतिशील सरणी लगातार घोषणा कर सकते हैं:

const 
    MyArray: TArray<String> = ['First','Second','Third']; 
+5

यह एक निफ्टी सुविधा है। लगभग मुझे अपग्रेड करना चाहते हैं! –

+0

यह मेरा दिन बचाया। धन्यवाद। – Eduardo

0

आप इसे अप्रत्यक्ष तरीके से कर सकते हैं। की तरह एक समारोह बनाएँ: इस समारोह

procedure assignStringArray(var rasVelden: ArrayOfString; const asVeldenIn: Array Of String); 
var 
    iLengte, iT1: Integer; 
begin 
    iLengte := Length(asVeldenIn); 
    SetLength(rasVelden, iLengte); 
    for iT1 := iLengte-1 downto 0 do 
     rasVelden[iT1] := asVeldenIn[iT1]; 
end; 

और कॉल की तरह:

assignStringArray(asVelden, ['String1', 'String2', 'String3']); 

जहां:

asVelden: ArrayOfString; 
संबंधित मुद्दे