нужна помощь delphi webbrowser

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by woolfon, 29 Aug 2009.

  1. woolfon

    woolfon New Member

    Joined:
    4 May 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    имеется код:
    Code:
    begin
     link:=WebBrowser1.OleObject.Document.getelementsbytagname('a');
     for i:=0 to link.length-1 do
     if pos('/addfriend?recall=',link.item(i).href)<>0 then link.item(i).click;
     end;
    вообщем находит он 20 ссылок и пытается сразу кликнуть по всем, а мне надо чтобы кликнул по одной, страница обновилась кликнул по другой и т.д. пока не кончатся ссылки. помогите кто чем может) я сам ващпе не кодер!
     
  2. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    попробуй использовать sleep(5000) в цикле. Это задержка выполнения следующей команды на 5 секунд.
     
    #2 =Zeus=, 29 Aug 2009
    Last edited: 29 Aug 2009
  3. HakaR

    HakaR Active Member

    Joined:
    23 Jul 2009
    Messages:
    301
    Likes Received:
    200
    Reputations:
    3
    Если ставить sleep, вроде программа подвисать будет...
     
  4. =Zeus=

    =Zeus= Member

    Joined:
    10 Aug 2009
    Messages:
    213
    Likes Received:
    54
    Reputations:
    5
    А Application.ProcessMessages для чего? Хотя наверно sleep() тут не лучщий вариант, пусть ТС попробует, будем знать.
     
  5. mr. ZetRikS

    mr. ZetRikS New Member

    Joined:
    17 Jul 2009
    Messages:
    45
    Likes Received:
    2
    Reputations:
    0
    Application.ProcessMessages даёт приложению проработаться... то есть скорее всего он кликнет по всем ссылкам и потом даст загрузить последнюю...
    нун после последней даст проработаться... так как клик по ссылке он обработает... из предложенного думаю как раз задержка (sleep(5000)) в 5 секунд и подойдёт...
    Можно попробовать... блин... пока писал забыл чего хотел предложить...

    Вот есть ещё такой вариант, создавать несколько объектов и в них грузить ссылки :)
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    ппц народ вы гении. жжжоте
    после первого же перехода автоматом похерятся остальыне ссылки.
    Так что кидай во временный массив все ссылки.
    А потом пробегайся по нему и грузи линки в WebBrowser и делай ожидания пока не наступит событие Complite
     
  7. woolfon

    woolfon New Member

    Joined:
    4 May 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    вообщем я копирую ссылки в listbox

    Code:
    begin
     link:=WebBrowser1.OleObject.Document.getelementsby tagname('a');
     for i:=0 to link.length-1 do
     if pos('http://mysite/index.php?recall=',link.item(i).href)<>0 then ListBox1.Items.Add(link.item(i).href);
    
    end;
    
    а как теперь осуществить переход по каждой ссылке?
     
  8. akahaos

    akahaos Elder - Старейшина

    Joined:
    5 May 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    for i:=0 to listbox1.items.count-1 do
    WebBrowser1.navigate(listbox1.items);

    или не навигате там, лень делфю запускать, ну вобщем смысл понятен.
    а чтобы он ждал пока первая загрузится и тока потом переходил к загрузке следущей делай так:

    for i:=0 to listbox1.items.count-1 do begin
    WebBrowser1.navigate(listbox1.items);
    while not complete do application.processmessage;

    complete присваивай в true в событии браузера OnComplete или чето такое
     
  9. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Немного оффтоп:
    Application.ProcessMessages конечно, штука хорошая, но лучше всю работу с сетью вынеси в отдельный поток, не прописывай все в основном, чтобы прога не подвисала во время работы.
     
  10. akahaos

    akahaos Elder - Старейшина

    Joined:
    5 May 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    в его случае поток тут необязателен
     
  11. woolfon

    woolfon New Member

    Joined:
    4 May 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0


    вообщем ставлю я этот код на новую кнопку, переходит только по первой ссылке из списка, далее при нажатии просто обновляется страница, но переходов уже нет, наверное потому-то ссылка осталось в листбоксе, и он пробует перейти по ней еще раз, но она уже не валид)



    здесь я вообще не разобрался, значение присвоил, на строку while not complete do application.processmessage; компилятор жалуется,
    там вместо комплит я писал что-то вроюде ondownloadcomplete, ни каких результатов, и на application.processmessage тоже ошибка(((
     
  12. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Application.ProcessMessages - S забыл в конце
     
    3 people like this.
  13. woolfon

    woolfon New Member

    Joined:
    4 May 2008
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    ну вот что у меня есть:

    Code:
    procedure TForm1.Button3Click(Sender: TObject);
    
    var
    link:variant;
    i:integer;
    
    begin
    
     link:=WebBrowser1.OleObject.Document.getelementsbytagname('a');
     for i:=0 to link.length-1 do
     if pos('http://mysite.ru/index.php?addfriend?recall=',link.item(i).href)<>0 then ListBox1.Items.Add(link.item(i).href);
    
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    
    var
    
    i:integer;
    
    begin
    for i:=0 to listbox1.items.count-1 do begin
    WebBrowser1.navigate(listbox1.items[i]);
    while not complete do application.processmessages;
    end;
    на button3 все норм работает, в listbox добовляются ссылки

    на button2 не соображаю как дописать код, компилятор выдает ошибку undeclared identifier "complete"
    там помоему ondownloadcomplete надо но я точно не шарю, и плюс у меня ощущение что код перейдет по первой ссылке, и после обновления опять перейдет по ней, но уже ничего не изменится, я просто с первым вариантом пробовал именно так и вышло(((

    братцы умоляю кому не сложно, помогите... мне действительно очень надо, а в программировании увы я ноль(
     
  14. akahaos

    akahaos Elder - Старейшина

    Joined:
    5 May 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Ну дак конечно жалуется, ты complete обьяви в глобальном варе как boolean и сразу там же его равняй в false. а потом событии браузера онКомплете присваивай его в true

    да и не забудь первым действием в цикле его вновь в false ставить.
     
  15. akahaos

    akahaos Elder - Старейшина

    Joined:
    5 May 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    стукни в аську 671411, набросаю
     
  16. HeavyHell

    HeavyHell New Member

    Joined:
    4 Apr 2007
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    а что б прога не подвисала помоему вполне несложно бросить компанент антифриз
     
  17. akahaos

    akahaos Elder - Старейшина

    Joined:
    5 May 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    что вы все заладили подвисала-подвисала, если в его случае все грамотно реализовать то там не будет мест где бы морда висла.
     
  18. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    Delphi 2010 +

    Code:
      TWebBrowserHelper = class helper for TWebBrowser
        procedure WaitFor;
      end;
    
    { TWebBrowserHelper }
    
    procedure TWebBrowserHelper.WaitFor;
    var
      StarTime: Integer;
    const
      TimeOut: Integer = 15000;
    begin
      StarTime := GetTickCount;
      repeat
        VCL.Forms.Application.ProcessMessages;
      until
        not ((ReadyState <> READYSTATE_COMPLETE)
        and (GetTickCount - StarTime < TimeOut));
    end;
    
    чекає завершення загрузки...
    ПС IE дуже кривий...