Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > загрузился ли webbrowser или нет


Автор: FireSnake 20.10.2007, 20:57
как реализовать примерно такой цикл:
Код

for i:=1 to n do
begin
        webbrowser1.navigate(a[i]);
       {1. подождать пока браузер полностью скачает страницу}
       {2. сохранить код страницы на жестком диске или в строковую переменную}
       {3. обработать код текущей страницы}
end;


Со вторым(частично) и  третьем пунктом более менее понятно. А вот как узнать закачал веббровзер полностью страницу или нет? 

Автор: Alix 20.10.2007, 21:48
Цитата(FireSnake @  20.10.2007,  21:57 Найти цитируемый пост)
подождать пока браузер полностью скачает страницу

надо использовать события. должно же там быть что-то OnLoad или а-ля OnNavigated или OnAfterNavigate. по памяти не помню, давно не использовал, а возможности посмотреть сейчас нет.

Добавлено через 1 минуту и 53 секунды
вспомнил, вроде OnDocumentComplete

Автор: FireSnake 20.10.2007, 21:54
events? да я их тоже нашел, но не совсем понимаю как они работают. Не может произойти так что весь цикл проработает а не успеет загрузится даже первый линк?

Автор: Alix 20.10.2007, 22:01
не так. надо сделать что-то вроде того:
Код

var
  a : array [1..n] of string;
  current : integer;
...
// запускаем работу программы, например по нажатию кнопки
// будем считать, что массив a уже заполнен, затем:
current := 1;
wb.navigate(a[1]);
...
// в onDocumentComplete
begin
  ...  // проверяем, что страница загрузилась (сам напиши этот код)
  saveHTMLToFile(); // 2.
  parseHTML();  // 3.
  inc(current);
  if current > n then begin
    // на этой строчке, если надо, извещаем о том, что работа завершена, затем...
    exit; // ...выходим
 end;

  wb.navigate(a[current]);
end;

Автор: December 20.10.2007, 22:54
1. Для вопросов по TWebBrowser существует подраздел ActiveX
2. В DRKB есть ответы на все вопросы

Автор: MrKit 21.11.2007, 19:40
Цитата(December @  20.10.2007,  22:54 Найти цитируемый пост)
2. В DRKB есть ответы на все вопросы 

Скачал я его. Ответа не вижу :( (вопрос у меня тот же)

OnDownloadComplete, OnDownloadComplete, OnNavigateComplete2 - происходит, когда страница закончила грузиться.

Правда, здесь есть много нюансов при загрузке страниц с графикой и фреймами - для каждого загружаемого элемента будут генерироваться новые события начала/окончания загрузки, а кроме того, если отключить загрузку рисунков/анимации/видео, так вообще некоторые из них не будут происходить! Так что пользоваться ими нужно осторожно.

Автор: December 21.11.2007, 23:38
Код

procedure TfrPannedBrowser.wbPannedWBProgressChange(Sender: TObject;
  Progress, ProgressMax: Integer);
begin
if Application.Terminated then exit;
if (Progress=-1) then ProcessNavigationEnd;
end;

НО: всякие аяксы, ролловеры и прочая муть иногда не ловится
Мне не удалось сделать идеальную, 100% надёжную схему отлова момента окончания загрузки. Рекомендую сделать тестовое приложение, в котором отлавливать все события TWebBrowser. Это единственный способ разобраться где, что и как происходит.

Автор: MetalFan 22.11.2007, 00:11
может ReadyState проверять?

Автор: MrKit 22.11.2007, 00:14
Цитата(MetalFan @ 22.11.2007,  00:11)
может ReadyState проверять?

не работает.

Автор: MetalFan 22.11.2007, 08:41
MrKit, всмысле не работает?

Автор: MrKit 22.11.2007, 11:25
Цитата(MetalFan @  22.11.2007,  08:41 Найти цитируемый пост)
MrKit, всмысле не работает?

В прямом.  Я пробовал проверять
Код

procedure Tf.wbDocumentComplete
HTMLDocument:= wb.Document as IHTMLDocument2;
  if HTMLDocument.readyState = 'complete' then
    ...

но для моего примера это условие выполнялось уже при первом вызове процедуры, а всего она вызывалась три раза при загрузке одной страницы. Очевидно, это зависит от структуры странички.

Автор: ilBEastli 22.11.2007, 16:24
Код

const
  READYSTATE_COMPLETE = $00000004;
...
if WebBrowser.ReadyState = READYSTATE_COMPLETE then

Взято с форума (оригинальное сообщение от http://forum.vingrad.ru/index.php?showtopic=57463&view=findpost&p=1113337)

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