TWebBrowser: Determine when a page with Frames is completed

TWebBrowser: Determine when a page with Frames is completed

 

comments6 comments. Current rating: 5 stars (3 votes). Leave comments and/ or rate it.

Question:

If I load a web page with TWebBrowser that contains frames then the OnDocumentComplete() is hit for each frame. How can I recognize that the page is completely loaded (no more frames missing)?

Answer:

Indeed, in case of multiple frames, OnDocumentComplete gets fired multiple times. Not every frame fires this event, but each frame that fires a DownloadBegin event will fire a corresponding DocumentComplete event.

How can the 'real completion' be recognized?

The OnDocumentComplete event sends parameter pDisp: IDispatch, which is the IDispatch of the frame (shdocvw) for which DocumentComplete is fired. The top-level frame fires the DocumentComplete in the end.

So, to check if a page is done downloading, you need to check if pDisp is same as the IDispatch of the WebBrowser control.

That's what the code below demonstrates.

 

 
 
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;

               const pDisp: IDispatch; var URL: OLEvariant);

var

  CurWebrowser : IWebBrowser;

  TopWebBrowser: IWebBrowser;

  Document     : OLEvariant;

  WindowName   : string;

begin { TForm1.WebBrowser1DocumentComplete }

  CurWebrowser := pDisp as IWebBrowser; 

  TopWebBrowser := (Sender as TWebBrowser).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;

你可能感兴趣的:(WebBrowser)