Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

TCppWebBrowser

385
07 декабря 2004 года
SomewherSomehow
477 / / 25.07.2004
Всем доброго времени суток, описываю вкратце суть вопроса. Есть некая функция которая вызывает в цикле метод CppWebBrowser->Navigate, например,
 
Код:
void __fastcall TForm1::Process()
{    
  TStringList * Links = new TStringList();
  .......      

  for (int i = 0; i < Links->Count;i++)      
    CppWebBrowser->Navigate(Links->Strings,NULL,NULL,NULL,NULL);  
}


Требуется прежде чем переходить по следующей ссылке, дождаться выполнения обработчика OnDocumentComplete. Т.е. алгоритм такой: Идем по первой ссылке, дожидаемся пока страница загрузится и выполнится обработчик, идем по второй ссылке, дожидаемся пока страница загрузится и выполнится обработчик и т.д. пока список ссылок не закончится. У кого-нибудь есть идеи как это сделать?
2.3K
07 декабря 2004 года
ART-CODE
134 / / 15.11.2004
Сначала расскажи для чего это нужно
- может
это проще на сокетах делать ..
Страница не всегда может загрузиться в браузер без помощи человека
- например задаст вопрос о необходимости исп. ActiveX и будет стоять и ждать
твоего ответа..
а на сокетах - все совсем просто:

Код:
//-----------------------------------------
//создаем и подключаем сокет
TClientSocket * HTTP=new TClientSocket(this);

    HTTP->Port=StrToIntDef(EditPort->Text,80);
    HTTP->Host=EditHost->Text;
    HTTP->ClientType=ctNonBlocking;  
    HTTP->&#111;&#110;Connect=HTTPConnectionConnect;
    HTTP->&#111;&#110;Error=HTTPConnectionError;
    HTTP->&#111;&#110;Disconnect=HTTPConnectionDisconnect ;
    HTTP->&#111;&#110;Read=HTTPConnectionRead;
    HTTP->&#111;&#110;Write=HTTPConnectionWrite;
    HTTP->Open();
//если нужно ждать результатов ,то либо HTTP->ClientType=ctBlocking ,либо  запускай вертушку while пока не произойдет событие
HTTPConnectionConnect
//-----------------------------------------
//если успешно подключились
void __fastcall THTTPForm::HTTPConnectionConnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
/*
здесь заполняем стороку запроса
и отправляем запрос
в первой строке имя хоста и порт не указываются!!!
"GET /index.htm HTTP/1.0"
Имя хоста и порт пишем в специальном поле
"Host: wwweeerrrttyyy.com:8080"  
*/

String ConnectStr=
"GET /index.htm HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: ru
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)
Host: wwweeerrrttyyy.com:8080"

Socket->SendBuf(ConnectStr.c_str(),ConnectStr.Length());
}
//-----------------------------------------
//когда получили ответ от сервера
void __fastcall THTTPForm::HTTPConnectionRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
int ResLen= Socket->ReceiveLength();
char  * rb=NULL;
rb=new char [ResLen];
 Socket->ReceiveBuf(rb,ResLen);
 //теперь в буфере rb твоя страница или картинка- что хочешь ...
385
07 декабря 2004 года
SomewherSomehow
477 / / 25.07.2004
Я использую компонент TCppWebBrowserарсинга HTML документа в древовидную структуры, так как сам этот компонент использует ком-интерфэйс иэксплорера, то я думаю лучшего механизма разбора хтмл-страницы, в "правильную" структуру а-ля XML, чем тот что предоставляет Микрософт и придумать нельзя. Вот поэтому я использую этот компонент. А нужно примерно следующее -есть список линков , идем на первый линк, загружаем страницу, парсим ее в дерево , получаем результаты, записываем их в файл и далее берем следующий линк и т.д.
Насчет запросов наверное можно как-нить отключить чтоб он не спрашивал "Загружать Active-x".
2.3K
07 декабря 2004 года
ART-CODE
134 / / 15.11.2004
1 - по твоему коду то вроде все просто
(если я ничего не путаю)
Код:
bool complete=false; /* глобальная переменная
 тебе только нужно установить complete=true;
в событии OnDocumentComplete*/

int time_out=50;
int start_time;

void __fastcall TForm1:rocess()
{    
  TStringList * Links = new TStringList();
  .......      

  for (int i = 0; i < Links->Count;i++)
     {
    complete=false;
    start_time=(int)Time();
    CppWebBrowser->Navigate(Links->Strings,NULL,NULL,NULL,NULL);
 
do{
  if(start_time+time_out<(int)Time() )
          {
           ErrTimeOutNavigate();
           break;
          }
  if(comlete)
          {
           ParsingHTML();
           break;
           }

  Application->ProcessMessages();
  }while(1);
      }//for
}


Но лучше вариант с сокетами, а в браузер загружать данные из буфера "rb" - после этого парсить...
Чем лучше "Своя" загрузка страницы с сервера ?

1 - Например ты можешь напороться на страницу, доступ к которой через
пароль - тут браузер выдаст окно ввода пароля (а на сокетах - ты можешь подставить в запрос пароль сам - если,конечно, знаешь его).

2 - Есть еше много случаев, когда браузер будет спрашивать ("ошибка сценария", переход на защищенный сайт "ssl",обращение к пользователю самой страницы через JavaScript и т.д.)

3 - можно быстренько проверить содержание буфера самостоятельно, прежде, чем загружать его в браузер - во многих случаях загрузка будет не нужна (например: сообщение об ошибке поиска страницы 404, отсутствие html тегов вообще и т.д.... )
4 - заляни сюда:
http://www.firststeps.ru/protocol/http/http1.html


385
07 декабря 2004 года
SomewherSomehow
477 / / 25.07.2004
Спасибо большое за информацию к размышлению насчет организации работы через сокеты. Может действительно имеет смысл. По поводу задержки, с бесконечным циклом почему-то не прокатывало, но если сделать так, то прокатывает.
do
{
Application->ProcessMessages();
}
while(CppWebBrowser->ReadyState!=4);

Все, всем спасибо за помощь и отклики!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог