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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2012, 11:43   #1
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию Как циклу дождаться выполнения процедуры

Такая вот загвоздка. Есть цикл который вызывается нажатием кнопки
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
   ProgressBar1.Min := 1;
   ProgressBar1.Max := ListBox1.Items.Count ;
       i:=0;
        for I := 0 to ListBox1.Items.Count - 1 do
          begin
             ProgressBar1.Position := i+1;
              Application.ProcessMessages();
               URl:=S_Edit1+S_Edit2+ListBox1.Items[i]+S_Edit4;
                WebBrowser1.Navigate(URL);
                 Label4.Caption:=IntToStr(i+1);
                  Application.ProcessMessages();
         end;
 end;
При помощи данный кнопки открываться сайт в компоненте WebBrowser,
В ListBox1 хранятся слова для поиска, URL это адрес открываемой страницы,
когда сробатывает WebBrowser1.Navigate(URL); вызывается событие
Код:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; const URL: OleVariant);
begin
if string(url)=URL then
  begin
   parsing(Memo2 ,WebBrowser1 ,Memo1 , Label8 ,Label10 );
  end;
end;
Оно нужно что бы дождаться окончания загрузки страницы, после чего в этом событии вызывается функция parsing, она парсит страницу.

Суть вот в чем, как мне сделать что бы цикл
Код:
for I := 0 to ListBox1.Items.Count - 1 do
          begin
             ProgressBar1.Position := i+1;
              Application.ProcessMessages();
               URl:=S_Edit1+S_Edit2+ListBox1.Items[i]+S_Edit4;
                WebBrowser1.Navigate(URL);
                 Label4.Caption:=IntToStr(i+1);
                  Application.ProcessMessages();
         end;
дожидался пока выполнится procedureTForm1.WebBrowser1Document Complete , а как выполниться продолжал работать (увеличивал i).
Надеюсь понятно объяснил, если нет говорите, то опишу еще подробнее и яснее
bakanaev вне форума Ответить с цитированием
Старый 03.08.2012, 12:08   #2
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Код:
var
loadcomplete:boolean=false;
......
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; const URL: OleVariant);
begin
loadcomplete:=true;
if string(url)=URL then
  begin
   parsing(Memo2 ,WebBrowser1 ,Memo1 , Label8 ,Label10 );
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
   ProgressBar1.Min := 1;
   ProgressBar1.Max := ListBox1.Items.Count ;
       i:=0;
        for I := 0 to ListBox1.Items.Count - 1 do
          begin
if loadcomplete then begin
loadcomplete:=false;
             ProgressBar1.Position := i+1;
              Application.ProcessMessages();
               URl:=S_Edit1+S_Edit2+ListBox1.Items[i]+S_Edit4;
                WebBrowser1.Navigate(URL);
                 Label4.Caption:=IntToStr(i+1);
                  Application.ProcessMessages();
exit;
end else begin
dec(I);
         end;
 end;
end;
Кольша вне форума Ответить с цитированием
Старый 03.08.2012, 12:31   #3
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Все бы хорошо, но только вот Делфи говорит нельзя менять i в теле цикла
[DCC Error] Unit1.pas(197): E2081 Assignment to FOR-Loop variable 'i'
Может еще идеи есть?
bakanaev вне форума Ответить с цитированием
Старый 03.08.2012, 12:45   #4
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Воспользуйтесь циклом while.

Вообще честно говоря, что-то плохо я понял мысль товарища Кольша
Код:
if loadcomplete then begin
При таком условии мы никогда и не зайдем в тело цикла.
Код:
exit;
И для чего собственно выход стоит, насколько я понял автору нужно продолжать работу цикла до его конца.

Последний раз редактировалось Базиля; 03.08.2012 в 13:00.
Базиля вне форума Ответить с цитированием
Старый 03.08.2012, 13:03   #5
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
Воспользуйтесь циклом while.
А можно кодом? А то я не особо представляю куда его там засунуть
Цитата:
Сообщение от Базиля Посмотреть сообщение
И для чего собственно выход стоит, насколько я понял автору нужно продолжать работу цикла до его конца.
Да Вы правы, надо до конца))
bakanaev вне форума Ответить с цитированием
Старый 03.08.2012, 13:13   #6
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

да затупил) while or repeat в помощь
Кольша вне форума Ответить с цитированием
Старый 03.08.2012, 13:20   #7
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Есть такой вариант действий:
Код:
var
loadcomplete:boolean; //объявили глобальную переменную
......
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; const URL: OleVariant);
begin
if string(url)=URL then
  begin
   parsing(Memo2 ,WebBrowser1 ,Memo1 , Label8 ,Label10 );
  end;
loadcomplete:=true;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
....
loadcomplete:=true;
  i:=0;
while i <> ListBox1.Items.Count - 1 do
if loadcomplete then
   begin
      loadcomplete:=false;
      ProgressBar1.Position := i+1;
      Application.ProcessMessages();
      URl:=S_Edit1+S_Edit2+ListBox1.Items[i]+S_Edit4;
      WebBrowser1.Navigate(URL);
      Label4.Caption:=IntToStr(i+1);
      Application.ProcessMessages();
      inc(i);
   end;
....
end.
Базиля вне форума Ответить с цитированием
Старый 03.08.2012, 13:56   #8
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Базиля, Спасибо
bakanaev вне форума Ответить с цитированием
Старый 03.08.2012, 16:43   #9
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
Есть такой вариант действий:
Код:
var
loadcomplete:boolean; //объявили глобальную переменную
......
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; const URL: OleVariant);
begin
if string(url)=URL then
  begin
   parsing(Memo2 ,WebBrowser1 ,Memo1 , Label8 ,Label10 );
  end;
loadcomplete:=true;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
....
loadcomplete:=true;
  i:=0;
while i <> ListBox1.Items.Count - 1 do
if loadcomplete then
   begin
      loadcomplete:=false;
      ProgressBar1.Position := i+1;
      Application.ProcessMessages();
      URl:=S_Edit1+S_Edit2+ListBox1.Items[i]+S_Edit4;
      WebBrowser1.Navigate(URL);
      Label4.Caption:=IntToStr(i+1);
      Application.ProcessMessages();
      inc(i);
   end;
....
end.
Мда.... Программа зависает, потом ее отключить можно только через диспетчер задач.
bakanaev вне форума Ответить с цитированием
Старый 03.08.2012, 16:45   #10
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Хех, вопрос решен так
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
   ProgressBar1.Min := 1;
   ProgressBar1.Max := ListBox1.Items.Count ;
   i:=0;
        while i <> ListBox1.Items.Count do
          begin
           if stop =true then
           begin
               stop:= false;
                ProgressBar1.Position := i;
                 Application.ProcessMessages();
                  URl:=S_Edit1+S_Edit2+ListBox1.Items[i]+S_Edit4;
                   WebBrowser1.Navigate(URL);
              Label4.Caption:=IntToStr(i+1);
           Application.ProcessMessages();
          inc(i);
           end
           else Application.ProcessMessages();
     end;

end;
Всем спасибо, очень большое!!
bakanaev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Измерение времени выполнения процедуры Silverstone Помощь студентам 5 18.03.2012 22:02
как проверить результат выполнения хранимой процедуры kizl БД в Delphi 2 09.05.2011 19:33
Как дождаться завершения запущенного приложения DennerV Win Api 5 13.08.2010 13:48
Как дождаться завершения процедуры? Hintman Win Api 6 14.10.2009 14:46
приостановка выполнения процедуры BESS Общие вопросы Delphi 5 15.09.2008 00:53