Delphi 前导航2&;刷新

Delphi 前导航2&;刷新,delphi,internet-explorer,twebbrowser,delphi-xe4,Delphi,Internet Explorer,Twebbrowser,Delphi Xe4,为什么在使用此代码时,OnRefresh或OnPreRefresh不在导航前激发2。根据 这是一个bug,但是如何在Delphi中解决它呢?我在IE10中使用EmbeddedWB EmbeddedWB1.Navigate('http://www.stackoverflow.com'); EmbeddedWB1.Refresh; // doesn't fire BeforeNavigate2 Navigate2是一个异步操作。通过使用刷新,您没有给导航一个在导航2事件之前启动和触发的机会。也许

为什么在使用此代码时,OnRefresh或OnPreRefresh不在导航前激发2。根据 这是一个bug,但是如何在Delphi中解决它呢?我在IE10中使用EmbeddedWB

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

Navigate2
是一个异步操作。通过使用
刷新
,您没有给导航一个在导航2事件之前启动和触发
的机会。也许,您应该等待
NavigateComplete2
被解雇,然后再调用
Refresh
。你到底想达到什么目的?您提到的bug与您的Delphi代码无关,它是特定于.NET的,很久以前就被修复了


[编辑]。我上面说的是不正确的。对于IE7来说可能是这样,但对于IE10来说,
BeforeNavigate2
NavigateComplete2
都会被解雇(一次),即使
Navigate
调用之后紧接着是
Refresh
。但是,这不会触发WebBrowser控件向其站点COM对象发送的
OLECMDID\u预刷新
OLECMDID\u刷新
命令。当我通过右键单击菜单手动触发刷新时,我只看到
OLECMDID\u预刷新
(但仍然no
OLECMDID\u刷新
)。这已经用C++/ATL/VS2012进行了验证。不幸的是,这无助于回答为什么行为与Delphi不同。

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

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;

您应该提到
Webbrowser1
被声明为
TEmbeddedWB
类型。请编辑您的问题并包含此信息。@TLama啊,我忘了:)在导航2之前根本不会触发刷新。无论何时调用它都无所谓。@user2665920,我在IE7天内处理过类似的问题。我将用一个现代版本验证它,然后回到这里。这与Delphi无关,而是与
IWebBrowser2
接口本身有关。如果调用接口上的
Refresh
方法,则接口不会触发这些事件。不止这些;即使
Busy
标志未设置,甚至
ReadyState
值也未更改。True。我可能误解了@user2665920的问题:在Delphi中好像没有
BeforeNavigate2
事件,尽管有一个调用
EmbeddedWB1.Navigate
,后跟
EmbeddedWB1.Refresh
。真的解决了吗?这正是政府目前应该做的。请参阅该参考页的备注部分…@TLama EmbeddedWB.Refresh/Refresh2不会触发DocumentComplete或OnBeforeNavigate2。这将。嗯,除了
DocumentComplete
beforeavigate2
事件外,
Refresh
Refresh2
方法甚至不会更改
Busy
标志或
ReadyState
值。因此,您的代码可能真的是解决问题的正确方法。[+1]@TLama我们可以聊天吗:)我有一个关于TEmbeddedWB的问题。