Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Помогите с WebBrowser


Автор: AlexLogos 9.2.2011, 20:02
Народ, здравствуйте опять  smile . Я реализовал в проге механизм, заполнения формы и нажатия на кнопку на форме. Далее по идее браузер должен сформировать строку с параметрами и передать на сервер. Для того чтоб узнать что это за URL я пишу
Код

WebBrowBtnClick(WebBrow,Searchers[j].SButton) //Жму на кнопку
ShowMessage(WebBrow.LocationURL);

Но в результате получаю еще предыдущий адрес. Толи браузер еще не завершыл обработку, то ли еще что-то. Пробыва узнавать не закончил ли браузер загрузку и писал
Код

WebBrowBtnClick(WebBrow,Searchers[j].SButton) //Жму на кнопку
while WebBrow.ReadyState<>READYSTATE_COMPLETE {или WebBrow.Busy} do
  Application.ProcessMessages; 
ShowMessage(WebBrow.LocationURL);

Всеравно получаю старый адрес. Как отследить когда можна забрать новый адрес?

Автор: cat512 10.2.2011, 03:08
Очевидно твоя функция криво работает
Используй Navigate, должно работать

Автор: MetalFan 10.2.2011, 16:08
Я в свое время пользовался TEmbeddedWB назначал событие OnDocumentComplete и OnNavigateError, в нем выставлялся флаг, что мол страница загружена или ошибка произошла.
А цикл ожидания загрузки страницы выглядел как ожидания взведения одного из флагов.

Автор: AlexLogos 10.2.2011, 16:51
MetalFan, твой способ мог бы помочь. но браузер и процедура - это разные модули. Если я укажу в юзес модуль с браузером и налажу с ним нормальную работу, я потеряю универсальность модуля который работает с браузером. Можна в принципе решить этот вопрос через флаг, но тогда надо  будет этот флаг определить в отдельном классе чтоб получить ссылочный тип, но там тоже мороки куча...

Автор: MetalFan 10.2.2011, 17:07
AlexLogos, ну мое дело предложить вариант. Не нравится - сделай по своему)

Автор: AlexLogos 10.2.2011, 17:10
Попробовал так как написал - создал клас, в нем переменная Boolean. Клас глобальный для модуля с браузером и как параметр для процедуры из другого модуля. Всеравно не то...

Добавлено через 51 секунду
Но, всеравно спасибо))))

Автор: MetalFan 10.2.2011, 17:14
Цитата(AlexLogos @  10.2.2011,  17:10 Найти цитируемый пост)
Всеравно не то...

а в чем проблема? OnDocumentComplete не вызывается? или вызывается раньше, чем надо?

Автор: AlexLogos 10.2.2011, 17:18
Всеравно раньше чем надо...

Автор: AlexLogos 10.2.2011, 18:02
Народ, еще вопрос: когда динамически создаю WebBrowser, загружаю страницу методом Navigate потом програмно не могу заполнить форму. Процедура для заполнения формы работает только когда браузер виден на форме (даже если на другой вкладке допустим PageControl'а). Как починить?

Автор: MetalFan 10.2.2011, 18:19
AlexLogos, да, без назначенного parent'а ВебБраузер работает некорректно - факт.
Назначь парента, а visible в false выстави.

Автор: AlexLogos 10.2.2011, 18:24
Parent у WebBrousera - Read-Only Property...

Добавлено через 4 минуты и 35 секунд
Даже если создаю отдельную форму и ее делаю оунером при создании браузера - не работает. мало того браузер не отображается...
Код


var
WebBrow:TWebBrowser;
FM:TForm;
....
    FM:=TForm.Create(Self);
    with FM do
      begin
        Position:=poDesktopCenter;
        Width:=500;
        Height:=300;
        //Show;
      end;

    WebBrow:=TWebBrowser.Create(FM);
    //WebBrow.Parent:=FM;
    WebBrow.Visible:=True;
    WebBrow.Show;
    FM.Show;

Автор: AlexLogos 11.2.2011, 17:20
Нашел в сети решение как присвоить Парента Браузеру
Код

TWinControl(WebBrow).Parent := FM;

После этого все заработало как часики, в том смысле что браузер появился на форме и позволил заполнить форму.
Решение к начальной задаче еще не найдено, но уже есть промежуточное которое можна начальству показать  smile.

Автор: AlexLogos 11.2.2011, 17:56
В общем чтоб сделать задержку я написал код:
Код

var d:cardinal;
.....
              d:=SecondOf(Now);
              while (SecondOf(Now)-d)<1 do
                Application.ProcessMessages;
.....

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

Автор: cat512 11.2.2011, 18:33
Цитата(AlexLogos @ 11.2.2011,  17:56)
В общем чтоб сделать задержку я написал код:
Код

var d:cardinal;
.....
              d:=SecondOf(Now);
              while (SecondOf(Now)-d)<1 do
                Application.ProcessMessages;
.....

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

Хреновое решение. У тебя вся логика поломается, как только нагрузка на сервер увеличится.Тот код, который у тебя был (проверка COMPLETE)- рабочий. Я использовал подобный в связке с navigate.
В любом случае, для корректной работы, тебе надо привязываться к состоянию броузера.

Автор: AlexLogos 11.2.2011, 18:36
Вообще-то продолжение кода...
Код

 d:=SecondOf(Now);
              while (SecondOf(Now)-d)<1 do
                Application.ProcessMessages;
//Жду завершения загрузки
              while WebBrow.Busy do
                Application.ProcessMessages;
//Получаю код страницы
              GetHTMLCode(WebBrow,tempResult);
//Обработка

Тоесть то же самое...

Добавлено @ 18:37
Задержка нужна чтоб браузер обработал форму, создал новый Get-запрос и отправил на сервак, и ждет ответа...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)