unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    pbCopyProgress: TProgressBar;
    cmbCopy: TButton;
    txtFrom: TEdit;
    txtTo: TEdit;
    Label2: TLabel;
    procedure cmbCopyClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var
  progress: TProgressBar;
  bCancelCopy: BOOL;

{$R *.dfm}

//Функция обратного вызова для отображения хода копирования
function CopyProgressFunc( TotalFileSize: Int64;
                           TotalBytesTransferred: Int64;
                           StreamSize: Int64;
                           StreamBytesTransferred: Int64;
                           dwStreamNumber: DWORD;
                           dwCallbackReason: DWORD;
                           hSourceFile: THandle;
                           hDestinationFile: THandle;
                           lpData: Pointer            ): DWORD; stdcall;
begin
  progress.Position := 100 * TotalBytesTransferred div TotalFileSize;
  Application.ProcessMessages;   //Чтобы не "зависал" интерфейс приложения
  CopyProgressFunc := PROGRESS_CONTINUE;
end;

procedure TForm1.cmbCopyClick(Sender: TObject);
begin
  if cmbCopy.Caption = 'Копировать' then
  begin
    //Запускаем копирование
    progress := pbCopyProgress; //Настроен от 0 до 100%
    bCancelCopy := FALSE;
    cmbCopy.Caption := 'Отмена';
    if CopyFileEx(PAnsiChar(txtFrom.Text), PAnsiChar(txtTo.Text),
                  Addr(CopyProgressFunc), nil, Addr(bCancelCopy),
                  COPY_FILE_FAIL_IF_EXISTS) = FALSE
    then
      MessageBox(Handle, 'Не удается скопировать файл', 'Копирование',
                 MB_ICONEXCLAMATION);
  end
  else
  begin
    //Останавливаем процесс копирования
    bCancelCopy := TRUE;
    cmbCopy.Caption := 'Копировать';
  end;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  //Останавливаем процесс копирования
  bCancelCopy := TRUE;
end;

end.
