簡體   English   中英

如何在TWebBrowser中始終加載新頁面?

[英]How to always load a fresh page in TWebBrowser?

我正在嘗試使用Browser.Navigate(URL)將網頁加載到TWebBrowser中。 但是,瀏覽器不會關心頁面是否在線更新,所以只要我不重啟程序就不會顯示新頁面。

一個更具體的例子:如果我導航到具有訪問者計數器(作為圖像)的網頁,計數器將遞增。 如果我離開該頁面然后返回(不使用Back),計數器將不會遞增。 在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加載真實頁面的任何想法?

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

DLCTL_PRAGMA_NO_CACHE 不是您可以傳遞給Navigate2()的標志。 閱讀文檔:

SHDocVw.TWebBrowser

TWebBrowser從Microsoft的Shell Doc對象和控件庫(SHDOCVW.DLL)中包裝IWebBrowser2接口,以允許您創建自定義Web瀏覽應用程序或向應用程序添加Internet,文件和網絡瀏覽,文檔查看和數據下載功能。

IWebBrowser2 :: Navigate2方法

Flags [in]指向VT_I4或VT_I2類型的VARIANT的指針,指定BrowserNavConstants枚舉定義的值的組合。

BrowserNavConstants枚舉類型

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定制| 控制下載和執行

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

因此,您必須實現自定義IDispatch對象並將其掛鈎到IWebBrowser2才能正確使用DLCTL_PRAGMA_NO_CACHE

或者,您可以考慮切換到TEmbeddedWB ,它為您處理瀏覽器自定義,並具有接受DLCTL...標志的DownloadOptions屬性,包括DLCTL_PRAGMA_NO_CACHE

我想你必須使用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;

它完美無缺(Delphi XE7)。 我看到TC主頁,再點擊超鏈接然后再點擊Button2,計數器是新的。 當我僅使用Navigate(URL)時,計數器仍然是相同的。

Browser.EnableCaching:= FALSE;

Browser.Navigate;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM