Ребята помогите сделать перенаправление, почему то не работает. | Код | #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 (); }
|
|