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

WebBrowser + ComboBox = ошибка ?


afors

Вопрос

Заметил странное поведение приложения при наличии обоих компонентов (WebBrowser1 и ComboBox1)

1. При раскрытии и закрытии списка ComboBox, браузер обновляет страницу. Причем не важно, перекрывает ли список браузер или нет.

2. Если список хоть раз раскрыли и СВЕРНУЛИ(!), то при закрытии программы вылетает ошибка, которая решается освобождением браузера (WebBrowser1.Free)

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

Но вопрос №1: очень прошу помощи - как сделать, чтобы при раскрытии ComboBox браузер не обновлял страницу?

Прилагаю пример проекта.

WB_CB_Err.zip

PS: Delphi 10.1 Berlin (UPD1 и UPD2)

Изменено пользователем afors
уточнение
Ссылка на комментарий

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

  • 0
2 часа назад, Равиль Зарипов (ZuBy) сказал:

на винде только такое поведение?

попробуй так

WB_CB_Err.rar

На Android нет проблем.

У меня нет доступа к странице по ссылке)

Изменено пользователем afors
Ссылка на комментарий
  • 0
  • Модераторы
22 минуты назад, afors сказал:

У меня нет доступа к странице по ссылке)

не понял почему, но перезалил

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

В другом проекте браузер не отображает ни одну страницу. По твоему примеру закомментировал только одну строчку. Пока вроде все хорошо и раскрытие списка не перезагружает браузер.

procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage);
var
  WBService : IFMXWBService;
begin
  if not (csDesigning in ComponentState) and TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService) then
  begin
    FWeb := WBService.CreateWebBrowser;
    FWeb.SetWebBrowserControl(Self);
//    FWeb.UpdateContentFromControl;
    FWeb.URL := FURL;
    FWeb.Navigate;
  end;
end;

 

Ссылка на комментарий
  • 0
4 часа назад, Равиль Зарипов (ZuBy) сказал:

вот залил

просто закомментировать пересоздание нативного браузера - не самая хорошая идея. Иногда оно действительно необходимо.

Ссылка на комментарий
  • 0
Только что, kami сказал:

просто закомментировать пересоздание нативного браузера - не самая хорошая идея. Иногда оно действительно необходимо.

Тестирую на разных машинах, пока все ок!

Ссылка на комментарий
  • 0
  • Модераторы
7 часов назад, kami сказал:

А оно и будет хорошо до тех пор, пока хендл формы не пересоздастся.

Если мне память не изменяет, хендл пересоздается при изменении стиля (sizeble, single, none...)

Но какого черта Комбобокс отсылает подобное сообщение я не смотрел

Ссылка на комментарий
  • 0
2 часа назад, Равиль Зарипов (ZuBy) сказал:

Но какого черта Комбобокс отсылает подобное сообщение я не смотрел

Комбобокс отсылает сообщение о создании своего окна выпадающего списка.

Ссылка на комментарий
  • 0
  • Модераторы
2 часа назад, kami сказал:

Комбобокс отсылает сообщение о создании своего окна выпадающего списка.

ага, посмотрел логом, думаю правильней будет так

// ZuBy ***
procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage);
var
  WBService: IFMXWBService;
begin
  if not(Sender.ClassNameIs('TCustomPopupForm')) then
    if not(csDesigning in ComponentState) and TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService)
    then
    begin
      FWeb := WBService.CreateWebBrowser;
      FWeb.SetWebBrowserControl(Self);
      FWeb.UpdateContentFromControl;
      FWeb.URL := FURL;
      FWeb.Navigate;
    end;
end;
// *** ZuBy

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

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

Да, для комбобокса помогло. Спасибо.

 

Но от модельных окошек с BorderStyle=None - нет.

Так откуда ноги косяка? Может компонента совсем стала негодная? Или же так же что-то куда-то сообщения ненужные посылает?

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

Натыкался на такую проблему, смог обойти написанием своей копией TWebBrowser. Основное изменение для обхода именно ошибки с CoboBox'ом это в начале процедуры TCustomWebBrowser.FormHandleCreated вставкой кода:

  {$IFDEF MSWINDOWS}
   exit;
  {$ENDIF}

После этого никаких проблем с пересозданием. Правда у меня все браузера создаются в Runtime. Не знаю или это подойдет для нормальной работы с загрузкой из DFM.

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

Это не очень относиться к теме но оставлю это здесь, вдруг кому пригодиться. В моей задаче нужно было еще отслеживать на какой странице находиться пользователь, а как оказалось свойство URL тоже работает некорректно. Пришлось "накостылять" следующее:

В WebBrowser.Android.pas добавляем:

function TAndroidWebBrowserService.originalUrl: string;
begin
  if FJWebBrowser = nil then
    Result := FURL
  else
    Result := JStringToString(FJWebBrowser.getOriginalUrl);
end;

В WebBrowser.Win.pas добавляем:

function TWindowsWebBrowserService.LocationUrl: string;
begin
  Result := FUrl;
  if FInstance <> nil then
    Result := FInstance.LocationURL;
end;

В WebBrowser.pas изменим: 

function TKCustomWebBrowser.GetURL: string;
begin
  if (csDesigning in ComponentState) or (FWeb = nil) then
    Result := FURL
  else
    {$IFDEF MSWINDOWS}
    Result := (FWeb as TWinWBMediator).WB.LocationUrl;
    {$ELSE}
    Result := (FWeb as TAndroidWebBrowserService).originalUrl
    {$ENDIF}
end;

Как результат - корректная работа панели навигации.

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

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

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

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

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

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

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

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

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

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

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