Delphi 9 の TDictionary ジェネリック クラスを使用しています。私の TDictionary は次のようになります。
g_FileHandlers : TDictionary<String, TList<String>>;
そして、次のように TDictionary を初期化します。
g_FileHandlers := TDictionary<String, TList<String>>.Create;
TList も初期化しているので、それを使用して TDictionary を設定できます。TList/TDictionary に入力するために使用するファイル データをループしています。同じ TList を再利用して、値として TDictionary に挿入しようとしています。TDictionary への最初の挿入では、項目の TList 値が存在し、その中にデータが含まれています。2 回目以降の反復では、TList 値はすべて nil です。
g_FilePaths := TList<String>.Create;
このすべてを参照によって行っているように思えます。TList を参照ではなく値で TDictionary に追加するにはどうすればよいですか?
// 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;