2010-11-01 13 views

Répondre

42

essayer cette

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

merci, Thow i sautillait d'éviter l'utilisation des éléments et laisser calculer Delphi la taille du tableau. – none

+4

Vous pouvez éviter la constante Elements, mais vous devez quand même déclarer la taille du tableau. Vous pouvez utiliser le tableau "short form" [x] où x est un type énuméré, créant un tableau du premier au dernier élément du type. Le compilateur ne prend pas en charge array [] = (1,2,3) calculant la taille du tableau et définissant une frontière 0..2 automatiquement. –

+0

Brillant, tout ce temps je pensais que ce n'était pas possible: D –

14

Vous pouvez utiliser des tableaux dynamiques et essayez ceci:

var 
    FMyArray: TArray<string>; 

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

Bien que cela ne fait une initialisation d'exécution d'un tableau dynamique sur le tas, il montre également que Delphi supporte un "pseudo-constructeur" sur les tableaux dynamiques qui permettent l'initialisation sur place. (NOTE: le code ci-dessus n'est pas sûr pour les threads). Maintenant, tout ce que vous devez faire pour connaître la longueur de la matrice, utilisez la fonction standard Length() ou, pour trouver la plage d'index autorisée, utilisez les fonctions standard Low() et High().

Si vous utilisez une ancienne version de Delphi, remplacez le tarray avec votre propre type de chaîne de tableau dynamique tels que:

type 
    TStringArray = array of string; 
+0

vrai, c'est valide, mais il doit être const et pas d'exécution. – none

+0

Les éléments sont constants, seul le tableau ne l'est pas. À part un coût de démarrage, il y a très peu de temps d'exécution. Est-ce que cela a besoin d'être const simplement à cause de la tradition ou y at-il quelque chose de spécifique à votre cas qui nécessite const? –

+3

si le tableau n'est pas const alors le tableau pourrait changer. ne correspond pas aux exigences. l'idée est sympa tho. – none

32

En XE7 vous pouvez déclarer une constante de tableau dynamique comme ceci:

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

Ceci est une fonctionnalité astucieuse. Presque me donner envie de mettre à niveau! –

+0

Cela a sauvé ma journée. Merci. – Eduardo

0

Vous pouvez le faire de manière indirecte. Créer une fonction comme:

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; 

et appeler cette fonction comme:

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

où:

asVelden: ArrayOfString;