J'utilise la classe générique TDictionary de Delphi 9. Mon TDictionary ressemble à ceci:TDictionary de Delphi, mes objets de valeur insèrent comme nulle
g_FileHandlers : TDictionary<String, TList<String>>;
Et, donc j'initialiser le TDictionary comme ceci:
g_FileHandlers := TDictionary<String, TList<String>>.Create;
J'ai un TList, que je suis aussi l'initialisation, afin que je puisse l'utiliser pour remplir le TDictionary. Je suis en boucle sur certaines données de fichier que j'utilise pour peupler le TList/TDictionary, et j'essaie de réutiliser le même TList à insérer dans le TDictionary que la valeur. Lors de la première insertion dans le TDictionary, la valeur TList de l'élément existe et contient les données. Sur la deuxième, et les itérations suivantes, bien que les valeurs TList soient toutes nulles.
g_FilePaths := TList<String>.Create;
Il me semble que tout cela est fait par référence. Est-ce que quelqu'un sait comment ajouter un TList à mon TDictionary par valeur, au lieu de référence?
Merci
// Create our dictionary of files and handlers
for i := 0 to g_FileList.Count - 1 do
begin
g_HandlerName := AnsiMidStr(g_FileList[i], 2, Length(g_FileList[i]));
g_HandlerName := AnsiMidStr(g_HandlerName, 1, Pos('"', g_HandlerName) - 1);
if i = 0 then
g_PreviousHandlerName := g_HandlerName;
if AnsiCompareText(g_HandlerName, g_PreviousHandlerName) = 0 then
begin
g_FilePath := AnsiMidStr(g_FileList[i], Length(g_HandlerName) + 5, Length(g_FileList[i]));
g_FilePath := AnsiMidStr(g_FilePath, 1, Length(g_FilePath) - 1);
g_FilePaths.Add(g_FilePath);
end
else
begin
g_FileHandlers.Add(g_PreviousHandlerName, g_FilePaths);
g_FilePaths.Clear;
g_FilePath := AnsiMidStr(g_FileList[i], Length(g_HandlerName) + 5, Length(g_FileList[i]));
g_FilePath := AnsiMidStr(g_FilePath, 1, Length(g_FilePath) - 1);
g_FilePaths.Add(g_FilePath);
end;
if AnsiCompareText(g_HandlerName, g_PreviousHandlerName) <> 0 then
g_PreviousHandlerName := g_HandlerName;
if i = g_FileList.Count - 1 then
g_FileHandlers.Add(g_HandlerName, g_FilePaths);
end;
g_FilePaths.Free;
Je suis d'accord et voudrais aussi suggérer que l'OP utilise TObjectDictionary et crée en utilisant "TObjectDictionary> .Create ([doOwnsValues]); "pour éviter les fuites de mémoire des listes quand les éléments sont supprimés. –