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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.08.2012, 19:47   #11
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
Как раз таки ваши намерения на изобретение велосипеда понять не могу.
Вот вам пример:
Код:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
               const pDisp: IDispatch; var URL: OLEvariant);
var
  CurWebrowser : IWebBrowser;
  TopWebBrowser: IWebBrowser;
  Document     : OLEvariant;
  WindowName   : string;
begin { TForm1.WebBrowser1DocumentComplete }
  CurWebrowser := pDisp as IWebBrowser; 
  TopWebBrowser := (Sender as TWebBrowser).DefaultInterface; 
  if CurWebrowser=TopWebBrowser then
  begin
    ShowMessage('Document is complete.') 
  end
  else
  begin
    Document := CurWebrowser.Document; 
    WindowName := Document.ParentWindow.Name; 
    ShowMessage('Frame ' + WindowName + ' is loaded.')
  end;
end;
Не могу понять для чего вручную вызывать эут процедуру, для каких целей то?
Тело процедуры можно легко подогнать под себя
У меня в теле
Код:
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
               const pDisp: IDispatch; var URL: OLEvariant);
Идет парсинг страницы, а так надо было мне написать сразу как оно естьесть Смотрите, вот что происходит
Код:
procedure TForm1.Button1Click(Sender: TObject);

begin
   for i := 0 to ListBox1.Items.Count-1 do
   begin
      URL:=ListBox1.Items[i];
      WebBrowser1.Navigate(URL);
   end;
end;
И суть в том что цикл не дожидается загрузки страницы и сразу "пуляет" следующую, в итоге мы видим загрузку последней по списку (ListBox) страницы.
Но если я буду вызывать в теле цикла процедуру procedure TForm1.WebBrowser1DocumentComplete( Sender: TObject;
const pDisp: IDispatch; var URL: OLEvariant);

то ожидание будит, вроде как
bakanaev вне форума Ответить с цитированием
Старый 05.08.2012, 20:04   #12
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

А что мешает организовать цикл так, чтобы он не "пулял" ваши страницы одну за другой? А только лишь после загрузки предыдущей?
Базиля вне форума Ответить с цитированием
Старый 05.08.2012, 20:19   #13
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
А что мешает организовать цикл так, чтобы он не "пулял" ваши страницы одну за другой? А только лишь после загрузки предыдущей?
Ну так я и пытаюсь)) до этого делал через while do, но там проц грузится на 80%
bakanaev вне форума Ответить с цитированием
Старый 05.08.2012, 21:00   #14
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Цитата:
но там проц грузится на 80%
Application.ProcessMessages;
Sleep(300);
Lesha вне форума Ответить с цитированием
Старый 05.08.2012, 21:18   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Тут надо дождаться пока страница загрузится полностью, и только потом выводить значение в Label4
Label4.Caption:=IntToStr(i);
Так вынеси этот вывод в DocumentComplete
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.08.2012, 21:36   #16
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); 
                 repeat {} 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; 05.08.2012 в 21:45.
impulsgraw вне форума Ответить с цитированием
Старый 05.08.2012, 21:38   #17
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Stilet
Если я все правильно понял, теперь выясняется то что проблема немного в другом
А именно: (процитирую ТС)
Цитата:
И суть в том что цикл не дожидается загрузки страницы и сразу "пуляет" следующую, в итоге мы видим загрузку последней по списку (ListBox) страницы.
Решается ведь все легко и просто, тем же циклом while (не знаю с чего у вас такая нагрузка шла, наверное не совсем правильно спланировали работу цикла).
Предлагаю такой вариант: (подобная проблема кстати совсем недавно здесь на форуме уже обсуждалась).

Код:
var b:boolean;

...

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; const URL: OleVariant);
begin
{Описываете здесь необходимые действия};
b:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
b:=true;
i:=0;
   while i <= ListBox1.Items.Count-1 do
    if b then
       begin
       b:=false;
       URL:=ListBox1.Items[i];
       WebBrowser1.Navigate(URL);
       inc(i);
       end;
end;
Я надеюсь вы мою мысль уловили
Базиля вне форума Ответить с цитированием
Старый 05.08.2012, 21:40   #18
impulsgraw
Верховный Судья
Пользователь
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Сообщений: 82
По умолчанию

Дада, а я что написал?_)
impulsgraw вне форума Ответить с цитированием
Старый 05.08.2012, 21:43   #19
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

impulsgraw
Я пока писал свой пост, вы в этот момент уже отписались, я не заметил этого
Не стал убирать свой пост
P.S. Но в вашем варианте вложенный цикл все-таки лишний.
И в данном случае цикл с параметром все-таки не уместен. (ИМХО)
Базиля вне форума Ответить с цитированием
Старый 05.08.2012, 21:44   #20
impulsgraw
Верховный Судья
Пользователь
 
Аватар для impulsgraw
 
Регистрация: 23.11.2010
Сообщений: 82
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
impulsgraw
Я пока писал свой пост, вы в этот момент уже отписались, я не заметил этого
Не стал убирать свой пост
P.S. Но в вашем варианте вложенный цикл все-таки лишний.
Почему? Без него как раз задерживаться не будет а будет прямо так пролетать.
impulsgraw вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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