Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

Копирование с "msctls_progress32"   Найти похожие ветки 

 
KORN   (2004-05-17 16:29) [0]

Люди, если у кого-то есть пример копирования файлов (на АЙПИ) с отображение прогресса в компоненте "msctls_progress32", пожалуйста, поделитесь. А то у меня, получилось следующее:

procedure FastFileCopy(const hProgress: HWND; InFileName, OutFileName: string);
const
BufSize = 3*4*4096; { 48Kbytes gives me the best results }
type
PBuffer = ^TBuffer;
TBuffer = array[1..BufSize] of Byte;
var
Size: DWORD;
Buffer: PBuffer;
infile, outfile: file;
SizeDone, SizeFile: LongInt;
begin
if (InFileName <> OutFileName) then begin
 buffer := nil;
 Assign(infile, InFileName);
 Reset(infile, 1);
  try
   SizeFile := FileSize(infile);
   Assign(outfile, OutFileName);
   Rewrite(outfile, 1);

   //устанавливаем минимальную и максимальную позицию прогресса
   SendMessage(hProgress, PBM_SETRANGE, 0, MAKELPARAM(0, SizeFile));
   //Устанавливаем шаг
   SendMessage(hProgress, PBM_SETSTEP, 1, 0);

    try
     SizeDone := 0;
     New(Buffer);
  repeat
   BlockRead(infile, Buffer^, BufSize, Size);
   Inc(SizeDone, Size);

   //Устанавливаем позицию
   SendMessage(hProgress, PBM_SETPOS, SizeDone, 0);

   BlockWrite(outfile, Buffer^, Size)
  until Size < BufSize;
   FileSetDate(TFileRec(outfile).Handle,
   FileGetDate(TFileRec(infile).Handle));
  finally
   if Buffer <> nil then Dispose(Buffer);
    CloseFile(outfile)
  end;
 finally
  CloseFile(infile);
 end;
end;
end;


Но прогресс все-равно не работает. Где ошибка? Помогите!


 
KORN   (2004-05-17 19:40) [1]

Вижу, что "мастера" в WIN32API не в зуб ногой...


 
Игорь Шевченко ©   (2004-05-17 21:36) [2]


> Вижу, что "мастера" в WIN32API не в зуб ногой...


Эт точно...


 
Cobalt ©   (2004-05-17 23:41) [3]

2 KORN
1) Попробуй анализировать результат SendMessage
2) Функция вызывается из какого-то события?


 
Viman ©   (2004-05-18 09:09) [4]

Не пользовался напрямую msctls_progress32, ничего не скажу что это такое. Сам-то прогресс рисуется во время копирования? В циклах не мешает ставить такую вещь как Application.ProcessMessages, чтобы успевало в данном случае обрабатываться сообщение WM_PAINT и все должно быть нормально. Если не используешь VCL, то тогда вызывай вместо ProcessMessages что-нибудь типа SendMessage(hProgress, WM_PAINT, ...), либо InvalidateRect - UpdateWindow.
Успехов.


 
NAlexey ©   (2004-05-18 12:13) [5]


procedure FastFileCopy(const hProgress: HWND; InFileName, OutFileName: string);
const
 BufSize = 3*4*4096; { 48Kbytes gives me the best results }
type
 PBuffer = ^TBuffer;
 TBuffer = array[1..BufSize] of Byte;
var
 Size: DWORD;
 Buffer: PBuffer;
 infile, outfile: file;
 SizeDone, SizeFile: LongInt;
begin
 if (InFileName <> OutFileName) then
 begin
   buffer := nil;
   Assign(infile, InFileName);
   Reset(infile, 1);
   try
     SizeFile := FileSize(infile);
     Assign(outfile, OutFileName);
     Rewrite(outfile, 1);
     //устанавливаем минимальную и максимальную позицию прогресса
     SendMessage(hProgress, PBM_SETRANGE, 0, MAKELPARAM(0, SizeFile div BufSize));
     //Устанавливаем шаг
     SendMessage(hProgress, PBM_SETSTEP, 1, 0);
     try
       SizeDone := 0;
       New(Buffer);
       repeat
         BlockRead(infile, Buffer^, BufSize, Size);
         Inc(SizeDone{, BufSize});
         //Устанавливаем позицию
         SendMessage(hProgress, PBM_SETPOS, SizeDone, 0);
         BlockWrite(outfile, Buffer^, Size)
       until Size < BufSize;
       FileSetDate(TFileRec(outfile).Handle,
       FileGetDate(TFileRec(infile).Handle));
     finally
       if Buffer <> nil then
         Dispose(Buffer);
       CloseFile(outfile)
     end;
   finally
     CloseFile(infile);
   end;
 end;
end;

function WindProc(hWindow: HWnd; Message, wParam, lParam: Integer): Integer; stdcall;
begin
 Result := 0;
 case Message of
   WM_DESTROY:
   begin
     PostQuitMessage(0);
     Exit;
   end;
 else
   Result := DefWindowProc(hWindow, Message, wParam, lParam);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 hWindow: THandle;
 PB: THandle;
 Inst: HINST;

 function GetSplashWindow: THandle;
 var
   WinClass: WNDCLASS;
   Left, Top, W, H: Integer;
 begin
   WinClass.style := 0;
   WinClass.cbClsExtra := 0;
   WinClass.cbWndExtra := 0;
   WinClass.hInstance := hInstance;
   WinClass.hIcon := 0;
   WinClass.hCursor := LoadCursor(0, IDC_ARROW);;
   WinClass.hbrBackground := color_btnface + 1;
   WinClass.lpszMenuName := nil;
   WinClass.lpszClassName := "ProgressWnd";
   WinClass.lpfnWndProc := @WindProc;
   Windows.RegisterClass(WinClass);
   W := 300;
   H := 40;
   Left := (Screen.Width - W) div 2;
   Top :=  (Screen.Height - H) div 2;
   Result := CreateWindowEx(WS_EX_TOOLWINDOW or
     WS_EX_DLGMODALFRAME or WS_EX_TOPMOST,
     WinClass.lpszClassName, "????", WS_POPUP, Left,
     Top, W, H, HWND_DESKTOP, 0, HInstance, nil);
 end;

begin
 Inst := HInstance;
 hWindow := GetSplashWindow;
 PB := CreateWindow("msctls_progress32", "progressbar", WS_VISIBLE or WS_CHILD or WS_BORDER,
   8, 8, 281, 18, hWindow, 0, Inst, nil);
 SendMessage(PB, PBM_SETPOS, 0, 0);
 ShowWindow(hWindow, SW_NORMAL);
 FastFileCopy(PB, "C:\BigData.rar", "C:\BigData1.rar")
end;



Страницы: 1 вся ветка

Текущий архив: 2004.06.27;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.039 c
4-1084958517
-=zek=-
2004-05-19 13:21
2004.06.27
Получение изображения рабочего стола


14-1086913129
iZEN
2004-06-11 04:18
2004.06.27
Дикая охота


14-1086655939
Andy BitOff
2004-06-08 04:52
2004.06.27
Редактор реестра под ДОС


4-1084954360
Creator
2004-05-19 12:12
2004.06.27
handle of button


14-1086164825
ИМХО
2004-06-02 12:27
2004.06.27
Пару слов и Стивене Кинге





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский