При работе с компонентом TWebBrowser в среде разработки Delphi XE7 пользователи иногда сталкиваются с проблемой, когда после загрузки страницы браузер автоматически прокручивается не к началу страницы, а к определенному участку. Это может происходить по разным причинам, например, из-за настроек страницы или самого компонента TWebBrowser. В данной статье мы рассмотрим, как программно заставить TWebBrowser прокрутить страницу к верхнему левому углу после завершения навигации.
Описание проблемы
Пользователи сообщают, что после навигации по TWebBrowser в Delphi XE7, браузер прокручивается не к началу страницы, а к определенной области, что может быть нежелательным поведением. Попытки использовать SendMessage для принудительной прокрутки не приводят к успеху.
Пример кода, который не работает
Один из способов, который пытались использовать разработчики, это отправка сообщений через SendMessage:
Для решения проблемы следует использовать DOM (Document Object Model) для прокрутки, а не отправлять сообщения компоненту TWebBrowser. Пример кода на Object Pascal для Delphi:
var
window: IHTMLWindow2;
begin
window := (WebBrowser1.Document as IHTMLDocument2).parentWindow;
window.scroll(0, 0);
end;
Почему SendMessage не работает
Проблема заключается в том, что TWebBrowser.Handle не является искомым окном Internet Explorer, к которому необходимо отправлять сообщения. Это оболочка (Shell Embedding), содержащая окно Internet Explorer с классом Internet Explorer_Server. Структура окон может зависеть от версии IE и режима отображения документа.
Для отправки сообщений в окно Internet Explorer можно использовать функцию EnumChildWindows, чтобы найти окно с классом Internet Explorer_Server. Вот пример кода, который находит нужное окно:
function EnumChilds(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
const
Server = 'Internet Explorer_Server';
var
ClassName: array[0..24] of Char;
begin
GetClassName(hwnd, ClassName, Length(ClassName));
Result := (ClassName <> Server);
if not Result then
PLongWord(lParam)^ := hwnd;
end;
function GetIEHandle(AWebBrowser: TWebBrowser): HWND;
begin
Result := 0;
EnumChildWindows(AWebBrowser.Handle, @EnumChilds, LongWord(@Result));
end;
После нахождения окна Internet Explorer_Server можно отправить ему сообщения для прокрутки:
var
IEHandle: HWND;
begin
IEHandle := GetIEHandle(WebBrowser1);
if IEHandle <> 0 then
begin
SendMessage(IEHandle, WM_HSCROLL, SB_LEFT, 0);
SendMessage(IEHandle, WM_VSCROLL, SB_TOP, 0);
end;
end;
Однако, как было отмечено выше, данный метод неэффективен. Лучшим решением является использование DOM для прокрутки страницы, как показано в примере кода в начале подтвержденного решения.
Заключение
При работе с TWebBrowser в Delphi XE7 для программной прокрутки страницы к началу следует использовать методы DOM, а не отправку сообщений через TWebBrowser.Handle. Это позволит корректно управлять прокруткой и избежать непредвиденных проблем с отображением страницы.
Проблема заключается в том, что при работе с компонентом `TWebBrowser` в Delphi XE7 браузер не прокручивается к началу страницы после загрузки, и предлагается решение с использованием DOM для принудительной прокрутки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.