2010-11-01 17 views

risposta

42

provare questo

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

grazie, thow mi saltellava per evitare l'uso di elementi e lasciare che il calcolo Delphi la dimensione della matrice. – none

+4

È possibile evitare la costante Elements, ma è comunque necessario dichiarare la dimensione dell'array. È possibile utilizzare la matrice "short form" [x] dove x è un tipo enumerato, creando una matrice dal primo all'ultimo elemento del tipo. Il compilatore non supporta array [] = (1,2,3) calcolando la dimensione dell'array e impostando automaticamente un limite di 0..2. –

+0

Brillante, per tutto questo tempo ho pensato che non fosse possibile: D –

14

È possibile utilizzare array dinamici e provare questo:

var 
    FMyArray: TArray<string>; 

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

Anche se questo fa fare un'inizializzazione di runtime di un array dinamico sul mucchio, si mostra anche che Delphi supporta uno "pseudo-costruttore" su array dinamici che consentono l'inizializzazione sul posto. (NOTA: il codice sopra non è thread-safe).

Ora tutto ciò che è necessario fare per scoprire la lunghezza dell'array, è utilizzare la funzione standard Length(), o per trovare l'intervallo di indice consentito, utilizzare le funzioni standard Low() e High().

Se stai usando una vecchia versione di Delphi, sostituire il tarray con il proprio dinamico-array di tipo stringa come:

type 
    TStringArray = array of string; 
+0

true, che è valido, tuttavia deve essere const e non runtime. – none

+0

Gli elementi sono costanti, solo l'array non lo è. Oltre a un costo di avvio, il sovraccarico di runtime è molto ridotto. Ha bisogno di essere const semplicemente a causa della tradizione o c'è qualcosa di specifico nel tuo caso che richiede const? –

+3

se la matrice non è const, la matrice potrebbe cambiare. non soddisfa i requisiti. l'idea è bella comunque. – none

32

In XE7 si può dichiarare una costante array dinamico come questo:

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

Questa è una caratteristica elegante. Quasi mi fanno venir voglia di aggiornare! –

+0

Questo mi ha salvato la giornata. Grazie. – Eduardo

0

È possibile farlo in modo indiretto. Creare una funzione come:

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; 

e chiamare questa funzione come:

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

dove:

asVelden: ArrayOfString; 
Problemi correlati