Как всегда загрузить свежую страницу в 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()
, Прочитайте документацию:
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
,