Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить данные из TWebBrowser, Получить данные из TWebBrowser 
:(
    Опции темы
Pcrepair
Дата 4.11.2013, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Добрый день. Есть следующая ситуация:
- форма на форме ТВебБраузер
- в Твебраузер загружается страница поисковика (Яндекс например)
- в поисковике вводится поисковый запрос и нажимается кнопка "Найти" (это все веб-страница, элементы ХТМЛ-кода типа ФОРМ, ввводится и нажимается все вручную)
- поисковик выдает ответ, все как обычно

Необходимо: при нажатии кнопки "Найти" на веб-странице данные из окна ввода на веб-странице перенести в строковую переменную (чтоб не потерялись)
конечно можно сделать все наоборот: в ЕДИТ на форме программы ввести текст запроса, нажать на кнопку на форме программы и передать данные в Твебраузер, но исходя из эргономики это нецелесообразно, снижает удобство работы с программой

Вопрос:
- подскажите в какую сторону искать, информация в инете в основном как передать данные или управление в браузер а не наоборот 
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
Illusion Dolphin
Дата 4.11.2013, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 5
Всего: 63



Я бы делал так:
1) Выполнил скрипт, который найдёт кнопку и подвесит хэндлер к ней на JS (как выполнить скрипт в браузере - (Browser.Document as IHTMLDocument2).parentWindow.execScript )
2) По хэндлеру выполнит код в программе. Это делается как описано тут http://www.delphidabbler.com/articles?article=22


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
kami
Дата 5.11.2013, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(Illusion Dolphin @  4.11.2013,  22:31 Найти цитируемый пост)
2) По хэндлеру выполнит код в программе. Это делается как описано тут http://www.delphidabbler.com/articles?article=22

Емнип, с TEmbeddedWB несколько проще - у него есть событие OnGetExternal.

Большинство поисковиков используют GET-запросы (сейчас посмотрел на Google, Yandex, Wikipedia, Youtube). Не проще на OnBeforeNavigate парсить url и запоминать строку запроса? Просто я уже не в первый раз сталкиваюсь с тем, что WB крайне негативно относится к освобождению памяти за "левыми" скриптами...

Это сообщение отредактировал(а) kami - 5.11.2013, 10:21
PM MAIL WWW   Вверх
Pcrepair
Дата 5.11.2013, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



нет, необходимо только твеббраузер, поскольку там точно:
- есть встроенный интерпретатор скриптов
- есть встроенный декодер кодовой страницы
- ИЕ8, тем более ИЕ10 уже достаточно отработаны
- ну и просто документация с примерами есть

а как там будет на прибамбасах еще толком неизвестно и вообще спо твеббраузер хоть какой то опыт есть
к тому мне тут всего надо ничего:
- при нажатии на кнопку НАЙТИ  на странице поисковика перенести строковые данные из окна ввода на странице(те которые передаются на сервер в ГЕТ) в ЕДИТ на интерфейсе программы (оне потом еще нужны будут)

Если поискать видны два варианта
1. использовать прокси-сервер, не очень желательно, опять время тратить на пустяки
2. использовать событие BeforeNavigate2 твебраузера, типа

Код

procedure TMain.OpenYandexClick(Sender: TObject);
begin  (*F1*)
  Wbbr_SM.Navigate('http://www.yandex.ru/');
end;

потом
Код

procedure TMain.Wbbr_SMBeforeNavigate2(ASender: TObject; const pDisp: IDispatch;
  const URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
  var Cancel: WordBool);
var
I,J:integer;
FormItem: Variant;
SL:TStringList;
begin   (*действия перед перезагрузкой страницы*)
SL:=TStringList.Create;
  if Wbbr_SM.OleObject.Document.all.tags('FORM').Length = 0 then (*ВОТ ТУТ исключение*)
    begin
      Exit;
    end;

    for I := 0 to Wbbr_SM.OleObject.Document.forms.Length - 1 do
  begin
    FormItem := Wbbr_SM.OleObject.Document.forms.Item(I);
    for j := 0 to FormItem.Length - 1 do
    begin
      try
        SL.Add('Name :' + FormItem.Item(j).Name + ' ; ' +
          'ID :' + FormItem.Item(j).ID + ' ; ' +
          'TagName :' + FormItem.Item(j).TagName + ' ; ' +
          'toString :' + FormItem.Item(j).toString + ' ; ' +
          'innerText :' + FormItem.Item(j).innerText + ' ; ' +
          'innerHTML :' + FormItem.Item(j).innerHTML);
      except
        Exit;
      end;
    end;
  end;
  Memo1.Text:=SL.Text;
FreeAndNil(SL);
end;

но тут новая ненужная проблема, выскакивает исключение на код Wbbr_SM.OleObject.Document.all.tags('FORM').Length = 0
именно:
E2171 Variable 'I' inaccessible here due to optimization
E2171 Variable 'Src' inaccessible here due to optimization
E2171 Variable 'Temp' inaccessible here due to optimization (ПЕРЕМ недоступна тут за за оптимизации?)

в procedure GetIDsOfNames(const Dispatch: IDispatch; Names: PAnsiChar; NameCount: Integer; DispIDs: PDispIDList); overload; 
в модуле ComObj

в чем может быть причина?
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
kami
Дата 5.11.2013, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(Pcrepair @  5.11.2013,  12:39 Найти цитируемый пост)
 использовать событие BeforeNavigate2 твебраузера, типа

Зачем в этом событии пытаться достучаться до формы?
Есть get-запрос, у которого один из параметров - как раз то, что введено в поисковую форму.
Цитата(kami @  5.11.2013,  10:21 Найти цитируемый пост)
Не проще на OnBeforeNavigate парсить url и запоминать строку запроса?

для Яндекса: вычленяем параметр text= и декодируем его.

Это сообщение отредактировал(а) kami - 5.11.2013, 15:09
PM MAIL WWW   Вверх
Pcrepair
Дата 5.11.2013, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



похоже для хугля и яндекса по разному и не везде параметр text=
тут некоторые предлагают приделать прокси сервер и через него отправлять запросы в поисковые машины (заодно и сам запрос в прокси-сервере выделять по простому)

никто не в курсе, получится в яндексы, гугле,рамблеры и прочие яххууу!!! через прокси-сервер отсылать поисковые запросы, или опять какая нибуть лажа вылезет?
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
kami
Дата 5.11.2013, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(Pcrepair @  5.11.2013,  18:10 Найти цитируемый пост)
заодно и сам запрос в прокси-сервере выделять по простом

Допустим, ты реализовал прокси. И чем в нем проще выделить поисковый запрос?
Цитата(Pcrepair @  5.11.2013,  18:10 Найти цитируемый пост)
никто не в курсе, получится в яндексы, гугле,рамблеры и прочие яххууу!!! через прокси-сервер отсылать поисковые запросы, или опять какая нибуть лажа вылезет?

Отсылать - получится. Но это - X Y Z.
PM MAIL WWW   Вверх
Pcrepair
Дата 7.11.2013, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



все оказалось проще:
Код

procedure TMain.SaveKeyWordsClick(Sender: TObject);
begin  (*F5*)
if not Assigned(Wbbr_SM.Document) then Exit; (*если документ получен*)
if Wbbr_SM.OleObject.Document.all.tags('FORM').Length <> 0 then
  begin
    Edit1.Text:=Wbbr_SM.OleObject.Document.GetElementByID(WebSearchId).value;
  end
  else
  Exit;  
end;


WebSearchId(ГлобПЕРЕМ) - идентификатор для разных Пм разный, присваивается при загрузке страницы поиска ПМ
типа:
Код

procedure TMain.OpenYaHooClick(Sender: TObject);
begin   (*F4*)
  Label1.Caption:='Loading.......';
  WebSearchId:='p';
  Wbbr_SM.Navigate('http://ru.yahoo.com/');
end;


--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.