2012-06-29 4 views
5

私は文字列、バリアントの配列の辞書を取る関数を持っていると思います。だから、で呼び出すことができます。動的配列を持つ辞書を値型として宣言できますか?

searchDictionary := TDictionary<string, array of variant>; 
    searchDictionary.Add('KEY_NAME', ['X01%', '%D01']); 
    aValue := TDtoClass.Search(searchDictionary) 

Tsearchが公開するクラスです私は現在

searchDictionary := TDictionary<string, TList<variant>>.Create; 
    searchDictionary.Add('BIN_NAME', TSearch.Values(['X01%', '%D01'])); 

によってこれを実現しています:

class function TSearch.Values(const arguments: array of variant): TList<variant>; 
var 
list : TList<variant>; 
item: variant; 
begin 
    list := TList<variant>.Create; 
    for item in arguments do 
    begin 
     list.Add(item); 
    end; 
    Result := list;   
end; 

私がやりたいです:

searchDictionary.Add('BIN_NAME', ['X01%', '%D01']); 

代わりに:

searchDictionary.Add('BIN_NAME', TSearch.Values(['X01%', '%D01'])); 

ご協力いただきますようお願い申し上げます。

+0

動作していない、正確には何?それはコンパイルされません(そしてどの位置に)? – jpfollenius

+0

.Add(名前:文字列; a:constの配列)? – Marck

+0

実際、これはオープンアレイではなくダイナミックアレイです。オープン配列は、プロシージャのパラメータとしてのみ存在します。私は質問のタイトルを更新しました。 –

答えて

9

ディクショナリの宣言に問題はありませんが、値を追加するにはやや難しいかもしれません。あなたは必要なバリアント配列を取得するために、特別な構文を使用することができます。

var 
    searchDictionary: TDictionary<string, TArray<variant>>; 
begin 
    searchDictionary.Add('BIN_NAME', TArray<variant>.Create('X01%', '%D01')); 
end; 
+0

それはまさに私が望んでいたものです。クラス関数を必要とせずに配列要素を1行に追加する方法(および必要となる追加のuses句のエントリ)。ありがとう! – reckface

+0

宣言のジェネリック型が使用に合っているか、 'array of Variant'を使ったReckfaceの元の宣言も重要なのでしょうか? –

+1

@Rob Kennedy、それは動作しません。コンパイラは 'TArray 'と 'Variantの配列 'を区別します。 –

0

あなたが望むように多くのコードを実行するためにバリアントの配列の型を宣言することができます。

type 
    TDynamicArrayOfVariant = array of Variant; 

var 
    searchDictionary: TDictionary<string, TDynamicArrayOfVariant>; 
begin 
    searchDictionary.Add('BIN_NAME', ['X01%', '%D01']); 
end; 
関連する問題