如何在TWebBrowser中始终加载新页面?

时间:2015-02-10 19:46:28

标签: delphi 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加载真实页面的任何想法?

3 个答案:

答案 0 :(得分:7)

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

DLCTL_PRAGMA_NO_CACHE 您可以传递给Navigate2()的标记。阅读文档:

SHDocVw.TWebBrowser

  

TWebBrowser将Microsoft Web Shell对象和控件库(SHDOCVW.DLL)中的IWebBrowser2接口包装起来,以允许您创建自定义Web浏览应用程序或将Internet,文件和网络浏览,文档查看和数据下载功能添加到您的应用。

IWebBrowser2::Navigate2 Method

  

Flags [in]指向类型为VT_I4或VT_I2的VARIANT的指针,指定由 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 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,它为您处理浏览器自定义,并且具有DownloadOptions属性,可接受DLCTL...标记,包括DLCTL_PRAGMA_NO_CACHE。< / p>

答案 1 :(得分:4)

我想你必须使用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,计数器是新的。当我仅使用导航(URL)时,计数器仍然是相同的。

答案 2 :(得分:0)

Browser.EnableCaching:= False;

Browser.Navigate;