![]() |
|
|
![]()
|
|
| Platov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
Уважаемые програмисты помогите пожалуйста добрым кодом.
Разбираюсь сейчас с TWebBrowser. Как работать с объектами загруженной страницы я разобрался. Для этого нужно знать название этого объекта. А вот как получить это название ума не приложу. Уже ковыряюсь несколько недель. Складывается такое впечатление что никто не умеет. Помогите пожалуйста получить список тэгов из TWebBrowser, чтобы выбрать подходящий. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Извлекаете из TWebBrowser Document. Из полученного IDispatch извлекаете IHTMLDocument3 (через QueryInterface). Затем смотрите сюда, там вас будут интересовать в первую очередь объекты и их проперти
|
|||
|
||||
| Platov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
xvr, немного не понятно. Насколько я понял чтобы IDispatch получить нужно знать точное имя.
Или я что-то делаю не так? //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { if(WB->Document) { TComInterface<IHTMLDocument2> pDocument; WB->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDocument); if(pDocument) { TComInterface<IHTMLElementCollection> pColl; pDocument->get_all(&pColl); if(pColl) { TComInterface<IDispatch> pDisp; pColl->item(TVariant("cat_id[spec]"), TVariant(0), &pDisp); if(pDisp) { TComInterface<IHTMLElement> pElement; pDisp->QueryInterface(IID_IHTMLElement, (LPVOID*)&pElement); if(pElement) { s="0.50"; pElement->put_outerText(s.c_bstr()); } } } } } } //--------------------------------------------------------------------------- |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Так, за исключением того, что элемент с именем cat_id[spec] врядли существует.
Имена можно извлечь из IHTMLElementCollection (создать энумератор и перебрать всю коллекцию) |
|||
|
||||
| Platov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
Такой элемент на страничке действительно существует. А в сторону IHTMLElementCollection сейчас покопаю.
Думал что вытянуть текст html будет попроще. |
|||
|
||||
| Platov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
xvr, в get__newEnum() ничего полезного не нашёл, да и в IHTMLElementCollection всё стандартно - знаеш имя - получаеш доступ.
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Попробуй через индекс. Имя все же какое то странное
А на каком из if'ов ломается? |
|||
|
||||
| Platov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
Этот код проходит нормально. Но он имеет смысл только если я перед этим скачаю страничку например стандартными функцыями wininet и найду этот самый cat_id[spec] (вместо spec могут быть другие обозначения а cat_id[ - константа), а я хочу за один проход загрузить страничку, получить html, найти cat_id[ и дальше уже с ним работать.
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Тогда нужно перебрать все элементы (вместо имени подавать их номер в IHTMLElementCollection::item первым параметром). Общее количество элементов возвращает IHTMLElementCollection::get_length). У возвращенных элементов читать атрибут name или id |
|||
|
||||
| Platov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
xvr, попробовал вот так.
//--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { if(WB->Document ) { TComInterface<IHTMLDocument2> pDocument; WB->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDocument); if( pDocument ) { TComInterface<IHTMLElementCollection> pCollection; pDocument->get_all(&pCollection); if( pCollection ) { TComInterface<IDispatch> pDisp; TComInterface<IHTMLElement> pElement; long l; pCollection->get_length(&l); for(int i = 0; i < l; i++) { pCollection->item(TVariant(i), TVariant(0), &pDisp); if( pDisp ) { pDisp->QueryInterface(IID_IHTMLElement, (LPVOID*)&pElement); if( pElement ) { pElement->get_id(&s); Memo1->Lines->Add(s); } } } } } } } //--------------------------------------------------------------------------- компилируется, запускается, но при следующем витке цикла вылетает: --------------------------- Project1.exe --------------------------- Assertion failed: intf==0, file c:\program files\codegear\rad studio\6.0\include\vcl\utilcls.h, line 2327 --------------------------- ОК --------------------------- а потом --------------------------- Project1.exe --------------------------- Abnormal program termination --------------------------- ОК --------------------------- и get_name вроде как нет. |
|||
|
||||
| Platov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
xvr, спасибо большое, что столкнули меня с мёртвой точки.
Правиьный вариант вытягивающий HTML код: //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { if(WB->Document ) { TComInterface<IHTMLDocument2> pDocument; WB->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDocument); if( pDocument ) { TComInterface<IHTMLElementCollection> pCollection; pDocument->get_all(&pCollection); if( pCollection ) { long l; pCollection->get_length(&l); for(int i = 0; i < l; i++) { TComInterface<IDispatch> pDisp; pCollection->item(TVariant(i),TVariant(0), &pDisp); if( pDisp ) { TComInterface<IHTMLElement> pElement; pDisp->QueryInterface(IID_IHTMLElement, (LPVOID*)&pElement); if( pElement ) { pElement->get_innerHTML(&s); Memo1->Lines->Add(s); } } } } } } } Вроде как работает. //--------------------------------------------------------------------------- |
|||
|
||||
| Platov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
Столкнулся с неожиданной проблемой!
Изменяю содержимое input с помощью pElement->put_InnerText(s.c_bstr()); Текст визуально меняется, но страница его не воспринимает. Я так понимаю нужно что-то ещё сделать чтобы страничка думала что с клавиатуры текст ввели, а что именно не знаю. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Попробуй put_Value. InnerText это не совсем то для элементов ввода (input)
|
|||
|
||||
| Platov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
Нет к сожалению put_Value. Есть только InnerText и InnerHTML, но второй ничего не вводит.
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Должен быть. Как выглядит input тэг на HTML странице?
|
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |