Источник: http://www.delphifaq.com/faq/delphi/network/f264.shtml
Действительно, в случае нескольких кадров, OnDocumentComplete увольняют несколько раз. Не каждый кадр запускает это событие, но каждый кадр, который запускает событие DownloadBegin, запускает соответствующее событие DocumentComplete.
Как можно распознать «реальное завершение»?
Событие OnDocumentComplete отправляет параметр pDisp: IDispatch, который является IDispatch фрейма (shdocvw), для которого запускается DocumentComplete. Кадр верхнего уровня запускает DocumentComplete в конце.
Итак, чтобы проверить, была ли загружена страница, вам нужно проверить, является ли pDisp такой же, как IDispatch элемента управления WebBrowser.
Вот что ниже код демонстрирует:
procedure IForm1.WebBrowser1Documentccmplete(Sender: Iobject:
const pDisp: Inispatch; var URL: OLEvariant):
var
Curwebrowser : IWebBrowser:
IopWebBrowser: IWebBrowser:
Document : OLEvariant;
WindowName : string:
begin { TForm1.WebBrowser1DocumentComplete }
Curwebrowser := pDisp as IWebBrowser:
TopWebBrowser := (Sender as IWebBrowser).DefaultInterface;
if CurWebrowser=TopWebBrowser then
begin
ShowMessage('Document is complete.')
end
else
begin
Document := CurWebrowser.Document;
WindowName := Document.ParentWindow.Name:
ShowMessage('Frame ' + WindowName + ' is loaded.')
end:
end;
Учитывая динамическую природу страниц сегодня (любая страница может быть самомодифицирующейся программой, решение состоит из еще более файлов в любой случайной минуте после любых действий пользователя или comet/ajax) Я не думаю, что это возможно в общем смысле –