Спасибо, нашел таки решение через winapi, мне нужно было перемещение, поэтому сделал так, может кому пригодится. Если с функцией без потока - программа виснет на время перемещения, а так нет:
| Код | procedure TMainForm.MoveBtnClick(Sender: TObject); var TId, id: longword; begin if fList.Count <> 0 then if MessageDlg('Подтвердите перемещение:' + #10 + StringReplace(fList.Text, #10, #10, [rfReplaceAll]) + 'В ' + ShellTreeView2.Path ,mtinformation,[mbYes,mbNo],0) = mrYes then Tid:=beginthread(nil,0,Addr(MoveThread),nil,0,id) //запускаем функцию в потоке else ShowMessage('Не выбраны директории/файлы'); end
..........
procedure MoveThread; begin for TekDir:= 0 to fList.Count - 1 do if MoveDir(fList[TekDir], MainForm.ShellTreeView2.Path) then begin SuspendThread(0); ShowMessage(fList[TekDir] + ' перемещен'); ResumeThread(0) end; MainForm.ShellTreeView1.Refresh(MainForm.ShellTreeView1.TopItem); MainForm.ShellTreeView2.Refresh(MainForm.ShellTreeView2.TopItem); endthread(0); // Выходим из потока. end;
function MoveDir(const fromDir, toDir: string): Boolean; var fos: TSHFileOpStruct; begin ZeroMemory(@fos, SizeOf(fos)); with fos do begin wFunc := FO_MOVE; fFlags := FOF_FILESONLY; pFrom := PChar(fromDir + #0); pTo := PChar(toDir); end; Result := (0 = ShFileOperation(fos)); end;
|
|