![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Если кто знает в чём дело, помогите ........ ( IdHTTP ) [D6, WinXP]
ctranik © (2004-07-07 14:48:00)Здравствуйте
У меня стоит delphi 6
Значит история такая , решил написать собственную качалку сайтов.
Решил использовать компонент IdHttp (закладка Indy Misk)
кнопка "Соединение" (Button1Click) и обработчик IdHTTP1Connected работают нормально
но когда доходит дело до обработчика IdHTTP1Disconnected начинаются проблемы
следущего рода :
-если фаил только создан на диске то обработчик IdHTTP1Disconnected не работает хоть убей
а если фаил уже существует на диске то обработчик IdHTTP1Disconnected работает нормально.
Подскажите почему так происходит
Заранее благодарен.
Ниже приводится код проги
//В этой кнопки загружаются параметры и начинается процесс соединения, я назвал эту кнопку "Соединение"
procedure TForm1.Button1Click(Sender: TObject);
label 1;
var d,n:integer;
begin
if (edit1.Text= '')or (edit2.Text='')or (edit3.Text='') then begin
messagedlg('введите параметры',mtinformation,[mbOK],0);
goto 1;
end;
url:=edit3.Text; //URL это глобальная переменная типа string
d:=length(url);
for n:=d downto 1 do
if copy(url,n,1)='/' then url:=copy(url,n+1,d-n) ;
idhttp1.Host:=edit1.Text;
idhttp1.Port:=strtoint(edit2.Text);
idhttp1.Connect;
1:end;
procedure TForm1.IdHTTP1Connected(Sender: TObject);
var
list:TStringList;
Potok:TStringStream;
begin
list:=TStringList.Create;
potok:=TStringStream.Create(DataString); // строковый поток
list.Clear;
filename:=url; // filename глобальная переменная типа string
idhttp1.Get(url,potok); //процедура загрузки страницы в поток
list.Add(potok.DataString); // добавление в ЛИСТ
list.SaveToFile(filename); //сохранение в файле
list.Clear; // очистка
potok.Free; // уничтожение обьекта
list.Free; // уничтожение обьекта
end;
// В Disconnected хочу выяснить остальные ссылки внутри закаченой страницы
procedure TForm1.IdHTTP1Disconnected(Sender: TObject);
var
DataString, s, url1:string;
key,i,a:integer;
f:system.text;
list:TStringList;
begin
list:=TStringList.Create;
if fileexists(filename) then begin // проверяет существует такой фаил на диске
assignfile(f,filename);
reset(f); // открываем фаил
while not eof(f) do begin
readln(f,s) ; //считываем данные
list.Add(s); //загружаем в ЛИСТ
for i:=0 to list.Count-1 do begin
key:=pos('href="',list.Strings[i]); // ищем позицию с которой нчинается слово " href=" "
if key>0 then url1:=copy(list.Strings[i],key+6,length(list.Strings[i])-key);
end;
//в этом цикле находится непосредственно сылка и выводится в Memo1
for a:=0 to length(url1)-1 do begin
if copy (url1,a,1)='"' then url1:=copy(url1,1,a-1);
memo1.Lines.Text:=url1;
end;
end;
closefile(f);
end;
list.free
end;
Reindeer Moss Eater (2004-07-08 10:52:00) [1]OnDisconnected - событие, которое генерится если TCP соединение с веб-сервером закрылось.
Теперь скажи мне (хотя можешь и себе) что делать, если сервер умеет поддерживать KeepAlive и не рвет соединение с твоей качалкой файлов после отдания контента?
Хотя это второстепенный вопрос.
Зачем для анализа полученного контента выкачанного синхроннымметодом завязываться на какое бы то ни было событие?
Если в одной строчке кода есть вызов GET, то ровно на следующейстрочке кода у тебя в руках либо готовый контент либо исключительная ситуация.
Reindeer Moss Eater (2004-07-08 10:47:00) [2]Головой
ctranik (2004-07-08 10:25:00) [3]Reindeer Moss Eater
Ну ты даёш а чем пользоватся если не событиями
Reindeer Moss Eater (2004-07-07 14:59:00) [4]Зачем тебе вообще события понадобились?
Я еще понимаю использование OnWork,OnRedirect, etc.
Но OnDisconnect?
Reindeer Moss Eater (2004-07-07 14:51:00) [5]Боже ж ты мой.