Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Загрузка страниц и прогресс


Автор: raduis 29.6.2008, 14:31
Здравствуйте. Есть работающий код загрузки интернет страниц для последующего анализа.
Но не получается сделать работающий ProgressBar.

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, ComCtrls;

type
  TForm1 = class(TForm)
    http: TIdHTTP;
    Button1: TButton;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
    procedure httpWork(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure httpWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  s:string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
http:=TIdHTTP.Create(nil);
  try
    s := http.Get('http://forum.vingrad.ru/');
    showmessage(s);
  except
    ShowMessage('Ошибка');
  end;
  http.Free;
end;

procedure TForm1.httpWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
      if AWorkMode = wmRead then ProgressBar1.Position := AWorkCount;
end;

procedure TForm1.httpWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
      if AWorkMode = wmRead then ProgressBar1.Max := AWorkCountMax;
end;
end.


При загрузки страницы progress никак ни реагирует. Где ошибка?

Автор: MetalFan 29.6.2008, 15:20
и что же не работает? 
наверное не перерисовывается?
так вызови Update у прогрессбара.

Автор: Qu1nt 29.6.2008, 15:40
radius,
Вот так будет правильней:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    s := http.Get('http://forum.vingrad.ru/');
    ShowMessage(s);
  except
    ShowMessage('Ошибка');
  end;
end;

Ы?)

Автор: MetalFan 29.6.2008, 16:02
Qu1nt, чем правильнее?

Автор: Qu1nt 29.6.2008, 16:17
Тем, что этот код рабочий = )

Автор: Matematik 29.6.2008, 20:16
Если создаешь объект сам, то и события должен указывать ты.
Код

  http:=TIdHTTP.Create(nil);
  // вот
  http.OnWork := httpWork;
  http.OnWorkBegin := httpWorkBegin;
  try
    s := http.Get('http://forum.vingrad.ru/');
    showmessage(s);
  except
    // показать ошибку
    on E:Exception do
      Application.ShowException(E); // или так ShowMessage(e.ClassName+' '+E.Message)
  end;
  http.Free;
end;

Автор: Snowy 30.6.2008, 14:07
1. После установки новой позиции в прогрессбаре, сделай ProcessMessages.
2. Уменьши размер приёмного буфера. Т.к. событие OnWork срабатывает при считывании буфера. И, если его размер будет больше размера файла, то событие вообще не будет вызвано. Лучшую точность даст размер буфера = 1, но снижает скорость загрузки. Оптимально - загрузить Heder, узнать размер, установить размер буфера в зависимости от размера файла по вкусу. (например размер div 20).

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