BeforeNavigate2&刷新

时间:2013-08-11 07:47:30

标签: delphi internet-explorer twebbrowser delphi-xe4

为什么OnRefresh或OnPreRefresh在使用此代码时不会触发BeforeNavigate2。根据  this这是一个bug但是如何在Delphi中解决它?我在IE10中使用EmbeddedWB。

EmbeddedWB1.Navigate('http://www.stackoverflow.com');
EmbeddedWB1.Refresh; // doesn't fire BeforeNavigate2 

2 个答案:

答案 0 :(得分:2)

解决愚蠢问题的一个相当简单的解决方案。

const
  DLCTL_PRAGMA_NO_CACHE = $00004000;

procedure Refresh(const Sender: TCustomEmbeddedWB);
var
  Flag: OleVariant;
begin
  Flag:=DLCTL_PRAGMA_NO_CACHE;
  Sender.Navigate(Sender.LocationURL,Flag);
end;

procedure EmbeddedWB1Refresh(Sender: TCustomEmbeddedWB; CmdID: Integer;
  var Cancel: Boolean);
begin
  Cancel:=True;
  Refresh(Sender);
end;

答案 1 :(得分:0)

Navigate2是一个异步操作。通过Refresh跟随它,您不会让导航有机会启动并触发BeforeNavigate2事件。也许,在致电NavigateComplete2之前,您应该等待Refresh被解雇。你到底想要达到什么目的?您提到的错误与您的Delphi代码无关,它特定于.NET并且很久以前就已修复。

<强> [EDITED] 即可。我上面说的不正确。对于IE7来说可能是这样,但对于IE10,BeforeNavigate2NavigateComplete2都会被触发(一次),即使Navigate调用紧跟Refresh。但是,这不会触发WebBrowser控件将OLECMDID_PREREFRESHOLECMDID_REFRESH命令发送到其站点COM对象。当我通过右键单击菜单手动触发刷新时,我才看到OLECMDID_PREREFRESH正在通过(但仍 OLECMDID_REFRESH)。这已通过C ++ / ATL / VS2012验证。不幸的是,这无助于回答为什么Delphi的行为不同。