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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2010, 16:47   #1
Bright-rider
Форумчанин
 
Регистрация: 09.07.2010
Сообщений: 102
По умолчанию

Пишу программу для работы с форумами. Есть вопрос.
Как вогнать в цикл процедуру отправки сообщения? То есть, нажимаешь на кнопку и прога отправляет сообщение(данные берят из stringgrid), а как эту процедуру повторять несколько раз(меняя данные). Как определить загружена страница или нет? Или как DownloadComplete/DocumentComplete вставить в другую процедуру? Прошу совета

Через 5минут:
Делаю через Webbrowser. Или лучше сделать через idhttp?

Последний раз редактировалось Bright-rider; 14.11.2010 в 17:19.
Bright-rider вне форума Ответить с цитированием
Старый 14.11.2010, 18:17   #2
BENZIN_KZ
 
Регистрация: 13.11.2010
Сообщений: 6
По умолчанию

мне кажется что вы сами запутались в своем вопросе...
Напишите по точнее что вам необходимо...

Вот код отправляет на страничку все колонки из StringGrid по очереди. Если страница не существует - то велезет сообщение об этом:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  For i := 0 To StringGrid1.ColCount - 1 Do
    Begin
      try
        IdHTTP1.Post( 'http://localhost/forum.php/', StringGrid1.Cols[ i ] );
      except
      on E: Exception do
        if Pos('404', E.Message) > 0 then
          ShowMessage( 'Страница не существует' );
      end;
    End;
end;
Каков вопрос - таков ответ

P.S. По поводу WebBrowser или IdHTTP - то IdHTTP работает быстрее так-как WebBrowser загружает готовую страницу( с картнками, левыми ссылками и т.д. ), а IdHTTP только код страницы. Но можно и перенастроить WebBrowser...

Последний раз редактировалось BENZIN_KZ; 14.11.2010 в 18:27.
BENZIN_KZ вне форума Ответить с цитированием
Старый 14.11.2010, 18:26   #3
Bright-rider
Форумчанин
 
Регистрация: 09.07.2010
Сообщений: 102
По умолчанию

При нажатии на кнопку в TWebbrowser загружается страничка(StringGrid1.Cells[0,1]), после того, как загрузка будет завершена на сайте осуществляется авторизация(данные тоже беруться из Stringgrid, с той же строчки, но с другой колнки). Так вот, мне нужно выполнять эти действия столько раз, сколько строчек в stringgrid1, как это осуществить?
Как организовать авторизацию я знаю, я не знаю, как повторять эти действия, как их внести в цикл.

Последний раз редактировалось Bright-rider; 14.11.2010 в 18:28.
Bright-rider вне форума Ответить с цитированием
Старый 14.11.2010, 18:54   #4
BENZIN_KZ
 
Регистрация: 13.11.2010
Сообщений: 6
По умолчанию

В принципе вопрос понятен...
но сервер может получать только указанные переменные, ибо текст запроса будет не о чем...
$стринггрид[0,1]=stringgrid[0,1];
$стринггрид[0,2]=stringgrid[0,2];
$стринггрид[1,1]=stringgrid[1,1];
$стринггрид[1,2]=stringgrid[1,2];

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

Смотрите 4 пост на http://programmersforum.ru/showthread.php?t=121291

вот примеры:
код php страницы
PHP код:
<?php
    $array_count 
$_POST'array_count' ];
    For (
$i=0$i<$array_count $i++) 
    {
        
$array$i ] = $_POST'array('.$i.')' ];
        print 
$array$i ].'
'
;
    }
?>
и код delphi
Код:
//Отправка сообщений
procedure TForm1.Button1Click(Sender: TObject);
var
  S: TStringList;
  i, j: Integer;

begin
  S := TStringList.Create;
  For i := 0 To StringGrid1.RowCount - 1 Do
    Begin
      S.Text := 'array_count=' + IntToStr( StringGrid1.ColCount );
      For j := 0 To StringGrid1.ColCount - 1 Do
        S.Add( 'array(' + IntToStr( j ) + ')=' + StringGrid1.Cells[ j, i ] );
      ShowMessage( IdHTTP1.Post('http://localhost/array.php', S ) );
    End;
  S.Free;
end;

//Заполнение StringGrid
procedure TForm1.Button2Click(Sender: TObject);
var
  i, j: integer;

begin
  For i := 0 To StringGrid1.RowCount - 1 Do
    For j := 0 To StringGrid1.ColCount - 1 Do
      StringGrid1.Cells[ i, j ] := IntToStr( i ) + IntToStr( j );
end;

Последний раз редактировалось BENZIN_KZ; 14.11.2010 в 19:16.
BENZIN_KZ вне форума Ответить с цитированием
Старый 14.11.2010, 19:08   #5
Angel of Live
 
Аватар для Angel of Live
 
Регистрация: 12.11.2010
Сообщений: 6
По умолчанию

Цитата:
Как определить загружена страница или нет?
Если используете компонент TWebBrowser, то используйте свойство WebBrowser.ReadyState, в данном случае значение 4, т.е.:
Код:
WebBrowser.Navigate('http://programmersforum.ru');
while WebBrowser.ReadyState<>4 do
   application.ProcessMessages;
ShowMessage('Страница загружена!');
А цикл while позволит перед тем как выполнять следующие действия - дождаться полной загрузки страницы.
Angel of Live вне форума Ответить с цитированием
Старый 14.11.2010, 19:15   #6
Bright-rider
Форумчанин
 
Регистрация: 09.07.2010
Сообщений: 102
По умолчанию

Спасибо, но мне нужно отправлять стринггрид весь на один сайт.
У меня есть:
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Webbrowser1.Navigate(StringGrid2.Cells[0,1]);
end;

procedure TForm1.WebBrowser1DownloadComplete(Sender: TObject);
var
i:integer;
begin
try
for I := 0 to WebBrowser1.OleObject.Document.all.tags('input').length - 1 do
begin
//Вводим логин
try
if (WebBrowser1.OleObject.Document.all.tags('input').item(i).name='vb_login_username') then
WebBrowser1.OleObject.Document.all.tags('input').item(i).value:=StringGrid2.Cells[1,1];
except
end;
//Вводим пароль
 try
if (WebBrowser1.OleObject.Document.all.tags('input').item(i).name='vb_login_password') then
WebBrowser1.OleObject.Document.all.tags('input').item(i).value:=StringGrid2.Cells[2,1];;
except
end;
//Нажимаем кнопку
try
if (WebBrowser1.OleObject.Document.all.tags('input').item(i).value='Вход') then
WebBrowser1.OleObject.Document.all.tags('input').item(i).click;
except
end;
end;
except
end;
  end;
У меня здесь данные беруться из 1строчки Stringgrid2, а мне нужно проделать эту операцию n раз(n=кол-во строк в Stringgrid2), меняя данные для авторизации. Как это можно сделать?
Bright-rider вне форума Ответить с цитированием
Старый 14.11.2010, 19:33   #7
Bright-rider
Форумчанин
 
Регистрация: 09.07.2010
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Angel of Live Посмотреть сообщение
Если используете компонент TWebBrowser, то используйте свойство WebBrowser.ReadyState, в данном случае значение 4, т.е.:
Код:
WebBrowser.Navigate('http://programmersforum.ru');
while WebBrowser.ReadyState<>4 do
   application.ProcessMessages;
ShowMessage('Страница загружена!');
А цикл while позволит перед тем как выполнять следующие действия - дождаться полной загрузки страницы.
Очень благодарен Не мог найти альтернативу Download(Document)Complete из-за это была проблема.
------------------------------------------------------------------------------
Добавлено:
Всё, разобрался. Всем спасибо за помощь

Последний раз редактировалось Bright-rider; 14.11.2010 в 19:50.
Bright-rider вне форума Ответить с цитированием
Старый 27.03.2011, 18:57   #8
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

Ссылка на более новоую тему - idhttp дождаться полной загрузки страницы
Alar вне форума Ответить с цитированием
Старый 26.06.2018, 17:19   #9
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,759
По умолчанию

Цитата:
Сообщение от Angel of Live Посмотреть сообщение
Если используете компонент TWebBrowser, то используйте свойство WebBrowser.ReadyState, в данном случае значение 4, т.е.:
Код:
WebBrowser.Navigate('http://programmersforum.ru');
while WebBrowser.ReadyState<>4 do
   application.ProcessMessages;
ShowMessage('Страница загружена!');
А цикл while позволит перед тем как выполнять следующие действия - дождаться полной загрузки страницы.
Извините за поднятие темы, но чтобы не плодить новую задам вопрос тут.
Код выше работает если страница простая. А если с несколькими фреймами, то "Страница загружена" выходит после загрузки первого фрейма. В итоге получается, что страница не загрузилась до конца. Как дождаться полной загрузки страницы?
Заранее благодарен за ответ.
FaTaL вне форума Ответить с цитированием
Старый 26.06.2018, 17:22   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Не мучать труп браузера и взять Selenium (и ЯП где он доступен вместо Дельфи).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ищу программу для работы с изображениями 1o1man Моделирование, изометрия, photoshop, 3d редакторы 9 18.06.2016 15:03
Пишу программу для рассылки kakawkin Работа с сетью в Delphi 8 19.07.2010 10:01