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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 10.03.2015, 10:46   #1
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
Вопрос Цикл, проблема

Несколько месяцев не включал делфи и понял что хорошенько отупел за это время поэтому заранее извиняюсь за тупость...

Вобщем есть код:
Код:
var
  i:integer;
  RegExp:TRegExpr;
begin
  i:=0;
  RegExp:=TRegExpr.Create;
  RegExp.Expression:='[(.*?)]';
  //отправляется запрос

    if RegExp.Exec('запрос_переменная') then
    begin

      repeat
      // парсится 50 значений
      until not RegExp.ExecNext;

    end;

  RegExp.Free;
end;
в SpinEdit указывается количество данных (например 150) которое нужно спарсить, как правильно сделать цикл (while i<sSpinEdit1.Value do begin и потом в конце inc(i) , отупел изрядно, забыл даже элементарное) чтобы 3 раза обновило запрос (страницу) и спарсило 150 значений? Т.е запрос с которого парсятся данные должен 3 раза обновится (т.к на странице отображается 50 значений). Спасибо


Пробовал делать вот так:
Код:
var
  i:integer;
  RegExp:TRegExpr;
begin
  i:=0;
  RegExp:=TRegExpr.Create;
  RegExp.Expression:='[(.*?)]';
  while i<sSpinEdit1.Value do
  begin
  //отправляется запрос

    if RegExp.Exec('запрос_переменная') then
    begin

      repeat
      // парсится 50 значений
      inc(i);
      until not RegExp.ExecNext;
    end;
  end;
  RegExp.Free;
end;
но не работало (что странно), хотя да, ничего странного, цикл не в том месте...

Последний раз редактировалось FleXik; 10.03.2015 в 11:03.
FleXik вне форума
Старый 10.03.2015, 14:14   #2
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

ребят, помогите пожалуйста
FleXik вне форума
Старый 12.03.2015, 05:13   #3
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

up, проблема еще актуальна.

мне нужно чтобы запрос отправлялся заново только если i<sSpinEdit1.Value - причем в sSpinEdit указывается не количество раз которое должен отправиться запрос а количество значений которое надо спарсить, спасибо.
FleXik вне форума
Старый 12.03.2015, 05:42   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

я нихрена не понял.
прогони под дебаггером.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 12.03.2015, 09:21   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Существует тупиковая ветвь цикла (БЕЗ изменения i и чего бы то ни было другого)
что будет если запрос не получит данные или парсер(RegExp) не найдет нужное.
Переменная не изменится и все начнется снова.
Код:
for i:=0 to spin.value -1 do begin
if i mod 50 =0 then // ОДИН запрос на каждые 50 итераций
  //отправить запрос
  RegExp.Execute;
end;
// и обработка Каждой итерации 
RegExp.Next;
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 12.03.2015 в 09:26.
evg_m вне форума
Старый 13.03.2015, 07:45   #6
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Существует тупиковая ветвь цикла (БЕЗ изменения i и чего бы то ни было другого)
что будет если запрос не получит данные или парсер(RegExp) не найдет нужное.
Переменная не изменится и все начнется снова.
Код:
for i:=0 to spin.value -1 do begin
if i mod 50 =0 then // ОДИН запрос на каждые 50 итераций
  //отправить запрос
  RegExp.Execute;
end;
// и обработка Каждой итерации 
RegExp.Next;
end;
количество значений может быть разным, не обязательно 50, так что этот вариант не подходит да и слишком геморный, но спасибо за потраченное время, весы кликнул

все это решается циклами, просто у меня почему-то не хочет работать inc(i);
FleXik вне форума
Старый 13.03.2015, 07:49   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
просто у меня почему-то не хочет работать inc(i)
я ж тебе сказал: прогони под дебаггером.
дебаггер - наше всё!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума
Старый 13.03.2015, 07:58   #8
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
я ж тебе сказал: прогони под дебаггером.
дебаггер - наше всё!
было бы круто если бы я еще умел им пользоваться
FleXik вне форума
Старый 13.03.2015, 08:08   #9
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

постараюсь еще раз обьяснить

мне нужно чтобы запрос отправлялся до тех пор пока i<sSpinEdit1.Value , но счетчик i отвечает не за то сколько раз отправится запрос а за то сколько спарсится значений, но прикол такой что после каждого обновления запроса - значения меняются поэтому запрос всегда одинаковый и он только один, т.е смысл такой:

Например в sSpinEdit1 указываем число 73, а спарсить например можно максимально 40 значений, т.е нужно отправить 2 раза запрос чтобы спарсить 73 значения, итого задача такая:

Отправили запрос -> Спарсили 40 значений (все парсится регуляркой RegExpr, поэтому нельзя сказать что там будет ровно 40 значений и нужно подстраиваться так чтобы парсило до тех пор пока i<sSpinEdit1.Value) -> Отправляем запрос -> Спарсили последние 33 значения

т.е нужно парсить все значения которые возможно спарсить по заданному шаблону регулярки -> увеличивать счетчик типа integer и снова отправлять запрос пока этот счетчик не будет равен sSpinEdit1.Value

Последний раз редактировалось FleXik; 13.03.2015 в 08:11.
FleXik вне форума
Старый 13.03.2015, 08:14   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
было бы круто если бы я еще умел им пользоваться
было бы не круто, а просто нормально. дебаггер - это инструмент разумного программиста, как метла для дворника или кусачки для электрика.
научись им пользоваться. для примитивного уровня на обучение уйдёт не более часа, а потом сэкономит тебе месяцы рабочего времени и килограмм-полтора нервных клеток. литературы в инете - вагон. с картинками

кусочек книжки приепляю, посмотри.
Вложения
Тип файла: rar Delphi5Book.rar (346.5 Кб, 8 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 13.03.2015 в 08:51.
min@y™ вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с программой (цикл пропускает ввод поля) Thom Общие вопросы по Java, Java SE, Kotlin 5 27.02.2014 18:56
Проблема со Stream, Цикл (Delphi) [DisAssembleR] Помощь студентам 2 03.07.2013 17:46
цикл не печатает Y 10 раз, в чем может быть проблема serzav5 Общие вопросы C/C++ 8 22.01.2012 23:57
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34