Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как правильно организовать цикл? 
:(
    Опции темы
elementos
Дата 12.12.2007, 18:12 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



к примеру есть код:

Код

procedure TForm1.Button1Click(Sender: TObject);
var pa, s, s1, s2, dir: string;
RegEx: TRegExpr;
begin
s := idhttp1.Get(adr);
RegEx := TRegExpr.Create;
try
regex.Expression := '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
regex.Exec(s);
s1 := regex.Match[0];
caption := s1; // определили IP и сохранили его
repeat
runandwait(pa, '', dir, '', button1); // тут запускаем реконнект роутера, и ждем пока инет не подымется
application.ProcessMessages;
idhttp1.Disconnect; 
s := idhttp1.Get(adr); 
regex.Exec(s);
s2 := regex.Match[0]; // проверяем снова IP
until
caption <> s2; // если IP уже новый, то "стоп"
close; // тут закрывается прога
finally
regex.Free; // выполнится ли это???
end;
end;


интересно след. будет ли освобожден тип regex, ведь перед ним программа закрывается?
и как поймать ошибку если сайт adr будет к примеру недоступен?
где у idhttp ловить ее?
спасибо
PM MAIL   Вверх
Snowy
Дата 13.12.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Цитата(elementos @  12.12.2007,  18:12 Найти цитируемый пост)
интересно след. будет ли освобожден тип regex, ведь перед ним программа закрывается?
Ну так для интереса, поставил бы бряку на этой строке и проверил бы ;-)

Цитата(elementos @  12.12.2007,  18:12 Найти цитируемый пост)
и как поймать ошибку если сайт adr будет к примеру недоступен?
Аналогично - поместить Get в try .. except.

PM MAIL   Вверх
elementos
  Дата 20.12.2007, 12:38 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



подскажите, пишу следующую программу. 
нужно: при запуске программа делает запрос на сайт, который возвращает внешний IP, сохраняет IP в переменной, затем запускает внешнюю программу реконнекта модема, ждет пока не подымется интернет после реконнекта, снова запрашивает свой внешний ip, и если он остался неизменным, то повторяет реконнект (при этом каждый раз нужно сравнивать ip после реконнекта) до тех пор, пока он не изменится. 
при всем этом нужно чтобы если сайт, на котором идет проверка ip лежит к примеру, то выйти из цикла, т.е. нужно еще и обрабатывать ошибки от idhttp.
делаю так:

Код

var pa, s, s1, s2, dir: string;
RegEx: TRegExpr;
begin
timer1.Enabled := false;
try
s := idhttp1.Get(adr);
RegEx := TRegExpr.Create;
except // если поймаем какую-то ошибку, то уходим из процедуры
on E: EIdSocketError do
case E.LastError of
10060: exit; //
11001: exit; // может быть сдесь CLOSE вместо EXIT повесить ?
11004: exit; //
end;
end;
regex.Expression := '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
pa := 'D:\а\reconnect.bat';
dir := 'D:\а\';
try
regex.Exec(s);
s1 := regex.Match[0]; // здесь определяем IP
caption := s1;
runandwait(pa, '', dir, '', button1); // запускаем реконнект и ждем
application.ProcessMessages;
idhttp1.Disconnect; // реконнект отработал, поехали снова проверять
s := idhttp1.Get(adr); // наверно тут нужно снова громоздить "try..xecept"?
regex.Exec(s); 
s2 := regex.Match[0];
if caption <> s2 then begin
exit;
close;
end
else begin
repeat
runandwait(pa, '', dir, '', button1);
application.ProcessMessages;
idhttp1.Disconnect;
s := idhttp1.Get(adr); //тут нужно снова громоздить "try..xecept"??
regex.Exec(s);
s2 := regex.Match[0];
until
caption <> s2;
end;
finally
regex.Free;
end;



для меня эта конструкция представляется слишком сложной и громоздкой, к тому-же непонятно, где какой end отвечает за какой блок. мозг можно сломать.  smile 
может есть более изящное решение?

Это сообщение отредактировал(а) elementos - 20.12.2007, 12:39
PM MAIL   Вверх
dumb
Дата 20.12.2007, 13:03 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 3
Всего: 158



Цитата(elementos @  20.12.2007,  12:38 Найти цитируемый пост)
к тому-же непонятно, где какой end отвечает за какой блок. мозг можно сломать.

а не пробовал отступами пользоваться?!
Код

begin
  if blabla then begin
    blabla
  end;
end;

PM MAIL   Вверх
elementos
Дата 20.12.2007, 13:36 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Цитата(dumb @  20.12.2007,  13:03 Найти цитируемый пост)
а не пробовал отступами пользоваться?!

так с отступами еще непонятней
PM MAIL   Вверх
dumb
Дата 20.12.2007, 19:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 3
Всего: 158



Цитата(elementos @  20.12.2007,  13:36 Найти цитируемый пост)
так с отступами еще непонятней

smile

эм... с проблемами глазомера - в клинику Федорова. smile
PM MAIL   Вверх
elementos
Дата 20.12.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



Цитата(dumb @  20.12.2007,  19:44 Найти цитируемый пост)
эм... с проблемами глазомера - в клинику Федорова.

у вас своеобразный (если не сказать странный) способ помощи. я пишу, что не знаю за какой блок какой end отвечает, вы мне советуете отступами пользоваться. как интересно их расставлять, если я не знаю куда? 
и наконец в клинику, ну это уже за оскорбление я считаю. жаль правила форума слишком либеральны на этот счет ничего не написано. тогда учтите, "что посеешь - то и пожнешь".
PM MAIL   Вверх
dumb
Дата 21.12.2007, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 3
Всего: 158



Цитата(elementos @  20.12.2007,  23:29 Найти цитируемый пост)
я пишу, что не знаю за какой блок какой end отвечает
извини, но я не понимаю, как можно осмысленно писать программу не имея представления о базовом синтаксисе языка. когда видишь такие "шедевры", создается ощущение, что код бездумно "скопипастен" с какого-то убогого ресурса, что естественно не вызывает одобрения.

Цитата(elementos @  20.12.2007,  23:29 Найти цитируемый пост)
тогда учтите, "что посеешь - то и пожнешь".
а угрожать мне не стоит - если смайлики недостаточно хорошо видны, включи отображение картинок.

PM MAIL   Вверх
elementos
Дата 21.12.2007, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 10.12.2007

Репутация: нет
Всего: нет



dumb
1. это мой код, ни откуда не "скопипастен".
2. 
Цитата(dumb @  21.12.2007,  00:04 Найти цитируемый пост)
а угрожать мне не стоит

это означает - "как вы будете к людям, так и люди будут к вам". 
где здесь угроза?
3. кроме критики отсутствия отступов, и присвоения эпитета "шедевр", по сути вопроса сказать вам больше нечего? 
все ясно.

PM MAIL   Вверх
ivan219
  Дата 21.12.2007, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 5
Всего: 12



elementos, вот так будет крассивее и понятнее.
Код

var 
   pa, s, s1, s2, dir: string;
   RegEx: TRegExpr;
begin
 timer1.Enabled := false;
 try
  s := idhttp1.Get(adr);
  RegEx := TRegExpr.Create;
 except // если поймаем какую-то ошибку, то уходим из процедуры
  on E: EIdSocketError do
   case E.LastError of
        10060: exit; //
        11001: exit; // может быть сдесь CLOSE вместо EXIT повесить ?
        11004: exit; //
   end;
 end;
 regex.Expression := '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
 pa := 'D:\а\reconnect.bat';
 dir := 'D:\а\';
 try
  regex.Exec(s);
  s1 := regex.Match[0]; // здесь определяем IP
  caption := s1;
  runandwait(pa, '', dir, '', button1); // запускаем реконнект и ждем
  application.ProcessMessages;
  idhttp1.Disconnect; // реконнект отработал, поехали снова проверять
  s := idhttp1.Get(adr); // наверно тут нужно снова громоздить "try..xecept"?
  regex.Exec(s); 
  s2 := regex.Match[0];
  if caption <> s2 then
   begin
    exit;
    close;
   end
  else
   begin
    repeat 
     runandwait(pa, '', dir, '', button1);
     application.ProcessMessages;
     idhttp1.Disconnect;
     s := idhttp1.Get(adr); //тут нужно снова громоздить "try..xecept"??
     regex.Exec(s);
     s2 := regex.Match[0];
    until caption <> s2;
   end;
 finally
  regex.Free;
 end;

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.