我正在编写一个应用程序,允许用户搜索文件,然后执行将这些文件复制到新位置的操作。
启动线程以首先搜索文件,然后将结果(作为字符串列表)添加到Tstringlist的动态数组中。此搜索可以根据需要执行多次,并且每次后续数组都是展开并添加新的搜索结果字符串列表。这在消息循环中完成,如下所示;
//definitions
fSearchThread: TSearchThread;
fFilesArray: array of TStringlist;
begin
if Msg.Msg = WM_SEARCH_COMPLETED then
begin
fSearchThread.Terminate;
SetLength (fFilesArray,Length(fFilesArray)+1);
fFilesArray[High(fFilesArray)]:=fslSearchResults;
end
end;
用户想要复制文件时执行的方法如下:
procedure TfMain.aGoExecute(Sender: TObject);
var
iArrayCount: integer;
thFileCopyThread: TFileCopyThread;
begin
for iArrayCount:=0 to (Length(fFilesArray)-1) do
begin
if fFilesArray[iArrayCount].Count > 0 then
begin
thFileCopyThread := TFileCopyThread.Create(false,self.Handle,C_LOG_FILE_NAME,
fFilesArray[iArrayCount],fslDestinationList);
end;
end;
end;
我在这里遇到的问题是上面的函数似乎只适用于数组中的最后一个字符串列表 - 即fFilesArray [iArrayCount]似乎总是指向数组中的相同字符串列表,我不能找出原因!
结果是,不是复制数组中所有字符串列表中的文件,而是实际上只复制了最后添加的字符串列表中的文件。我可以看到它根据长度创建了正确数量的线程数组,但fFilesArray [iArrayCount]始终指向相同的字符串列表。
任何帮助将不胜感激,我很难过!
答案 0 :(得分:0)
@Ken就是现场!我将代码更改为以下内容;
if Msg.Msg = WM_SEARCH_COMPLETED then
begin
fSearchThread.Terminate;
SetLength (fFilesArray,Length(fFilesArray)+1);
fFilesArray[High(fFilesArray)]:=TStringlist.Create;
for j:=0 to fslSearchResults.Count-1 do
fFilesArray[High(fFilesArray)].Add(fslSearchResults[j]);
fslSearchResults.Free;
end
它的效果与预期一致,我只需在搜索开始时创建一个新的fslSearchResults
。我没有意识到,fFilesArray[High(fFilesArray)]:=fslSearchResults;
实际上没有将stringlist的内容分配给新的stringlist,而只是成为指向fslSearchResults
的指针(这是正确的)假设?)我是新手使用数组,所以这非常有用,谢谢。