2012-06-29 7 views
5

Mi piacerebbe avere una funzione che richiede un dizionario di stringa, matrice di varianti. Così può essere chiamato con:Posso dichiarare un dizionario con array dinamico come tipo di valore?

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

Attualmente sto ottenere tale risultato con

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

dove tsearch è una classe che espone:

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; 

Quello che vorrei fare è:

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

invece di:

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

Qualsiasi aiuto sarà molto apprezzato.

+0

Che cosa non funziona? Non viene compilato (e in quale posizione)? – jpfollenius

+0

.Add (Nome: stringa; a: array of const)? – Marck

+0

In realtà si tratta di una matrice dinamica anziché di una matrice aperta. Gli array aperti esistono solo come parametri di procedura. Ho aggiornato il titolo della domanda. –

risposta

9

Mentre non c'è alcun problema nel dichiarare il dizionario, l'aggiunta di valori potrebbe essere alquanto complicata. È possibile utilizzare un costrutto speciale per ottenere la necessaria matrice variant:

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

Questo è esattamente quello che volevo. Un modo per aggiungere gli elementi dell'array in una riga senza la necessità di una funzione di classe (e la voce di clausola aggiuntiva degli usi che sarebbe necessaria). Grazie! – reckface

+0

È importante che il tipo generico nella dichiarazione corrisponda all'uso, oppure la dichiarazione originale di Reckface potrebbe essere utilizzata anche con il lavoro 'array of Variant'? –

+1

@Rob Kennedy, no, non funzionerà. Il compilatore distingue tra 'TArray ' e 'array of Variant'. –

0

È possibile dichiarare un tipo per serie di varianti a fare di più il codice come si desidera:

type 
    TDynamicArrayOfVariant = array of Variant; 

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