我要做一个进度条,在用Copyfile复制文件时显示复制的进度,百分比.
这几天在网上查找,没找到这方面的资料,昨晚去图书大厦查找,书几乎翻遍了,但介绍进度条的很少,大部分都只是只讲讲Min,Max,Positon,Stepby,StepIt,没涉及到应用,即使有的书讲到应用也只泛泛的提了一下.
有谁能帮个忙,最好有着方面的实例.谢谢~~
呵呵,分不够在加.

解决方案 »

  1.   

    其在CopyFile函数中是不能准确实现的,调用系统的吧!就是跳出一个框拷贝的那种
    文件很大时才有效果:
    procedure CopyFile(const Sour, Dest: string);
      var
        FileOp: TSHFileOpStruct;
    begin
      with FileOp do
      begin
        Wnd := 0;
        wFunc := FO_Copy;//更换此参数可实现拷贝和更名
        pFrom := PChar(Sour);
        pTo := PChar(Dest);
        fFlags := FOF_NoConfirmation;
        fAnyOperationsAborted := False;
        hNameMappings := nil;
        lpszProgressTitle := nil
      end;
      SHFileOperation(FileOp);
    end;
      

  2.   

    该为CopyFileEx
    里面有一个回掉函数的参数
    LPPROGRESS_ROUTINE lpProgressRoutine,Specifies the address of a callback function of type LPPROGRESS_ROUTINE that is called each time another portion of the file has been copied. This parameter can be NULL. For more information on the progress callback function, see CopyProgressRoutine. 
      

  3.   

    用weizi2000(秋风啊)的方法即可,不过是uses ShellAPI;而不是ShallAPI,呵呵
      

  4.   

    weizi2000(秋风啊)的还不够详细啊?完整代码都给出来了,使用这个方法时就会自动弹出windows拷贝文件的进度条的
      

  5.   

    这个又有什么难的?
    先得到你要拷贝的文件的大小(别告诉我你不会,如果不会,那么就不用继续看了)!
    然后使用TFileStream进行读写操作,建立两个TFileStream,一个用于读取文件,一个用于写到另外一个地方!进度条的Max值和待拷贝文件的大小有关,Min设置为0,TFileStream每次写了多少个字节,那么设定进度条的一定的进度值!
      

  6.   

    //利用内存块读写procedure FileCopyB(const FromFile, ToFile: string);
    var
      FromF, ToF: file;
      NumRead, NumWritten: integer;
      Buf: array[1..2048] of Char;
    begin
      //关联源文件
      AssignFile(FromF, FromFile);
      //打开文件,每次只读一个字节
      Reset(FromF, 1);
      //关联目标文件
      AssignFile(ToF, ToFile);
      //创建目标文件,并打开,每次只读一个字节
      Rewrite(ToF, 1);
      //循环读写
      repeat
        BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
        BlockWrite(ToF, Buf, NumRead, NumWritten);
      until (NumRead = 0) or (NumWritten <> NumRead);
      //关闭源文件和目标文件
      CloseFile(FromF);
      CloseFile(ToF);
    end;你根据自己需要在改改代码,很容易。
    你要是做多个文件的时候,就用循环来得到所有文件的大小,加起来,然后在怎么写你就自己想一下吧,我就给你个例子
      

  7.   

    首先read:
    while (SrcFile <> '') or (DestFile <> '') do
    begin
      GetNextSrcFile;   //得到下一个源文件名(带路径的)
      GetNextDestFile;  //得到下一个目的文件名
      SrcPathList.Add(SrcFile); //和下面一起两个TStringList类型
      DestPathList.Add(DestFile);
    end;接着计算整个进度有多少:
    for i:=0 to SrcPathList.Count-1 do
         if CreateFile( SrcFile, SrcPathList[i], fmOpenRead or fmShareDenyWrite ) then
         begin
         Gauge.MaxValue := Gauge.MaxValue + SrcFile.Size; //计算进度条的最大值
                    SrcFile.Free;
         end;最后在拷贝文件时:
    for i:=0 to SrcPathList.Count-1 do //拷贝文件
    begin
       CopyFile(PChar(SrcPathList[i]), PChar(DestPathList[i]), false);
       if CreateFile( SrcFile, SrcPathList[i], fmOpenRead or fmShareDenyWrite ) then
        begin
           SetupForm.Gauge.Progress := Gauge.Progress + SrcFile.Size ;
           SrcFile.Free;
        end;
    end;这样的代码你拿过去照搬肯定不行,我只是给你列个提纲!大致步骤而已
      

  8.   

    在JVCL中有一个复制文件带进度条的控件,很是不错,我在自己的程序里用了,它可以指定进度条用你自己设置的进度条控件来显示。不过我是修改了它的源代码,只留下了需要的部分,删除了与复制和进度条无关的东西。如果你需要,发短信给我,我email给你。