2014-12-09 3 views
0

사용자가 파일을 검색 할 수 있도록 응용 프로그램을 작성한 후이 파일을 새 위치로 복사하는 작업을 실행합니다.Delphi - 배열의 마지막 항목 만 선택됩니다.

파일을 먼저 검색하기 위해 스레드가 시작되고 결과 (문자열 목록으로)가 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; 

내가 여기 데 문제는 위의 함수는 배열의 마지막 stringlist을 위해 작동하는 것 같다이다 - 즉 fFilesArray가 [iArrayCount] 항상 배열의 같은 stringlist를 가리키는 것 같다, 그리고 나는 이유를 해결할 수 없다!

결과적으로 복사되는 배열의 모든 문자열 목록에있는 파일 대신 마지막으로 추가 된 문자열 목록의 파일 만 실제로 복사됩니다. 배열의 길이이지만 fFilesArray [iArrayCount]는 항상 동일한 문자열 목록을 가리 킵니다.

도움이 될 것입니다.

+1

검색 할 때마다 새 TStringList를 만드는 대신 동일한 TStringList를 재사용 할 수 있습니까? 당신이 코드의 일부를 버렸기 때문에 나는 말할 수 없습니다. –

+2

코드에 버그가있는 것 같습니다. MCVE가 그것을 추적하도록 도와 주길 바랍니다. –

+0

이것이 문제인지 잘 모르겠지만, 'for' 루프의 한계는 루프가 입력되기 전에 한 번만 평가된다는 것을 알고 있습니까? –

답변

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에 대한 포인터가되었음을 알지 못했습니다. (이것이 올바른 가정이 될까요?) 배열을 사용하는 것에 익숙합니다. 고마워, 고마워.

+0

이것은 배열의 문제는 아니지만 참조 유형 및 할당 연산자의 의미와 관련된 문제입니다. –

관련 문제