Как всегда загрузить свежую страницу в TWebBrowser?

Я пытаюсь загрузить веб-страницу в TWebBrowser с помощью Browser.Navigate(URL). Тем не менее, браузер не будет заботиться о том, чтобы страница была обновлена ​​онлайн, поэтому, пока я не перезапущу программу, она не покажет новую страницу.

Более конкретный пример: если я перейду на веб-страницу со счетчиком посетителей (как изображение), счетчик будет увеличиваться. Если я отойду от этой страницы, а затем вернусь (без использования Назад), счетчик не увеличится. В 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 загружать настоящую страницу?

2 ответа

Решение

Я полагаю, вы должны использовать 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, нажимаю на гиперссылку, затем снова на Button2 и счетчик новый. Когда я использую только навигацию (URL), счетчик остается тем же.

В VCL, TWebBrowser это обертка для Internet Explorer, особенно IWebBrowser2 интерфейс.

DLCTL_PRAGMA_NO_CACHE это НЕ флаг, который вы можете передать Navigate2(), Прочитайте документацию:

SHDocVw.TWebBrowser

TWebBrowser оборачивает интерфейс IWebBrowser2 из библиотеки объектов и управления документами Microsoft Shell Doc (SHDOCVW.DLL), чтобы позволить вам создать настраиваемое приложение для просмотра веб-страниц или добавить в свои приложения функции просмотра в Интернете, файлах и сети, просмотра документов и загрузки данных.

IWebBrowser2:: Navigate2 Метод

Flags [in] Указатель на VARIANT типа VT_I4 или VT_I2, который указывает комбинацию значений, определенных перечислением BrowserNavConstants.

Перечислимый тип BrowserNavConstants

typedef enum BrowserNavConstants {
    navOpenInNewWindow = 0x1,
    navNoHistory = 0x2,
    navNoReadFromCache = 0x4,
    navNoWriteToCache = 0x8,
    navAllowAutosearch = 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_PRAGMA_NO_CACHE нет в этом списке. Это на самом деле флаг, который вы указываете в качестве выходного значения при реализации обработчика для браузера DISPID_AMBIENT_DLCONTROL имущество. Прочитайте документацию MSDN:

Настройка веб-браузера | Управление загрузкой и выполнением

Элемент управления WebBrowser дает вам контроль над тем, что он загружает, отображает и выполняет. Чтобы получить этот контроль, вам нужно реализовать IDispatch вашего хоста, чтобы он обрабатывал DISPID_AMBIENT_DLCONTROL. Когда создается экземпляр элемента управления WebBrowser, он будет вызывать ваш IDispatch::Invoke с этим идентификатором. Установите pvarResult для комбинации следующих флагов, используя побитовый оператор ИЛИ, чтобы указать ваши предпочтения.
...
• DLCTL_RESYNCHRONIZE и DLCTL_PRAGMA_NO_CACHE: эти флаги вызывают обновление кэша. С DLCTL_RESYNCHRONIZE у сервера будет запрошен статус обновления. Кэшированные файлы будут использоваться, если сервер указывает, что кэшированная информация актуальна. С DLCTL_PRAGMA_NO_CACHE файлы будут повторно загружены с сервера независимо от состояния обновления файлов.
...

Таким образом, вы должны реализовать IDispatch возразить и зацепить его IWebBrowser2 для того, чтобы использовать DLCTL_PRAGMA_NO_CACHE правильно.

В качестве альтернативы, вы можете рассмотреть возможность перехода к TEmbeddedWB, который обрабатывает настройки браузера для вас, и имеет DownloadOptions свойство, которое принимает DLCTL... флаги, в том числе DLCTL_PRAGMA_NO_CACHE,

Browser.EnableCaching:=False;

Browser.Navigate;

Другие вопросы по тегам