Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > ProgressBar


Автор: Snipe 12.9.2005, 21:59
В библиотеке существует отдельная процедура (не важно какие действия она выполняет). Мне нужно чтобы
ход её работы показывался в ProgressBar. Пробую передать его свойство Position в качестве переменного входного параметра. Компилятор ругеатся что десскать это свойство нельзя передавать как var. Если передавать весь ProgressBar, то необходимо подключать ComCtrls отчего размер файла dll увеличивается в несколько раз. Что посоветуете?

Автор: Voyager 12.9.2005, 22:38
Я например делал так (упрощенно опишу):
В программе:
Код

const
  ID_PROGRESS = 101;
var
  hWin: HWND;//хендл главного окна
  LibHandle: THandle;
  MyFunction: function(hWin:HWND;hProgress:HWND):boolean;stdcall;
...

LibHandle := LoadLibrary('mydll.dll');
if LibHandle <> 0 then
   begin
        @MyFunction := getProcAddress (LibHandle, '_MyFunction');
        if Assigned ( MyFunction ) then
          begin
             MyFunction(hWin,GetDlgItem(hWin, ID_PROGRESS));
         end
       else
         begin
              MessageBox(hWin,'Function not found : _MyFunction','Error',MB_OK);
         end;
   end
else
   begin
         MessageBox(hWin,'DLL not found : mydll.dll'l,'Error',MB_OK);
   end;
freeLibrary ( LibHandle );

В библиотеке:
Код


uses
  Windows;

const
  PBM_SETRANGE        = WM_USER+1;
  PBM_SETPOS          = WM_USER+2;

...

//Установка минимальной и максимальной позиции ProgressBar
function Progress_SetRange(hProgress: HWND; nMinRange: wParam; nMaxRange: lParam): DWORD;
begin
 Result := SendMessage(hProgress, PBM_SETRANGE, 0, MAKELPARAM(nMinRange, nMaxRange));
end;

//Устанавливаем позицию ProgressBar
function Progress_SetPos(hProgress: HWND; nNewPos: wParam): Integer;
begin
 Result := SendMessage(hProgress, PBM_SETPOS, nNewPos, 0);
end;

function ProcessMessages : Boolean;
const
 WM_QUIT  = $0012;
var
 Msg : TMsg;
begin
 Result := False;
 while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin
  if Msg.Message = WM_QUIT then
  begin Exit end else begin
   TranslateMessage(Msg);
   DispatchMessage(Msg);
  end;
 end; Result := True;
end;

Function MyFunction(hWin:HWND;hProgress:HWND):boolean;stdcall;
var
  i:integer;
begin
//выполняешь действия с прогресс-баром
      Progress_SetRange(hProgress,0,1000);
//начало цикла
      Progress_SetPos(hProgress,i);
      ProcessMessages;
//конец цикла
end;
...
exports MyFunction name '_MyFunction';



Принцип думаю понятен, у меня все работало как надо, и размер библиотеки получался не более 100 кб (так как используется в основном WinAPI).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)