TWebBrowser с Align, установленным в alClient, не изменится при изменении клиентской области - PullRequest
1 голос
/ 20 января 2011

У меня есть форма с несколькими разделителями и панелями. Посередине находится панель, которая заканчивается TWebBrowser, настроенным для выравнивания alClient.

В прошлом это работало хорошо. Однако в Windows 7 с Internet Explorer 8 размер браузера изменен неправильно. Все остальное (то есть панели) имеют правильный размер, но не веб-браузер. Иногда, когда вы нажимаете в браузере, или чаще, когда вы прокручиваете, браузер будет переходить на правильный размер. Это не происходит в 100% случаев.

Я пытаюсь разобраться с изменением размера напрямую и заставить элемент управления изменить размер. Я не могу найти метод, который имеет какое-либо значение (то есть. Invalidate; .Repaint; .Update;)

TWebBrowser - это элемент управления OLE (ActiveX), который обертывает элемент управления Internet Explorer. Любые идеи о том, как я могу сделать изменение размера?

Обновлен фон:

Я сузил это до случая, когда у меня есть дочерняя форма, когда я меняю родителя, чтобы разместить его внутри другой формы. Мой элемент управления TWebBrowser находится в дочерней форме, которую я использую каждый раз, когда мне нужно показать HTML-документ.

В моей родительской форме у меня есть Сетка, разделитель и панель с сеткой, установленной на Выравнивание по верху, и панелью, настроенной для выравнивания клиента. Моя дочерняя форма (называемая THtmlViewer) имеет родительский элемент для панели. Форма THtmlViewer установлена ​​на alClient, а элемент управления TWebBrowser на дочерней форме также настроен для выравнивания клиента.

Если я что-то делаю в форме изменения размера формы THtmlViewer, я сталкиваюсь с этой проблемой. Все, что находится непосредственно в FormResize или косвенно, используя свойства выравнивания. Тем не менее, если я позвоню изменить размер из родительской формы, все будет хорошо.

Кажется, ключ отключает код изменения размера в форме THtmlViewer. Если я оставляю обработчик OnResize или набор выравнивания, то не имеет значения, что я делаю в родительском объекте, изменение размера выполняется неправильно.

Я все еще не понимаю, зачем это нужно и почему я не могу заставить его обновляться с правильным изменением размера (THtmlViewer).

В качестве дополнительного примечания я также заметил, что Delphi 2007 в Windows 7 имеет точно такую ​​же проблему с «страницей приветствия» в IDE.

Я обошел проблему, добавив метод для установки OnResize дочерней формы равным nil, а затем вызвал мой внутренний ForceResize из обработчика родительского OnResize. Я все еще хотел бы разобраться с этим из формы THtmlViewer и принял бы ответ, который позволит мне избежать этого взлома.

Ответы [ 4 ]

2 голосов
/ 20 января 2011

Чтобы изменить размеры элементов управления, когда их контейнер меняет размер, у вас есть две другие опции, кроме использования "just" свойства Align:

  • Используйте свойство Anchors без свойства Align, то естьустановите для свойства Align значение alCustom или alNone, затем установите привязки в соответствии с вашими потребностями.Поскольку свойство Align является своего рода сокращением для установки якорей, оно зависит от той же обработки выравнивания, поэтому может не работать в вашем случае.

  • Предоставить обработчик для события OnResizeконтейнера, в котором сидит TWebBrowser, и вручную установите высоту и ширину TWebBrowser в соответствии с размерами контейнера (опционально настраиваются для любых полей, которые вы хотите иметь в контейнере).

Тем не менееУ меня нет Windows7, поэтому я не могу ручаться, что это не займет больше времени.

Если ваш TWebBrowser переходит к правильному размеру при прокрутке или щелчке, это означает, что размер элемента управления был измененправильно, просто никогда не получал и не обрабатывал сообщения, чтобы фактически ответить на изменения.

Это может быть потому, что перераспределение элементов управления пытается предотвратить ненужные перерисовки и рекурсии и каким-то образом перепуталось.Использование метода OnResize может затем привести к лучшим результатам, так как он «напрямую обращается к TWebBrowser».

Перекрашивание - это просто сокращение для Invalidate и Update, если только элемент управления не имеет csOpaque в ControlStyle, в этом случае рисование кажется болеенезамедлительной.Таким образом, вы можете попытаться поиграться со свойством Transparent TWebBrowser и / или контейнера, в котором он находится.

Если ничего не помогает, вы можете попытаться отправить WM_PAINT (или аналогичный) напрямую в TWebBrowser.Например, в событии OnResize для TWebBrowser или контейнера, в котором он находится.Обработчик WM_Paint в TWebBrowser вызывает OleDraw, который обращается к ActiveX напрямую с помощью ClientRect, который должен иметь правильные размеры при вызове из события OnResize.

1 голос
/ 26 ноября 2013

У меня была похожая проблема.

Это было решено путем помещения TPanel "под" TWebBrowser и выравнивания веб-браузера по alClient.

1 голос
/ 20 января 2011

Может быть, то же самое решение для этого вопроса работает: Изменение размера проблемы с помощью AcroPDF в Delphi

В OnResize:

if Visible and (WebBrowser1 <> nil) then 
begin
  FocusControl(nil);
  FocusControl(WebBrowser1);
end;
0 голосов
/ 20 января 2011

Я бы попробовал что-то вроде

  • изменение WebBrowser1.Align to alLeft,
  • установка WebBrowser1.Width в WebBrowser1.Width - 1 и
  • установка WebBrowser1.Снова выровняйте alClient

в обработчике OnResize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...