Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с TWebBrowser 
V
    Опции темы
Platov
  Дата 31.7.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Уважаемые програмисты помогите пожалуйста добрым кодом.

Разбираюсь сейчас с TWebBrowser.
Как работать с объектами загруженной страницы я разобрался.
Для этого нужно знать название этого объекта. А вот как получить это название ума не приложу.
Уже ковыряюсь несколько недель. Складывается такое впечатление что никто не умеет.
Помогите пожалуйста получить список тэгов из TWebBrowser, чтобы выбрать подходящий.
PM MAIL   Вверх
xvr
Дата 31.7.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Извлекаете из TWebBrowser Document. Из полученного IDispatch извлекаете IHTMLDocument3  (через QueryInterface). Затем смотрите сюда, там вас будут интересовать в первую очередь объекты и их проперти

PM MAIL   Вверх
Platov
Дата 31.7.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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());
                                        }
                                }
                 }
              }
    }
}
//---------------------------------------------------------------------------

PM MAIL   Вверх
xvr
Дата 31.7.2009, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Так, за исключением того, что элемент с именем cat_id[spec] врядли существует.
Имена можно извлечь из IHTMLElementCollection (создать энумератор и перебрать всю коллекцию)

PM MAIL   Вверх
Platov
Дата 31.7.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Такой элемент на страничке действительно существует. А в сторону IHTMLElementCollection сейчас покопаю. 
Думал что вытянуть текст html будет попроще.
PM MAIL   Вверх
Platov
Дата 31.7.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



xvr,  в get__newEnum() ничего полезного не нашёл, да и в  IHTMLElementCollection всё стандартно - знаеш имя - получаеш доступ.   smile 

PM MAIL   Вверх
xvr
Дата 31.7.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Попробуй через индекс. Имя все же какое то странное  smile 
А на каком из if'ов ломается?

PM MAIL   Вверх
Platov
Дата 31.7.2009, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Этот код проходит нормально. Но он имеет смысл только если я перед этим скачаю страничку например стандартными функцыями wininet и найду этот самый cat_id[spec] (вместо spec могут быть другие обозначения а cat_id[ - константа), а я хочу за один проход загрузить страничку, получить html, найти cat_id[ и дальше уже с ним работать.
PM MAIL   Вверх
xvr
Дата 31.7.2009, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Platov @ 31.7.2009,  18:15)
Этот код проходит нормально. Но он имеет смысл только если я перед этим скачаю страничку например стандартными функцыями wininet и найду этот самый cat_id[spec] (вместо spec могут быть другие обозначения а cat_id[ - константа), а я хочу за один проход загрузить страничку, получить html, найти cat_id[ и дальше уже с ним работать.

Тогда нужно перебрать все элементы (вместо имени подавать их номер в IHTMLElementCollection::item первым параметром). Общее количество элементов возвращает IHTMLElementCollection::get_length). У возвращенных элементов читать атрибут name или id

PM MAIL   Вверх
Platov
Дата 31.7.2009, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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 вроде как нет.

PM MAIL   Вверх
Platov
Дата 31.7.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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);

                    }
                 }

               }

            }
        }
    }
}

Вроде как работает. 
//--------------------------------------------------------------------------- 
PM MAIL   Вверх
Platov
Дата 3.8.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Столкнулся с неожиданной проблемой!

Изменяю содержимое input с помощью pElement->put_InnerText(s.c_bstr());

Текст визуально меняется, но страница его не воспринимает. Я так понимаю нужно что-то ещё сделать чтобы страничка думала что с клавиатуры текст ввели, а что именно не знаю.  smile 
PM MAIL   Вверх
xvr
Дата 3.8.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Попробуй put_Value. InnerText это не совсем то для элементов ввода (input)

PM MAIL   Вверх
Platov
Дата 3.8.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нет к сожалению put_Value. Есть только InnerText и InnerHTML, но второй ничего не вводит.
PM MAIL   Вверх
xvr
Дата 3.8.2009, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Должен быть. Как выглядит input тэг на HTML странице?

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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