Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2015, 13:18   #1
Exlife
 
Регистрация: 02.06.2015
Сообщений: 5
По умолчанию Delphi. Работа с браузером.

Всем привет!
Вобщем, есть код на Delphi, который в автоматическом режиме просматривает несколько страниц результата поиска в Яндексе, и при этом с каждой странице в отдельное текстовое поле выписывает ссылки, отфильтрованные по определенному признаку.
Проблема в том, что на моем среднестатистическом ноуте эта прога работает корректно, а вот на тормознутом ноуте 2008 года покупки несколько страниц результатов просто пропускаются, не обработавшись, а иногда просто вылетает ошибка. По всей видимости, процедура, где ссылки фильтруются и записываются в то текстовое поле, выполняется раньше чем прогружается страница в браузере.
Проблему частично решила вот такая ерунда:
Код:
begin
   wbBrows2.Navigate(Query((i),edtURLEdit2.Text));
  Application.ProcessMessages;
  Sleep(4000);
    Application.ProcessMessages;
    btnLinks.Click;
  end;
Можно ли как то решить эту проблему более грамотно, чтобы на быстрых компах все работало быстро, без искусственных пауз, но и на слабых все работало корректно и без ошибок?
Можно ли как то запустить процесс обработки ссылок только после полной загрузки страницы?
Exlife вне форума Ответить с цитированием
Старый 02.06.2015, 13:31   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

можно. Для этого надо рассказать КАК идет просмотр (в том числе и как (когда) запускается анализ, а не как имитируем ожидание окончания просмотра.
Для того чтобы узнать что что-то произошло есть события
например завершение загрузки страницы OnComplete.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.06.2015, 13:52   #3
Exlife
 
Регистрация: 02.06.2015
Сообщений: 5
По умолчанию

Анализ как раз и запускается через
Код:
btnLinks.Click;
А вот сам алгоритм обработки, если нужен:
Код:
procedure TMainForm.btnLinksClick(Sender: TObject);
var a,b,q,w,e,i:integer;
s,g:string;
begin
 Application.ProcessMessages;
     a:=wbBrows2.OleObject.Document.Links.length;
     for i:=0 to a-1 do
     begin
       q:=0;
       w:=0;
       e:=0;
       s:=wbBrows2.OleObject.Document.Links.Item(i);
       b:=Pos('yandex',s);
       b:=b+Pos('mail',s);
       b:=b+Pos('google',s);
       b:=b+Pos('bing',s);
       if b=0 then
       begin
         s:=copy(s,9,Length(s)-8);
         q:=Pos('/',s);
         if Length(s)=q then
         begin
         if Pos('www',wbBrows2.OleObject.Document.Links.Item(i))<>0 then w:=1;
         s:=Copy(s,Pos('.',s)+1,Length(s)-Pos('.',s));
         if Pos('.',s)=0 then w:=w+1;
         if w<>0 then
         mmoLinks.Lines.Add(wbBrows2.OleObject.Document.Links.Item(i))
         end;
       end;
     end;

end;
Не могли бы Вы поподробней рассказать, как в Delphi использовать OnComplete? По идее, весь вышенаписанный код и должен срабатывать только после загрузки страницы...

Последний раз редактировалось Exlife; 02.06.2015 в 13:55.
Exlife вне форума Ответить с цитированием
Старый 02.06.2015, 14:19   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

F1 Delphi7 TWebBrowser Events OnDocumentComplete Example
Цитата:
This example shows how to detect when a document is completely loaded, even if it includes multiple frames. Only the final OnDocumentComplete event passes the same Dispatch interface as the OnNavigateComplete event handler.

Код:
var

  CurDispatch: IDispatch; {save the interface globally }

procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);

begin
  if CurDispatch = nil then
    CurDispatch := pDisp; { save for comparison }
end;
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
  if (pDisp = CurDispatch) then
  begin
    Beep; {the document is loaded, not just a frame }
    CurDispatch := nil; {clear the global variable }
  end;
end;
а так же поиск по форуму и поиск в интернете.(наверное опять же придем сюда).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 02.06.2015 в 14:21.
evg_m вне форума Ответить с цитированием
Старый 02.06.2015, 15:27   #5
Exlife
 
Регистрация: 02.06.2015
Сообщений: 5
По умолчанию

Спасибо, но как оказалось моя проблема решается просто:
Код:
while wbBrows2.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages();
Exlife вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с браузером. AngelNine Общие вопросы Delphi 2 05.04.2015 09:50
Работа с браузером JGalt Работа с сетью в Delphi 8 28.07.2013 19:05
Работа с браузером sashaxD Общие вопросы Delphi 7 16.09.2011 14:18
Работа с браузером JamS007 Общие вопросы Delphi 2 22.04.2009 18:17