Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2012, 21:46   #21
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Цитата:
Почему? Без него как раз задерживаться не будет а будет прямо так пролетать.
А для чего он нужен, если все необходимые действия можно прописать в процедуре
Код:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
               const pDisp: IDispatch; var URL: OLEvariant);

Последний раз редактировалось Базиля; 05.08.2012 в 21:50.
Базиля вне форума Ответить с цитированием
Старый 05.08.2012, 22:18   #22
impulsgraw
Верховный Судья
Пользователь
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Сообщений: 82
По умолчанию

А, ну да, логично))
impulsgraw вне форума Ответить с цитированием
Старый 05.08.2012, 23:42   #23
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Жесть...

impulsgraw, когда тебе приходит посылка по почте, то к тебе приходит почтальон и приносит тебе уведомление о посылке, чтобы ты знал, что тебе пришла посылка и ты мог бы забрать её с почтового отделения. Предположим, прямо сейчас ты ждёшь определённую посылку. Вот ты тогда говоришь: "мне нужно будет сходить на почту (выполнить определённые действия), когда придёт уведомление (вызовется DocumentComplete), но не раньше. Поэтому я сам себе принесу уведомление (сам вызову DocumentComplete) и пойду на почту (выполню свои действия)".

Должно быть очевидно, что от того, что ты что-то там сделал сам, другой код (в данном случае - браузер) от этого свою работу волшебным образом не выполнит (только потому, что ты сказал, что она выполнена).

Что тебе действительно нужно - идти на почту (выполнять действия) по приходу почтальона (вызову события DocumentComplete), например:

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin 
  ListBox1.Tag := 0;
  TakeURL;
end;

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OLEvariant);
begin
  if TakeURL then
    Label4.Caption := IntToStr(ListBox1.Tag)
  else
    label1.caption := 'ГОТОВО!!!';
end;

function TForm1.TakeURL: Boolean;
var
  URL: String;
begin
  if ListBox1.Tag >= ListBox1.Items.Count then
  begin
    Result := False;
    Exit;
  end;

  URL := ListBox1[ListBox1.Tag];
  ListBox1.Tag := ListBox1.Tag + 1;

  WebBrowser1.Navigate(URL);  
  Result := True;
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 05.08.2012, 23:57   #24
impulsgraw
Верховный Судья
Пользователь
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Сообщений: 82
По умолчанию

Код:
var loaded: boolean = false; // флаг "загружна-ли страничка?"

procedure TForm1.Button1Click(Sender: TObject);
begin 
for  i := 0 to ListBox1.Items.Count-1 do begin
loaded := false; // присваиваем флагу "загружна-ли страничка?" знаение false
WebBrowser1.Navigate(URL); // переходим по нужному адресу
{WebBrowser1.Navigate() параллельно остальным процессам загружает страничку в окно webbrowser1 и по окончанию действия САМ(!!!!!) вызывает WebBrowser1DocumentComplete() с нужными параметрами, где флагу "загружна-ли страничка?" присваивается верное значение, что происходит не сразу}
repeat {} until(loaded = true); // ждём окончания загрузки странички - пока флаг "загружна-ли страничка?" равен false, страничка на загружена полностью
Label4.Caption:=IntToStr(i); //... выполняем остальные действия
Application.ProcessMessages();
end;
end;

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
               const pDisp: IDispatch; var URL: OLEvariant);
begin
loaded := true; // присваиваем флагу "загружна-ли страничка?" значение да, чтобы цикл until прервался и выполнение функции Button1Click продолжилось
label1.caption := 'ГОТОВО!!!'; //... выполняем остальные действия
end;
так понятно?
impulsgraw вне форума Ответить с цитированием
Старый 06.08.2012, 09:20   #25
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
TForm1 =class(TForm)
private
  itemindex: integer;
  procedure LoadNextPage;
.....
end;

procedure TForm1.LoadNextPage;
var
  url: string;
begin
  if itemindex<ListBox1.count then begin
    url:=Listbox1.Items[itemindex];
    WEbBrowser1.Navigate(url);
    label1.caption:=url; // индикация текущей (загружаемой!) страницы
  end
  else 
    label1.caption:='ВСЕ!';
  label1.update; 
end;

procedure TForm1.Button1Click(Sender: TObject);
begin 
  itemindex:=0; // указываем что будем грузить начиная с первого(нулевого) индекса
  LoadNextPage; // просим начать загрузку страницы
end;

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
               const pDisp: IDispatch; var URL: OLEvariant);
begin
  // страница получена
  itemindex:=itemindex+1;
  LoadNextPage; // просим начать загрузку следующей
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.08.2012, 11:15   #26
impulsgraw
Верховный Судья
Пользователь
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Сообщений: 82
По умолчанию

Код:
var loaded: boolean = false;

procedure TForm1.Button1Click(Sender: TObject);
begin 
  for  i := 0 to ListBox1.Items.Count-1 do
begin
                 loaded := false;
                 WebBrowser1.Navigate(URL); 
                 label1.caption := 'загрузка';
                 repeat 
                  Application.ProcessMessages();
                  label1.caption := label1.caption + '.';
                  sleep(1000);
                 until(loaded = true);
                 Label4.Caption:=IntToStr(i);
                 Application.ProcessMessages();
 end;
end;

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
               const pDisp: IDispatch; var URL: OLEvariant);
begin
loaded := true;
label1.caption := 'ГОТОВО!!!';
end;
вот вам и индикация со всеми удобствами... там по моему даже у самого компонента есть событие, вызываемое в начале загрузки страницы.
impulsgraw вне форума Ответить с цитированием
Старый 07.08.2012, 07:48   #27
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Ребята все спасибо, каждому поставил по +
P.S evg_m, остановился на твоем варианте
P.P.S impulsgraw, спасибо конечно но пустой цикл, будь то while или repeat, грузят мой проц на 70-80.
bakanaev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать процедуру из другого Unit pavellyba Общие вопросы Delphi 7 01.05.2011 01:35
Не могу вызвать процедуру С ПАРАМЕТРАМИ из другой книги Danver Microsoft Office Excel 4 24.12.2010 12:34
как повторно вызвать процедуру? iiunbreakableii Общие вопросы Delphi 8 24.06.2010 13:32
как вызвать процедуру? ai\ekcah^p Паскаль, Turbo Pascal, PascalABC.NET 4 25.06.2009 11:21
Как вызвать процедуру ??? Marat Помощь студентам 8 02.03.2007 15:11