2013-08-11 5 views
1

Почему не OnRefresh или OnPreRefresh fire BeforeNavigate2 при использовании этого кода. Согласно this это ошибка, но как обходить ее в Delphi? Я использую EmbeddedWB с IE10.BeforeNavigate2 & Refresh

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

Следует упомянуть, что 'Webbrowser1' объявлен как' TEmbeddedWB'. Измените свой вопрос и включите эту информацию. – TLama

+1

@TLama А я забыл :) –

ответ

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; 
+0

Действительно решение? Вот что должно делать в настоящее время ['IWebBrowser2 :: Refresh'] (http://msdn.microsoft.com/en-us/library/aa768258 (v = vs.85) .aspx). См. Раздел примечаний этой справочной страницы ... – TLama

+0

@TLama EmbeddedWB.Refresh/Refresh2 не будет запускать DocumentComplete или OnBeforeNavigate2. Это будет. –

+0

@TLama Теперь он будет работать с F5 .. –

0

Navigate2 - асинхронная операция. Следуя за ним с Refresh, вы не даете навигации возможность начать и запустить BeforeNavigate2 событие. Возможно, вам стоит подождать NavigateComplete2, чтобы его уволили, прежде чем позвонить Refresh. Что именно вы пытаетесь достичь? Ошибка, о которой вы говорите, не связана с вашим кодом Delphi, она была специфичной для .NET и была исправлена ​​давно.

[EDITED]. То, что я сказал выше, неверно. Это могло быть правдой для IE7, но для IE10 оба значения BeforeNavigate2 и NavigateComplete2 действительно срабатывают (один раз), даже если сразу Navigate вызывает Refresh. Однако это не вызывает команды OLECMDID_PREREFRESH или OLECMDID_REFRESH, которые будут отправляться с помощью элемента управления WebBrowser на его COM-объект. Я видел только OLECMDID_PREREFRESH, когда я вручную вызвал обновление через меню правой кнопки мыши (но все же noOLECMDID_REFRESH). Это было проверено с помощью C++/ATL/VS2012. К сожалению, это не помогает ответить, почему поведение отличается от Delphi.

+0

Обновить не запускает BeforeNavigate2 вообще. Неважно, когда вы это называете. –

+1

@ user2665920, я столкнулся с аналогичной проблемой еще в IE7 дней. Я собираюсь проверить его с помощью современной версии и вернуться сюда. – Noseratio

+2

Это не связано с Delphi, а с интерфейсом 'IWebBrowser2'. Эти события не запускаются интерфейсом, если вы вызываете на нем метод «Refresh». Там больше, чем это; даже флаг 'Busy' не установлен, и даже значение' ReadyState' не изменяется. – TLama