2012-05-09 6 views
8

定数を初期化することができます動的配列配列の配列ですか?固定配列の動的配列である定数を初期化しますか?

の場合:

type 
    tNamePair = array[1..2] of String; 
    tPairList = array of tNamePair; 

どのように初期化された定数を作成することができますか?私は、コンパイルの下のコードを取得することはできません。

const 
    PairList: tPairList = (('One', '1'), 
          ('Two', '2'), 
          ('Three', '3')); 

をそれができない場合は、一定の固定配列が固定配列で初期化することができます。

type 
    tPairList: array[1..3] of tNamePair; 

をそれができない場合は、定数は可能です動的配列はレコードで初期化されます

tNamePair = record 
       English: String; 
       Number: String; 
      end;   
tPairList = array of tNamePair; 

それは一定の固定配列が記録で初期化することができますことはできません場合:

tNamePair = record 
       English: String; 
       Number: String; 
      end;   
tPairList = array[1..3] of tNamePair; 

それが不可能な場合、率直にかかっていたコードの中だけでハードワイヤ割り当て、以外の任意の提案私はこの質問を構成するよりも時間がかかりません!

+3

[この回答](http://stackoverflow.com/a/247672/62576)は多少類似の質問に役立つかもしれません。または[this one](http://stackoverflow.com/a/2481559/62576)。 –

+1

コンパイラは* dynamic *配列の長さを知ることができないので、初期化することは不可能です。 –

+0

_constant dynamic_は素晴らしい擬態語です。 :-) –

答えて

22

XE7以前は、ダイナミックの配列定数を作成できませんでした。コンパイル時に定数を知らなければならないが、動的配列は実行時に割り当てられる。

固定アレイの 固定配列はコンパイル時に宣言することができ

type 
    tNamePair = array[1..2] of String; 
    tPairList = array[1..3] of tNamePair; 

const 
    PairList: tPairList = (('One', '1'), 
          ('Two', '2'), 
          ('Three', '3')); 

レコードアレイは、コンパイル時に宣言することができ、固定:

type 
    tNamePair = record 
       English: String; 
       Number: String; 
      end; 
    tPairList = array[1..3] of tNamePair; 

const 
    PairList: tPairList = ((English: 'One'; Number: '1'), 
          (English: 'Two'; Number: '2'), 
          (English: 'Three'; Number: '3')); 

ダイナミック arが必要な場合実行時にそれを構築する必要があります。

type 
    tNamePair = array[1..2] of String; 
    tPairList = array of tNamePair; 

var 
    PairList: tPairList; 

initialization 
    SetLength(PairList, 3); 
    PairList[0][1] := 'One'; 
    PairList[0][2] := '1'; 
    PairList[1][1] := 'Two'; 
    PairList[1][2] := '2'; 
    PairList[2][1] := 'Three'; 
    PairList[2][2] := '3'; 
end. 

それとも、一定の固定配列コンパイル時に定義し、実行時にダイナミック配列にコピーすることができます:あなたは、直接それを構築することができます

type 
    tNamePair = array[1..2] of String; 
    tPairList = array[1..3] of tNamePair; 
    tPairListDyn = array of tNamePair; 

const 
    PairList: tPairList = (('One', '1'), 
          ('Two', '2'), 
          ('Three', '3')); 

function MakePairListDyn(const Pairs: tPairList): tPairListDyn; 
var 
    I, J: Integer; 
begin 
    SetLength(Result, Length(Pairs)); 
    for I := Low(Pairs) to High(Pairs) do begin 
    Result[J] := Pairs[I]; 
    Inc(J); 
    end; 
end; 

var 
    Pairs: tPairListDyn; 

initialization 
    Pairs := MakePairListDyn(PairList); 
end. 

のためにXE7以降の状況は、以下の@ LURDの答えを参照してください。

+4

私はすぐに再び忘れるだろうレコードのconst配列を宣言するのは幾分珍しい構文に思い出させるためにありがとう;-) – iamjoosy

+1

レミー、このような有用な応答を作成するために時間を割いていただきありがとうございます。 – RobertFrank

8

XE7では、動的配列定数を宣言することができます。

シンプルなケース:

const 
    a: TArray<String> = ['Delphi','XE7']; 

あなたの例では、これはコンパイル:

type 
    tNamePair = TArray<String>; 
    tPairList = TArray<tNamePair>; 

const 
    PairList: tPairList = [['One', '1'],['Two', '2'],['Three', '3']]; 

をレコードの動的配列を作成するには、それはこのように、実行時に行うことができます。

Type 
    TNamePair = record 
    English: String; 
    Number: String; 
    class function Define(_English,_Number: String): TNamePair; static; 
    end; 
    TPairList = TArray<TNamePair>; 

class function TNamePair.Define(_English, _Number: String): TNamePair; 
begin 
    Result.English := _English; 
    Result.Number := _Number; 
end; 

var 
    pl : TPairList; 
begin 
    pl := [TNamePair.Define('A','1'),TNamePair.Define('B','2')]; 
    ... 
end; 
+1

うわー! XE7で何が新しくなったのか不思議だった。あなたはこの2年前の糸を見つけたことを記憶しています!感謝します。 – RobertFrank

+0

私の記憶はあまりありませんが、特定の検索エンジン(Googleを読んでください)が役に立ちました:) –

+0

@LURD OPのオリジナルのTNamePair(レコード)の定義で動的配列定数を使用する方法について知っていますか? – Graymatter

0

この方法を使用できます。

const 
    C_ARRAY_CODE : array ['a'..'d'] of string = ('01','02','03','04'); 
var Conter:Char; 
begin 
    //Use With Loop 
    for Conter := Low(C_ARRAY_CODE) to high(C_ARRAY_CODE) do 
    ShowMessage(C_ARRAY_CODE[Conter]); 

    //Use Direct 
    ShowMessage(C_ARRAY_CODE['a']); 
end;