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

Delphi 如何始终在TWebBrowser中加载新页面?,delphi,twebbrowser,Delphi,Twebbrowser,我正在尝试使用Browser.Navigate(URL)将网页加载到TWebBrowser中。但是,浏览器不会在意页面是否在线更新,因此只要我不重新启动程序,它就不会显示新页面 一个更具体的例子: 如果我导航到一个有访客计数器(如图)的网页,计数器将递增。如果我离开该页面,然后返回(不使用Back),计数器将不会增加。在Firefox中,它确实是递增的 这是我尝试过的,但不起作用: const DLCTL_PRAGMA_NO_CACHE = $00004000; procedure TBr

我正在尝试使用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的包装,特别是接口

DLCTL\u PRAGMA\u NO\u CACHE
是一个可以传递给
Navigate2()
的标志。阅读文档:

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

标记指向VT_I4或VT_I2类型变量的指针,该变量指定由BrowserNavConstants枚举定义的值的组合

typedef枚举浏览器导航常量{
navOpenInNewWindow=0x1,
navNoHistory=0x2,
navNoReadFromCache=0x4,
navNoWriteToCache=0x8,
NavalowAutoSearch=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\u PRAGMA\u NO\u CACHE
不在该列表中。它实际上是在为浏览器的
DISPID\u AMBIENT\u DLCONTROL
属性实现处理程序时指定为输出值的标志。阅读MSDN文档:

WebBrowser控件使您可以控制它下载、显示和执行的内容。要获得此控制,您需要实现主机的IDispatch,以便它处理DISPID_AMBIENT_dlu控制。当WebBrowser控件实例化时,它将使用此ID调用IDispatch::Invoke。使用按位或运算符将pvarResult设置为以下标志的组合,以指示您的首选项。

•DLCTL_重新同步和DLCTL_PRAGMA_NO_缓存:这些标志导致缓存刷新。通过DLCTL_重新同步,服务器将被询问更新状态。如果服务器指示缓存的信息是最新的,则将使用缓存的文件。使用DLCTL_PRAGMA_NO_缓存,无论文件的更新状态如何,文件都将从服务器重新下载。

因此,您必须实现一个自定义的
IDispatch
对象,并将其挂接到
IWebBrowser2
中,以便正确使用
DLCTL\u PRAGMA\u NO\u缓存


可选地,您可以考虑切换到浏览器,它处理浏览器自定义,并且具有<代码>下行链路< /代码>属性,接受“代码> dLCTL…<代码>标志,包括<代码> dLcTLPracMaMyNoyCasy。

< P>我想您必须使用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主页,点击超链接,然后再次点击按钮2,计数器是新的。当我仅使用导航(URL)时,计数器仍然相同。

浏览器。EnableCaching:=False


浏览器。导航

我可以在导航后打电话给Refresh,但那太过分了。我们都喜欢Ghisler!!!!!!!!我们不是吗?总司令无疑是我最喜欢的节目。吉斯勒先生,非常感谢你的珠宝。也许Embarcadero可以从他身上学到一些东西(比如没有bug的软件是可能的)。