Как прервать прогресс навигации по TWeBrowser? - PullRequest
3 голосов
/ 23 января 2012

Delphi 6

У меня есть код, который загружает элемент управления Webbrowser (TEmbeddedWB) через локальный файл HTML. Он отлично работает по большей части, и в течение довольно многих лет и тысяч пользователей.

Но есть определенная страница конечного пользователя, которая имеет скрипт , который выполняет что-то вроде Google translate , что заставляет страницу загружаться очень долго, до 65 секунд.

Я пытаюсь заставить браузер остановить / прервать / выйти , чтобы страница могла быть перезагружена или чтобы приложение могло выйти. Тем не менее, я не могу остановить это. Я пытался остановить, загружая около: пусто, но, похоже, не останавливается.

wb.Navigate(URL, EmptyParam, EmptyParam, EmptyParam, EmptyParam );
while wb.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages;

Приложение остается в цикле ReadyState (ReadyState = READYSTATE_LOADING) довольно долгое время, до 65 секунд.

У кого-нибудь есть предложения?

1 Ответ

3 голосов
/ 24 января 2012

Если вы используете TWebBrowser, то TWebBrowser.Stop или, если хотите, IWebBrowser2.Stop - это правильная функция, подходящая для этой цели.Попробуйте выполнить этот небольшой тест и посмотрите, останавливает ли он переход к вашей странице (если навигация занимает больше 100 мс:)

procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled := False;
  WebBrowser1.Navigate('www.example.com');
  Timer1.Interval := 100;
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if WebBrowser1.Busy then
    WebBrowser1.Stop;
  Timer1.Enabled := False;
end;

Если вы говорите о TEmbeddedWB затем посмотрите на функцию WaitWhileBusy вместо ожидания изменения ReadyState.В качестве единственного параметра вы должны указать значение времени ожидания в миллисекундах.Затем вы можете обработать событие OnBusyWait и прервать навигацию, если необходимо.

procedure TForm1.Button1Click(Sender: TObject);
begin
  // navigate to the www.example.com
  EmbeddedWB1.Navigate('www.example.com');
  // and wait with WaitWhileBusy function for 10 seconds, at
  // this time the OnBusyWait event will be periodically fired;
  // you can handle it and increase the timeout set before by
  // modifying the TimeOut parameter or cancel the waiting loop
  // by setting the Cancel parameter to True (as shown below)
  if EmbeddedWB1.WaitWhileBusy(10000) then
    ShowMessage('Navigation done...')
  else
    ShowMessage('Navigation cancelled or WaitWhileBusy timed out...');
end;

procedure TForm1.EmbeddedWB1OnBusyWait(Sender: TEmbeddedWB; AStartTime: Cardinal;
  var TimeOut: Cardinal; var Cancel: Boolean);
begin
  // AStartTime here is the tick count value assigned at the
  // start of the wait loop (in this case WaitWhileBusy call)
  // in this example, if the WaitWhileBusy had been called in
  // more than 1 second then
  if GetTickCount - AStartTime > 1000 then
  begin
    // cancel the WaitWhileBusy loop
    Cancel := True;
    // and cancel also the navigation
    EmbeddedWB1.Stop;
  end;
end;
...