PDA

Просмотр полной версии : нужна помощь delphi webbrowser


woolfon
29.08.2009, 11:01
имеется код:
begin
link:=WebBrowser1.OleObject.Document.getelementsby tagname('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 ссылок и пытается сразу кликнуть по всем, а мне надо чтобы кликнул по одной, страница обновилась кликнул по другой и т.д. пока не кончатся ссылки. помогите кто чем может) я сам ващпе не кодер!

=Zeus=
29.08.2009, 16:23
попробуй использовать sleep(5000) в цикле. Это задержка выполнения следующей команды на 5 секунд.

HakaR
29.08.2009, 16:36
попробуй использовать sleep(5000) в цикле. Это задержка выполнения следующей команды на 5 секунд.

Если ставить sleep, вроде программа подвисать будет...

=Zeus=
29.08.2009, 16:39
А Application.ProcessMessages для чего? Хотя наверно sleep() тут не лучщий вариант, пусть ТС попробует, будем знать.

mr. ZetRikS
29.08.2009, 16:56
Application.ProcessMessages даёт приложению проработаться... то есть скорее всего он кликнет по всем ссылкам и потом даст загрузить последнюю...
нун после последней даст проработаться... так как клик по ссылке он обработает... из предложенного думаю как раз задержка (sleep(5000)) в 5 секунд и подойдёт...
Можно попробовать... блин... пока писал забыл чего хотел предложить...

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

slesh
29.08.2009, 19:35
ппц народ вы гении. жжжоте
после первого же перехода автоматом похерятся остальыне ссылки.
Так что кидай во временный массив все ссылки.
А потом пробегайся по нему и грузи линки в WebBrowser и делай ожидания пока не наступит событие Complite

woolfon
31.08.2009, 19:25
вообщем я копирую ссылки в listbox

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;


а как теперь осуществить переход по каждой ссылке?

akahaos
31.08.2009, 19:47
for i:=0 to listbox1.items.count-1 do
WebBrowser1.navigate(listbox1.items[i]);

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

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

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

M_script_
31.08.2009, 21:40
Немного оффтоп:
Application.ProcessMessages конечно, штука хорошая, но лучше всю работу с сетью вынеси в отдельный поток, не прописывай все в основном, чтобы прога не подвисала во время работы.

akahaos
31.08.2009, 21:42
в его случае поток тут необязателен

woolfon
01.09.2009, 07:07
for i:=0 to listbox1.items.count-1 do
WebBrowser1.navigate(listbox1.items[i]);

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

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

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

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

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

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

M_script_
01.09.2009, 08:40
и на application.processmessage тоже ошибка(((
Application.ProcessMessages - S забыл в конце

woolfon
01.09.2009, 09:59
ну вот что у меня есть:

procedure TForm1.Button3Click(Sender: TObject);

var
link:variant;
i:integer;

begin

link:=WebBrowser1.OleObject.Document.getelementsby tagname('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 надо но я точно не шарю, и плюс у меня ощущение что код перейдет по первой ссылке, и после обновления опять перейдет по ней, но уже ничего не изменится, я просто с первым вариантом пробовал именно так и вышло(((

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

akahaos
01.09.2009, 12:04
Ну дак конечно жалуется, ты complete обьяви в глобальном варе как boolean и сразу там же его равняй в false. а потом событии браузера онКомплете присваивай его в true

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

akahaos
01.09.2009, 12:05
стукни в аську 671411, набросаю

HeavyHell
01.09.2009, 12:11
а что б прога не подвисала помоему вполне несложно бросить компанент антифриз

akahaos
01.09.2009, 12:34
что вы все заладили подвисала-подвисала, если в его случае все грамотно реализовать то там не будет мест где бы морда висла.