2012-08-09 108 views
0

我有這樣的代碼:如何等待TWebBrowser加載FOR ... TO ... DO?

for i:=0 to Memo1.Lines.Count-1 do 
     begin 
      while WebBrowser1.Busy do Application.ProcessMessages; 
      WebBrowser1.OleObject.Document.Links.item(cat[i]).click; 
      subcatList; 
     end; 

但WebBrowser1儘管該程序的運行預期幾次。如何啓動WebBrowser1不在後臺或解決方案是什麼?

+0

您能詳細說明* WebBrowser1運行多次*嗎?什麼程序?你的意思是某個事件或你發佈的代碼放在哪裏?請花時間更新您的問題,因爲目前這個問題無法解決。 – TLama 2012-08-09 18:20:51

+0

我在WebBrowser的加載頁面上有一些鏈接,需要點擊FOR循環中的每個鏈接,並等待完成處理第一個鏈接。在Memo1.Lines我有一些鏈接。 subcatlistthiы就是這樣的程序code.Оn這個網站有幾類投資,我收集所有附件 – Stas 2012-08-09 18:51:03

回答

2

您需要實現TWebBrowser,在BeforeNavigate2,一個DocumentComplete和NavigateComplete2

TForm1 = class(TForm) 
    private 
     CurDispatch: IDispatch; 
     FDocLoaded: Boolean;  
    .... 


    procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; 
     const URL, Flags, TargetFrameName, PostData, Headers: OleVariant; 
     var Cancel: WordBool); 
    begin 
     CurDispatch := nil; 
     FDocLoaded := False; 
    end; 

    procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; 
     const URL: OleVariant); 
    begin 
     if (pDisp = CurDispatch) then 
     begin 
     FDocLoaded := True; 
     CurDispatch := nil; 
     end; 
    end; 

    procedure TForm1.WebBrowser1NavigateComplete2(ASender: TObject; const pDisp: IDispatch; 
     const URL: OleVariant); 
    begin 
     if CurDispatch = nil then 
     CurDispatch := pDisp; 
    end; 

的3個事件,現在你可以使用FDocLoaded可變知道如果頁面加載到web瀏覽器

WebBrowser1.Navigate('www.stackoverflow.com'); 
    repeat Application.ProcessMessage until FDocLoaded; 

問候

+0

Application.ProcessMessage或者Application.ProcessMessages? – Stas 2012-08-09 19:33:19

+0

謝謝,刪除我的舊程序後都很好) – Stas 2012-08-09 21:33:37

+0

@TLama這個解決方案的功能是帶頁面的框架嗎? – cadetill 2012-08-10 04:57:12