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

Ваш аккаунт

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

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

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

НЕ работает перенаправление

93K
11 февраля 2014 года
relic34ru
1 / / 11.02.2014
Код:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//определим открывающие и закрывающие теги
AnsiString opentag1 = "<ol";
AnsiString opentag2 = "<ul";
AnsiString opentag3 = "<li";
AnsiString closetag1 = "</ol";
AnsiString closetag2 = "</ul";
AnsiString closetag3 = "</li";
bool flgConnected = false;
//уровеноь вложенности списка
int embed=0;
//список содержащий индексы начала и окончания описания тега
TStringList *index = new TStringList;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
 
//для вывода в окно лога
void TForm1::AddLog(AnsiString str){
str.Insert(": ",1);
str.Insert(TDateTime::CurrentDateTime(),1);
memlog->Lines->Add(str);
}
 
 
//---------------------------------------------------------------------------
//функция поиска индекса символа открывания или закрывания тега
int TForm1::Find(int n,bool m){
char s;
if (m) s='<'; else s='>';
int r=mBody->Text.SubString(n,mBody->Text.Length()-n+1).Pos(s);
return r+n-1;
}
 
//функция сканирования документа на теги
int TForm1::FindTag(int n,int t){
//уровень вложенности +1
embed++;
//индекс текущего символа в документе
int i;
int tag=0;
//нумератор для нумеровнных списков
int numer=1;
//цикл по всему документу
for (i=n;i<mBody->Text.Length();i++){
//если текущий символ - открывающий тег (<)
  if (mBody->Text[i]=='<'){
//проверим на тип1
        if (mBody->Text.SubString(i,3)==opentag1)
          {
            tag=20;//<ol
          }
//если это закрывающий тег, причем учитываем что закрывающий тег имеет тот же тип
//что и открывающий, вызвавший его
          else if (((mBody->Text.SubString(i,4)==closetag1)&&(t==20)) ||
                   ((mBody->Text.SubString(i,4)==closetag2)&&(t==21)))
          {
//найдём последний символ закрывающий тег (>)
            i=Find(i,false);
//вернём индекс текущего символа
            return i;
          }
//проверим на тип2
          else if (mBody->Text.SubString(i,3)==opentag2)
          {
            tag=21;//ul
          }
//проверим на тип3 - сама строка списка
          else if (mBody->Text.SubString(i,3)==opentag3)
          {
//проверим что это действительно нужный тег, а не первые буквы другого тега
//например что это <li а не <link
            if (mBody->Text[i+3]==' ' || mBody->Text[i+3]=='>') {
//запомним в список индекс начала строки тега
            index->Add(i-1);
//найдём где тег закрывает скобку >
            i=Find(i,false);
//начало строки с текстом списка
            int from=i+1;
//длину оставшегося текста от текущего индекса до конца документа
            int len = mBody->Text.Length()-from;
//найдём где закрывающий тег </li>
            int to = mBody->Text.SubString(from,len).Pos(closetag3)-1;
//во временную строку скопируем всё что между <li> ... </li>
            AnsiString str=mBody->Text.SubString(from,to);
//индекс переместим на начало закрывающего тега
            i=from+str.Length();
//на конец закрывающего тега
            i=Find(i,false)+1;
//сохраним в спиок конец индекс конца строки тега
            index->Add(i-1);
//уберём из строки все управляющие символы и лишние пробелы
            str=str.Trim();
//подготовим начало строки для вывода на экран
            AnsiString temp;
//если это нумерованый список, то добавим текущий номер
            if (t==20)
              {
              temp.Insert(". ",1);
              temp.Insert(numer++,1);
//если маркированый спиок - то пусть это будет *
              } else if (t==21) {
              str.Insert("* ",1);
              }
//по уровню вложенности добьём слева табуляторами (по 3 пробела на уровень)
            for (int j=1;j<embed;j++)
            {
              temp.Insert("   ",1);
            }
            str.Insert(temp,1);
//добавим строку в экранный ListBox
            lstTags->AddItem(str,0);
            }
          }
//если найден другой тег - его нужно пропустить, найдём где он заканчивается
          else
          {
            i=Find(i,false);
            tag=0;
          }
      }
//если был найден нужный тег ol или ul - рекурсивно вызовем функцию поиска
  if (tag==20 || tag == 21) {
//по выходу из рекурсии переместим текущий индекс
    i=FindTag(Find(i,false),tag);
//уровень вложенности уменьшим
    embed--;
//обнулим тег
    tag=0;
    }
  }
}
 
//по нажатию на кнопку "открыть"
void __fastcall TForm1::bt_openClick(TObject *Sender)
{
//очистим элементы которые будут заполняться
lstTags->Clear();
index->Clear();
//открытие заключим в блок try..catch
mBody->Clear();
try
{
 
nmhttp->Get(eURL->Text);
 
}
catch (...)
{}
}
//---------------------------------------------------------------------------
//при удачном открытии страницы
void __fastcall TForm1::nmhttpSuccess(CmdType Cmd)
{
//скопируем тело полученной страницы в окно просмотра
mBody->Text = nmhttp->Body;
//определим тип выполненной команды
switch (Cmd){
  case CmdGET: statStatus->Panels->Items[1]->Text = "HTTP GET выполнен";
  }
statStatus->Panels->Items[2]->Text = nmhttp->ReplyNumber;
AddLog("Код ответа сервера: "+IntToStr(nmhttp->ReplyNumber));
//вызовем процедуру сканирования документа и вывода нужных тегов
FindTag(1,0);
}
//---------------------------------------------------------------------------
//если возникла ошибка
void __fastcall TForm1::nmhttpFailure(CmdType Cmd)
{
AnsiString message;
switch (Cmd){
  case CmdGET:  message = "HTTP GET не выполнен";
  }
statStatus->Panels->Items[1]->Text=message;
AddLog(message);
}
//---------------------------------------------------------------------------
//в случае удачного установления связи
void __fastcall TForm1::nmhttpConnect(TObject *Sender)
{
flgConnected = true;
statStatus->Panels->Items[0]->Text = "Подключен";
AddLog("Соединение с "+nmhttp->Host+" установлено");
}
//---------------------------------------------------------------------------
//если связь была разорвана
void __fastcall TForm1::nmhttpConnectionFailed(TObject *Sender)
{
statStatus->Panels->Items[0]->Text = "Ошибка подключения";
AddLog("Ошибка подключения");
}
//---------------------------------------------------------------------------
//при отключении от сервера
void __fastcall TForm1::nmhttpDisconnect(TObject *Sender)
{
if (flgConnected == true)
{
statStatus->Panels->Items[0]->Text = "Отключен";
AddLog ("Соединение разорвано");
}
flgConnected = false;
}
//---------------------------------------------------------------------------
//если хост не найден
void __fastcall TForm1::nmhttpInvalidHost(bool &Handled)
{
statStatus->Panels->Items[0]->Text = "Хост не найден";
AddLog("Хост не найден");
}
//---------------------------------------------------------------------------
//при выборе какой-либо строки в списке, выделим в окне с исходным кодом
//html страницы данный элемент
void __fastcall TForm1::lstTagsClick(TObject *Sender)
{
int n = lstTags->ItemIndex;
n=n*2;
mBody->SelStart=index->Strings[n].ToInt();
mBody->SelLength=index->Strings[n+1].ToInt()-mBody->SelStart;
mBody->SetFocus();
}
//---------------------------------------------------------------------------
[COLOR="Red"]void __fastcall TForm1::nmhttpRedirect(bool &Handled)
{
if (MessageDlg("Сайт требует перенаправления на другую страницу. Разрешить?",
        mtConfirmation,TMsgDlgButtons() << mbYes << mbNo,0)==ID_NO) Handled = true;
AddLog("Код ответа сервера: "+IntToStr(nmhttp->ReplyNumber));
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage("HTTP-клиент должен выдать на экране данные обо всех списках, найденных в запрашиваемом файле (теги <li>, <ul>, <ol>).");
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close ();        
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог