为什么使用此代码时 OnRefresh 或 OnPreRefresh 不触发 BeforeNavigate2。根据 this这是一个错误但是如何在Delphi中解决它?我正在使用带有 IE10 的 EmbeddedWB。
EmbeddedWB1.Navigate('http://www.stackoverflow.com');
EmbeddedWB1.Refresh; // doesn't fire BeforeNavigate2
为什么使用此代码时 OnRefresh 或 OnPreRefresh 不触发 BeforeNavigate2。根据 this这是一个错误但是如何在Delphi中解决它?我正在使用带有 IE10 的 EmbeddedWB。
EmbeddedWB1.Navigate('http://www.stackoverflow.com');
EmbeddedWB1.Refresh; // doesn't fire BeforeNavigate2
一个愚蠢问题的相当简单的解决方案。
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;
Navigate2
是一个异步操作。通过跟随它Refresh
,您不会让导航有机会启动和触发BeforeNavigate2
事件。也许,你应该等到NavigateComplete2
被解雇,然后再打电话Refresh
。你到底想达到什么目的?您提到的错误与您的 Delphi 代码无关,它特定于 .NET 并且很久以前就已修复。
[编辑]。我上面说的不正确。IE7 可能是这样,但对于 IE10,BeforeNavigate2
即使NavigateComplete2
callNavigate
后面紧跟Refresh
. 但是,这不会触发WebBrowser 控件OLECMDID_PREREFRESH
或OLECMDID_REFRESH
将命令发送到其站点 COM 对象。我只有在OLECMDID_PREREFRESH
通过右键菜单手动触发刷新时才看到(但仍然没有 OLECMDID_REFRESH
)。这已通过 C++/ATL/VS2012 验证。不幸的是,这无助于回答为什么 Delphi 的行为不同。