2015-02-10 26 views
2

我想使用Browser.Navigate(URL)將網頁加載到TWebBrowser中。但是,瀏覽器不會在意網頁已更新,只要我不會重新啓動程序,它就不會顯示新的網頁。如何在TWebBrowser中始終加載新頁面?

一個更具體的例子: 如果我導航到有訪客計數器的網頁(如圖),計數器將遞增。如果我離開那個頁面,然後返回(不使用後退),計數器將不會增加。在Firefox中,它確實增加了。

這是我試過了,不行的:

const 
    DLCTL_PRAGMA_NO_CACHE = $00004000; 

procedure TBrowserFrm.LoadURL(URL: string); 
var 
    Flag: OleVariant; 
begin 
    Flag:=DLCTL_PRAGMA_NO_CACHE; 
    Browser.Navigate(URL, Flag); 
end; 


procedure TBrowserFrm.LoadURL(URL: string); 
var 
Flags: OleVariant; 
begin 
Flags := 'navNoHistory, navNoReadFromCache, navNoWriteToCache'; 
Browser.navigate2(URL, Flags); 
end; 

關於如何使TWebBrowser加載實際頁面任何想法?

+0

我可以在導航後調用刷新,但這將是矯枉過正。 – Ampere 2015-02-10 19:58:43

+1

VCL或FireMonkey? – 2015-02-10 20:11:34

+0

這是一個VCL應用程序。 – Ampere 2015-02-10 20:11:58

回答

3

我想你必須使用4而不是$ 00004000。

由於我使用www.ghisler.com(計數器是在底部),我可以使用

procedure TForm2.Button2Click(Sender: TObject); 
var 
    Flags: OLEVariant; 

begin 
    Flags:=4; //NavNoReadFromCache 
    WebBrowser1.Navigate('http://www.ghisler.com/', Flags); 
end; 

和它完美的作品(德爾福XE7)。我看到TC主頁面,再點擊超鏈接,然後在Button2上,計數器是新的。當我僅使用Navigate(URL)時,計數器仍然相同。

+0

謝謝。這解決了問題。 – Ampere 2015-02-19 21:22:35

+0

我們都愛Ghisler !!!!!!!!我們不?總指揮官毫無疑問是我最喜歡的節目。吉斯勒先生,感謝那首飾。也許Embarcadero可以從他那裏學到一些東西(比如沒有bug的軟件是可能的)。 – Ampere 2015-02-19 21:25:32

7

在VCL中,TWebBrowser是Internet Explorer的包裝,特別是IWebBrowser2接口。

DLCTL_PRAGMA_NO_CACHE不是一個國旗,你可以傳遞給Navigate2()。閱讀文檔:

SHDocVw.TWebBrowser

TWebBrowser包從微軟的殼牌文檔對象和控制庫(SHDOCVW.DLL)允許您創建一個定製的Web瀏覽應用程序或添加互聯網,文件和IWebBrowser2接口網絡瀏覽,文檔查看和數據下載功能。

IWebBrowser2::Navigate2 Method

標誌[in]一個指針VT_I4類型或VT_I2的變體,它指定由BrowserNavConstants枚舉中定義的值的組合。

BrowserNavConstants Enumerated Type

typedef enum BrowserNavConstants { 
    navOpenInNewWindow = 0x1, 
    navNoHistory = 0x2, 
    navNoReadFromCache = 0x4, 
    navNoWriteToCache = 0x8, 
    navAllowAutosearch = 0x10, 
    navBrowserBar = 0x20, 
    navHyperlink = 0x40, 
    navEnforceRestricted = 0x80, 
    navNewWindowsManaged = 0x0100, 
    navUntrustedForDownload = 0x0200, 
    navTrustedForActiveX = 0x0400, 
    navOpenInNewTab = 0x0800, 
    navOpenInBackgroundTab = 0x1000, 
    navKeepWordWheelText = 0x2000, 
    navVirtualTab = 0x4000, 
    navBlockRedirectsXDomain = 0x8000, 
    navOpenNewForegroundTab = 0x10000 
} BrowserNavConstants; 

正如你所看到的,DLCTL_PRAGMA_NO_CACHE不在名單上。它實際上是一個標誌,您在爲瀏覽器的DISPID_AMBIENT_DLCONTROL屬性實施處理程序時指定爲輸出值。閱讀MSDN文檔:

WebBrowser Customization | Controlling Download and Execution

WebBrowser控件使您能夠控制它的下載,顯示和執行。要獲得此控制權,您需要實現主機的IDispatch,以便處理DISPID_AMBIENT_DLCONTROL。當WebBrowser控件被實例化時,它會用這個ID調用你的IDispatch :: Invoke。使用按位或運算符將pvarResult設置爲以下標誌的組合,以指示您的首選項。
...
•DLCTL_RESYNCHRONIZE和DLCTL_PRAGMA_NO_CACHE:這些標誌導致高速緩存刷新。使用DLCTL_RESYNCHRONIZE時,服務器將被要求更新狀態。如果服務器指示緩存的信息是最新的,則將使用緩存的文件。使用DLCTL_PRAGMA_NO_CACHE時,無論文件的更新狀態如何,都將從服務器重新下載文件。
...

所以,你必須實現自定義IDispatch對象並把它掛到IWebBrowser2爲了正確使用DLCTL_PRAGMA_NO_CACHE

或者,你可能會考慮改用TEmbeddedWB,它處理瀏覽器定製爲你,並具有接受DLCTL...標誌,包括DLCTL_PRAGMA_NO_CACHE一個DownloadOptions屬性。

相關問題