WaReZMEN, в принципе, MSDN разжевывает данную тему достаточно подробно. Есть только одна тонкость: в CopyFileEx передается параметр pbCancel, который должен быть указателем на переменную Boolean и эта переменная не должна быть локальной... Вот кусок выдранного откуда-то кода:| Код | function CopyProgressRoutine( TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: LARGE_INTEGER; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Pointer): DWORD; stdcall; // Соглашение о передаче параметров begin // lpData содержит указатель, переданный в CopyFileEx, здесь это // указатель на ProgressBar1
// Если началось копирование нового файла, изменим максимальный // порог для указателя прогресса if dwCallbackReason = CALLBACK_STREAM_SWITCH then TProgressBar(lpData).Max := TotalFileSize.QuadPart;
// Установим новую позицию TProgressBar(lpData).Position := TotalBytesTransferred.QuadPart;
// Обновимся и копируем дальше Application.ProcessMessages; Result := PROGRESS_CONTINUE; end;
procedure TForm1.Button1Click(Sender: TObject); var Ch1, Ch2 : PChar; ErrCode : Integer; begin FCancelled := False; Ch1 := PChar(Edit1.Text); Ch2 := PChar(Edit2.Text); if CopyFileEx(Ch1, Ch2, @CopyProgressRoutine, // Указатель на call-back функцию ProgressBar1, @FCancelled, COPY_FILE_RESTARTABLE) then MessageDlg('Процесс копирования успешно завершен!', mtInformation, [mbOk], -1) else begin ErrCode := GetLastError; MessageDlg('В процессе копирования возникли ошибки!'#13#13'Код ошибки: '+ IntToStr(ErrCode)+#13'Описание: '+SysErrorMessage(ErrCode)+'.', mtError, [mbOk], -1); end; ProgressBar1.Position := 0; end; |
|