2012-06-29 8 views
5

Ich möchte eine Funktion haben, die ein Wörterbuch der Zeichenfolge, Array der Variante nimmt. So kann es mit aufgerufen werden:Kann ich ein Wörterbuch mit dynamischem Array als Werttyp deklarieren?

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

ich zur Zeit dies zu erreichen, bin von

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

wo TSearch eine Klasse, die entlarvt:

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; 

Was würde ich zu tun ist:

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

anstelle von:

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

Jede Hilfe wird sehr geschätzt.

+0

Was genau funktioniert nicht? Kompiliert es nicht (und an welcher Position)? – jpfollenius

+0

.Add (Name: Zeichenfolge; a: Array von const)? – Marck

+0

Eigentlich ist das ein dynamisches Array und kein offenes Array. Offene Arrays existieren nur als Prozedurparameter. Ich habe den Fragentitel aktualisiert. –

Antwort

9

Während es kein Problem gibt, das Wörterbuch zu deklarieren, kann das Hinzufügen von Werten etwas schwierig werden. Sie können ein spezielles Konstrukt verwenden, um die gewünschte Variante Array zu erhalten:

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

Das ist genau das, was ich wollte. Eine Möglichkeit, die Array-Elemente in einer Zeile hinzuzufügen, ohne dass eine Klassenfunktion benötigt wird (und der zusätzliche uses-Klauseleintrag, der erforderlich wäre). Vielen Dank! – reckface

+0

Ist es wichtig, dass der generische Typ in der Deklaration mit der Verwendung übereinstimmt, oder könnte die ursprüngliche Reckface-Deklaration auch mit 'array of Variant' funktionieren? –

+1

@Rob Kennedy, nein, das wird nicht funktionieren. Der Compiler unterscheidet zwischen "TArray " und "Array of Variant". –

0

Sie können einen Typ für Array der Variante deklariert mehr Code zu tun, wie Sie wollen:

type 
    TDynamicArrayOfVariant = array of Variant; 

var 
    searchDictionary: TDictionary<string, TDynamicArrayOfVariant>; 
begin 
    searchDictionary.Add('BIN_NAME', ['X01%', '%D01']); 
end; 
Verwandte Themen