Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  05:23[Войти] | [Зарегистрироваться]
Ответ на вопрос № 78890

15-01-2011 09:52
Всем доброго времени суток. Кто знает как сделать 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;

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

21-01-2011 08:00
А отладка что дает? или временно забыли что можно отлаживать при помощи кнопки F8(F7) и заранее установленной точки останова на входе в обработчик или функцию.

20-01-2011 06:26 | Сообщение от автора вопроса
Так нет же. Все он узнает. Я даже не поленился сделал чистый проект и все перепробывал - если 1 файл скачивать 1 раз - то все норм. Как только нажимаешь на скачать второй раз. Выдает ошибку. Потом нормально скачивает (когда опять нажмеш) и потом опять. Через раз короче - возможно что то с очисткой буфера надо глянуть?

18-01-2011 07:47
Не всегда можно показать прогресс, редко но бывает что сервер не сообщает размер файла, а значит узнать процент загрузки нельзя.

16-01-2011 08:13 | Сообщение от автора вопроса
Когда прогрессбар доходит до конца (при скачки файла разумеется, т.е. он работает) - в конце выскакивает ошибка вида "Access violation at address 00000000. Read of addres 00000000." и подобные (адреса другие).

15-01-2011 12:24

unit FileDownLoadThread;
interface
uses
    Classes,
    SysUtils,
    Windows,
    ActiveX,
    UrlMon;
const
    S_ABORT = HRESULT($80004004);

type
    TFileDownLoadThread = class;
 
    TDownLoadProcessEvent = procedure(Sender:TFileDownLoadThread;Progress, ProgressMax:Cardinal) of object;
    TDownLoadCompleteEvent = procedure(Sender:TFileDownLoadThread) of object ;
    TDownLoadFailEvent = procedure(Sender:TFileDownLoadThread;Reason:LongInt) of object ;
    TDownLoadMonitor = class( TInterfacedObject, IBindStatusCallback )
    private
        FShouldAbort: Boolean;
        FThread:TFileDownLoadThread;
    protected
        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;
    public
        constructor Create(AThread:TFileDownLoadThread);
        property ShouldAbort: Boolean read FShouldAbort write FShouldAbort;
    end;
    TFileDownLoadThread = class( TThread )
    private
        FSourceURL: string;
        FSaveFileName: string;
        FProgress,FProgressMax:Cardinal;
        FOnProcess: TDownLoadProcessEvent;
        FOnComplete: TDownLoadCompleteEvent;
        FOnFail: TDownLoadFailEvent;
        FMonitor: TDownLoadMonitor;
    protected
        procedure Execute; override;
        procedure UpdateProgress(Progress, ProgressMax, StatusCode: Cardinal; StatusText:string);
        procedure DoUpdateUI;
    public
        constructor Create( ASrcURL, ASaveFileName: string; AProgressEvent:TDownLoadProcessEvent = nil;
          ACompleteEvent:TDownLoadCompleteEvent = nil;AFailEvent:TDownLoadFailEvent=nil;CreateSuspended: Boolean=False );
        property SourceURL: string read FSourceURL;
        property SaveFileName: string read FSaveFileName;
        property OnProcess: TDownLoadProcessEvent read FOnProcess write FOnProcess;
        property OnComplete: TDownLoadCompleteEvent read FOnComplete write FOnComplete;
        property OnFail: TDownLoadFailEvent read FOnFail write FOnFail;
    end;
implementation
constructor TDownLoadMonitor.Create(AThread: TFileDownLoadThread);
begin
    inherited Create;
    FThread:=AThread;
    FShouldAbort:=False;
end;
function TDownLoadMonitor.GetBindInfo( out grfBINDF: DWORD; var bindinfo: TBindInfo ): HResult;
begin
    result := S_OK;
end;
function TDownLoadMonitor.GetPriority( out nPriority ): HResult;
begin
    Result := S_OK;
end;
function TDownLoadMonitor.OnDataAvailable( grfBSCF, dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium ): HResult;
begin
    Result := S_OK;
end;
function TDownLoadMonitor.OnLowResource( reserved: DWORD ): HResult;
begin
    Result := S_OK;
end;
function TDownLoadMonitor.OnObjectAvailable( const iid: TGUID; punk: IInterface ): HResult;
begin
    Result := S_OK;
end;
function TDownLoadMonitor.OnProgress( ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR ): HResult;
begin
    if FThread<>nil then
        FThread.UpdateProgress(ulProgress,ulProgressMax,ulStatusCode,'');
    if FShouldAbort then
        Result := E_ABORT
    else
        Result := S_OK;
end;
function TDownLoadMonitor.OnStartBinding( dwReserved: DWORD; pib: IBinding ): HResult;
begin
    Result := S_OK;
end;
function TDownLoadMonitor.OnStopBinding( hresult: HResult; szError: LPCWSTR ): HResult;
begin
    Result := S_OK;
end;
{ TFileDownLoadThread }
constructor TFileDownLoadThread.Create( ASrcURL, ASaveFileName: string;AProgressEvent:TDownLoadProcessEvent ;
          ACompleteEvent:TDownLoadCompleteEvent;AFailEvent:TDownLoadFailEvent; CreateSuspended: Boolean );
begin
    if (@AProgressEvent=nil) or (@ACompleteEvent=nil) or (@AFailEvent=nil) then
        CreateSuspended:=True;
    inherited Create( CreateSuspended );
    FSourceURL:=ASrcURL;
    FSaveFileName:=ASaveFileName;
    FOnProcess:=AProgressEvent;
    FOnComplete:=ACompleteEvent;
    FOnFail:=AFailEvent;
end;
procedure TFileDownLoadThread.DoUpdateUI;
begin
    if Assigned(FOnProcess) then
        FOnProcess(Self,FProgress,FProgressMax);
end;
procedure TFileDownLoadThread.Execute;
var
    DownRet:HRESULT;
begin
    inherited;
    FMonitor:=TDownLoadMonitor.Create(Self);
    DownRet:= URLDownloadToFile( nil, PAnsiChar( FSourceURL ), PAnsiChar( FSaveFileName ), 0,FMonitor as IBindStatusCallback);
    if DownRet=S_OK then
    begin
        if Assigned(FOnComplete) then
            FOnComplete(Self);
    end
    else
    begin
        if Assigned(FOnFail) then
            FOnFail(Self,DownRet);
    end;
    FMonitor:=nil;
end;
procedure TFileDownLoadThread.UpdateProgress(Progress, ProgressMax, StatusCode: Cardinal; StatusText: string);
begin
    FProgress:=Progress;
    FProgressMax:=ProgressMax;
    Synchronize(DoUpdateUI);
    if Terminated then
        FMonitor.ShouldAbort:=True;
end;
end.

15-01-2011 12:23
Пример использования IBindStatusCallback:

unit Url;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ProgressBar1: TProgressBar;
    StaticText1: TStaticText;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TLoadThread = class(TThread)
  protected
    FResult:String;
    procedure Execute; override;
    procedure ShowResult;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  UrlMon,//UrlDownloadToFile
  ActiveX,//PFormatEtc
  CommCtrl;//PBM_SETPOS

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;

end.



15-01-2011 11:00
Могу прислать свои исходники. Скачивание там идёт с помощью InternetReadFile() кусками, отсюда и прогресс-бар.

15-01-2011 10:08
Реализуйте интерфейс IBindStatusCallback. Или используйте другую функцию для скачивания файлов, например, гляньте самый первый ответ здесь: »вопрос КС №40470«

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Два кольца, два конца, посередине гвоздик.
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования