Всем доброго времени суток. Кто знает как сделать ProgressBar для UrlDownloadToFile. Перечитал все форумы и забугорные сайты но примера под Delphi так и не нашол. И если вопрос не решаемый, посоветуйте скачку файлов с HTTP с прогрессбаром. С уважением Николай.
function DownloadFile(SourceFile, DestFile: string): Boolean;
begin
try
Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;
except
Result := False;
end;
end;
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
21-01-2011 08:00
А отладка что дает? или временно забыли что можно отлаживать при помощи кнопки F8(F7) и заранее установленной точки останова на входе в обработчик или функцию.
Так нет же. Все он узнает. Я даже не поленился сделал чистый проект и все перепробывал - если 1 файл скачивать 1 раз - то все норм. Как только нажимаешь на скачать второй раз. Выдает ошибку. Потом нормально скачивает (когда опять нажмеш) и потом опять. Через раз короче - возможно что то с очисткой буфера надо глянуть?
Когда прогрессбар доходит до конца (при скачки файла разумеется, т.е. он работает) - в конце выскакивает ошибка вида "Access violation at address 00000000. Read of addres 00000000." и подобные (адреса другие).
type
TDownload = class(TInterfacedObject,IBindStatusCallBack)
FWndProgress:HWND;
FWndStatic:HWND;
///////////////////////////////////////////////////////
FAbort:Boolean;
///////////////////////////////////////////////////////
FMsg:String;
function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
function GetPriority(out nPriority): HResult; stdcall;
function OnLowResource(reserved: DWORD): HResult; stdcall;
function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
szStatusText: LPCWSTR): HResult; stdcall;
function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;
stgmed: PStgMedium): HResult; stdcall;
function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
end;
var
dnld:TDownload;
function TDownload.OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
begin
Result:=E_NOTIMPL;
end;
function TDownload.GetPriority(out nPriority): HResult; stdcall;
begin
Result:=E_NOTIMPL;
end;
function TDownload.OnLowResource(reserved: DWORD): HResult; stdcall;
begin
Result:=E_NOTIMPL;
end;
function TDownload.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
szStatusText: LPCWSTR): HResult; stdcall;
var
newPos:Integer;
begin
case ulStatusCode of
BINDSTATUS_CONNECTING,BINDSTATUS_SENDINGREQUEST,BINDSTATUS_REDIRECTING:
begin FMsg:='Соединение...'; sleep(1000) end;
BINDSTATUS_DOWNLOADINGDATA:
begin FMsg:='Загрузка...'; sleep(1000) end;
BINDSTATUS_USINGCACHEDCOPY:
begin FMsg:='Загрузка из кэша...'; sleep(1000) end;
else FMsg:='';
end;
if ulStatusCode=BINDSTATUS_ENDDOWNLOADDATA then newPos:=100
else if ulProgressMax=0 then newPos:=0
else newPos:=((ulProgress*100) div ulProgressMax);
if FWndProgress<>0 then
begin
SendMessage(FWndProgress,PBM_SETPOS,newPos,0);
SendMessage(FWndStatic,WM_SETTEXT,0,Integer(FMsg));
end;
///////////////////////////////////////////////////////
if FAbort then
begin
FAbort:=False;
Result:=E_ABORT;
Exit;
end;
///////////////////////////////////////////////////////
Result:=S_OK;
end;
function TDownload.OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
begin
Result:=E_NOTIMPL;
end;
function TDownload.GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
begin
Result:=E_NOTIMPL;
end;
function TDownload.OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;
stgmed: PStgMedium): HResult; stdcall;
begin
Result:=E_NOTIMPL;
end;
function TDownload.OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
begin
Result:=E_NOTIMPL;
end;
function DownloadFile(SourceFile, DestFile: string): Boolean;
begin
dnld:=TDownload.Create;
dnld.FWndProgress:=Form1.ProgressBar1.Handle;
dnld.FWndStatic:=Form1.StaticText1.Handle;
try
Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile),
0, IBindStatusCallBack(dnld)) = 0;
except
Result := False;
end;
SendMessage(dnld.FWndProgress,PBM_SETPOS,0,0);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
lt:TLoadThread;
begin
lt:=TLoadThread.Create(False);
lt.FreeOnTerminate:=True;
lt.Resume;
end;
procedure TLoadThread.Execute;
const
SourceFile = 'ftp://adsl.cheb.ru/Firefox_Setup_3.0.8.exe';
DestFile = 'c:\tmp.exe ';
begin
if DownloadFile(SourceFile, DestFile) then
FResult:='Файл загружен!'
else
FResult:='Ошибка при загрузке - '+ SourceFile;
Synchronize(ShowResult);
end;
procedure TLoadThread.ShowResult;
begin
ShowMessage(FResult);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
dnld.FAbort:=True;
ShowMessage(dnld.ClassName);
end;
Реализуйте интерфейс IBindStatusCallback. Или используйте другую функцию для скачивания файлов, например, гляньте самый первый ответ здесь: »вопрос КС №40470«
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.