procedure TForm1.btn1Click(Sender: TObject);
var
S1,s2:string;
begin
  S1:= edt1.text;
  s2:= edt2.text;
 if CopyAllFile(s1,s2) = 0 then  ShowMessage('复制成功');
end;function TForm1.CopyAllFile(str1, str2: string): Integer;
var
MyStruct: TSHFileOpStruct;
begin
  with MyStruct do
  begin
    Wnd:= Application.Handle;
    wFunc:= FO_COPY;
    pFrom:= PWideChar(str1+#0);
    pTo:= PWideChar(str2+#0);
    fFlags:= FOF_NOCONFIRMATION or FOF_SIMPLEPROGRESS;
    fAnyOperationsAborted:= false;
    hNameMappings:= nil;
    lpszProgressTitle:= nil;
  end;
  Result := SHFileOperation(MyStruct);
end;
上面是我写的复制整个文件夹的例子,但是我想在我的窗口增加一个TProgress 控件的进度条,那SHFileOperation这个函数如何获取复制过程中的进度值,假如进度条的值是0-100,那要怎么结合SHFileOperation这个函数来获取相应的数值呢?没有头绪,望大神指点下

解决方案 »

  1.   

    换一种考虑,复制文件的时候可以显示一个Animate文件复制动画。
      

  2.   

    Animate文件复制动画不好看,我就想一个进度条显示
      

  3.   

    二种方式
    1、如果获取文件长度,可以通过计算百分比的值,显示Progress进度条
    2、开始复制文件就显示一个动态的Progress进度条,复制完毕,关闭Progress进度条。Progress从0-100反复显示。另外,要通过线程来复制和显示Progress进度条。否则,VCL窗口和控件看上去,会出现“等待”性停止状态。
      

  4.   

    1. 先搜索一下要复制的所有文件,取得文件大小,相加得到总量,然后循环调用CopyFileEx复制每个文件,这个API支持回调,在其中处理进度即可。
    2, 使用IFileOperation接口,支持回调,缺点是要求Vista+,XP不行。