• 0
afors

WebBrowser + ComboBox = ошибка ?

Вопросы

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

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

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

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

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

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

WB_CB_Err.zip

PS: Delphi 10.1 Berlin (UPD1 и UPD2)

Изменено пользователем afors
уточнение

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 ответов на этот вопрос

  • 0

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

попробуй так

WB_CB_Err.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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
1 минуту назад, afors сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

Равиль, твой последний вариант работает, спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
10 часов назад, afors сказал:

Равиль, твой последний вариант работает, спасибо!

обращайтесь)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 1

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

  {$IFDEF MSWINDOWS}
   exit;
  {$ENDIF}

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 часа назад, Freezer_86 сказал:

 


  {$IFDEF MSWINDOWS}
   exit;
  {$ENDIF}

 

таки да!. и модальные окошки уже не проблема!

Изменено пользователем POV

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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;

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


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

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