2012-06-29 10 views
5

Chciałbym mieć funkcję, która pobiera słownik ciąg, tablicy wariantu. Tak to można nazwać z:Czy mogę zadeklarować słownik z dynamiczną tablicą jako typ wartości?

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

Jestem obecnie osiągnięcie tego poprzez

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

gdzie pełnotekstowego jest klasa, która eksponuje:

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; 

Co chciałbym zrobić, to:

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

zamiast:

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

Każda pomoc zostanie bardzo doceniona.

+0

Co dokładnie nie działa? Czy nie kompiluje się (i na jakiej pozycji)? – jpfollenius

+0

.Dodaj (nazwa: ciąg; a: tablica stałej)? – Marck

+0

W rzeczywistości jest to tablica dynamiczna, a nie otwarta. Otwarte tablice istnieją tylko jako parametry procedury. Zaktualizowałem tytuł pytania. –

Odpowiedz

9

Chociaż deklarowanie słownika nie stanowi problemu, dodanie wartości może nieco skomplikować. Można użyć specjalnego konstrukt, aby uzyskać żądaną tablicę wariantowej:

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

Dokładnie tego chciałem. Sposób dodawania elementów tablicy w jednym wierszu bez potrzeby funkcji klasy (oraz wymaganego wpisu klauzuli dodatkowych zastosowań). Dzięki! – reckface

+0

Czy ważne jest, aby typowy typ w deklaracji pasował do użycia, czy też oryginalna deklaracja Reckface'a mogła również wykorzystywać pracę "array of Variant"? –

+1

@Rob Kennedy, nie, to nie zadziała. Kompilator rozróżnia między 'TArray ' a 'tablicą Variant'. –

0

można zadeklarować typ na tablicy wariantu zrobić więcej kodu, jak chcesz:

type 
    TDynamicArrayOfVariant = array of Variant; 

var 
    searchDictionary: TDictionary<string, TDynamicArrayOfVariant>; 
begin 
    searchDictionary.Add('BIN_NAME', ['X01%', '%D01']); 
end; 
Powiązane problemy