Перейти к содержанию
Fire Monkey от А до Я
  • 0

[Win] [TWebBrowser] Как встроить VCL TWebBrowser на FireMonkey форму?


mosesfender

Вопрос

Доброго времени суток!
Поискал по форуму, не нашёл ответа на мой вопрос, поэтому задам таки, хотя, догадываюсь эти грабли не только мне попадались.

Сюжет такой: использую TWebBrowser. Мне хочется, чтобы в Win и Android работало одинаково.
Соответственно, для Win использую ShDocVw, для Android - FMX.WebBrowser.

uses
.......................
{$IFDEF MSWINDOWS}
  SHDocVw, Vcl.Controls
{$ELSE}
  FMX.WebBrowser
{$ENDIF};

Объект создаю в Run Time, создаётся и там и там нормально, но затык в Parent'e. Там стоит TLayout, в котором он и должен нарисоваться. С Android'ом всё в порядке. В Win - либо ошибка при компиляции, либо в случае вот этого текста - AV как раз в строке где назначается Parent. Сам понимаю, что TWinControl(TLayout) - ахинея полная.
 

  if FBrowser = nil then
  begin
    FBrowser := TWebBrowser.Create(nil);
{$IFDEF MSWINDOWS}
    TWinControl(FBrowser).Parent := TWinControl(Self.Layout2);
    FBrowser.Align := alClient;
{$ELSE}
    FBrowser.Parent := Self.Layout2;
    FBrowser.Align := TAlignLayout.alClient;
{$ENDIF}
  end;
  FBrowser.Navigate(AURL);

Как быть с этим? Научите. В FM я совсем новый человек.
Понимаю, что TLayout можно для Win заменить на TPanel. Но к чему тогда вообще все визуальные средства, если всё ручонками в RT создавать...

 
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

Добрый день,

  • TWebBrowser нативный компонент. TLayout, TPanel и тд - не нативные и они не имеют оконного хендла. Значит вы не сможете вставить браузер в наш контрол. 
  • Браузер можно вставить только на форму поверх всего и спозиционировать ваш браузер на основании абсолютных координат TLayout (например). То есть фактически браузер будет лежать на форме, но отображаться в месте расположения TLayout.

Например, код получения хендла окна:

uses
  FMX.Platform.Win;

procedure TForm13.Button1Click(Sender: TObject);
var
  WindowHandle: TWinWindowHandle;
begin
  WindowHandle := WindowHandleToPlatform(Handle);
  // WindowHandle.Wnd <= Handle окна
end;

Затем указать в браузере хендл нашего окна и браузер встроится в наше окно. Пример встраивания TWebBrowser из VCL:

uses
  FMX.Platform.Win;

procedure TForm13.Button1Click(Sender: TObject);
var
  WindowHandle: TWinWindowHandle;
begin
  WindowHandle := WindowHandleToPlatform(Handle);
  FWebBrowser := TWebBrowser.Create(Self);
  FWebBrowser.ParentWindow := WindowHandle.Wnd;
  FWebBrowser.Width := Width;
  FWebBrowser.Height := Height;
  FWebBrowser.Navigate('http://fire-monkey.ru/');
end;

Результат:

post-1-0-86132400-1428055185_thumb.png

 

Дополнительная информация о получении координат FireMonkey контрол в системе координат формы:

  1. О видах координат в FireMonkey и конвертации между ними

Проект с примером: VCLWebBrowserInFMX.zip

Ссылка на комментарий
  • 0

Небольшой комментарий - если вы используете прозрачную форму, и рисуете красивый интерфейс - то, увы, веб броузер не отобразится.

Ссылка на комментарий
  • 0

Небольшой комментарий - если вы используете прозрачную форму, и рисуете красивый интерфейс - то, увы, веб броузер не отобразится.

Логично, т.к. родные Win контролы не умеют рисоваться на Layed окнах. 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...