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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.09.2012, 20:55   #1
123456789igor
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 62
По умолчанию цикл в цикле

Не могу понять как работает цикл в цикле
на пример
repeat
begin
lalalala
if что-то1<>100 then
begin
lalalala2
что-то1:=что-то1+1;
end
end
until что-то2<чего-то

Выполняется это так?
Заходим в цикл repeat делаем lalalala затем входим в условие if делаем lalalala2 затем будет выполняться if пока что-то1 не станет равным 100 и только потом перейдет на until так?

Вот наглядный пример с которым мучаюсь, у меня есть таблица в ней в ячейке(8,1) есть текст далее в каком-то, неизвестном, кол-ве ячеек вниз пусто и потом опять в одной ячейке что-то есть надо объединить ячейку 8,1 со всеми пустыми ячейками,вниз, до след заполненной. И то же самое проделать с следующей.
Код:
z:=Excel.WorkBooks[1].WorkSheets[1].UsedRange.Rows.Count-1;
     a_:=8;
     NRow:= a_;
     NCol:= 1;
     dir:= Excel.WorkBooks[1].WorkSheets[1].Cells[NRow,NCol];
     repeat
     begin
     NCol:= 1;
     If dir<>'' then
      begin
      Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[NRow,NCol],Excel.WorkBooks[1].WorkSheets[1].cells[NRow+1,NCol]].merge;
      //NRow:=NRow+1;
      dir:= Excel.WorkBooks[1].WorkSheets[1].Cells[NRow+1,NCol];
      end
      //else
      //NRow:=NRow+2;
      end;
     until NRow<z;
123456789igor вне форума Ответить с цитированием
Старый 19.09.2012, 21:02   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

С каких пор иф оператор цикла? иф выполняется на каждой итерации цикла 1 раз.
p51x вне форума Ответить с цитированием
Старый 19.09.2012, 21:04   #3
123456789igor
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 62
По умолчанию

Ну хорошо if выполнился 1 раз но когда его прошли что-то2 все равно меньше чего-то и тогда вернется к repeat и потом опять if выполниться ведь так?

Но в любом случае если в while вложен for как работать будет выполнит while затем все варианты for а потом вернется к while? что то я запутался

Последний раз редактировалось Stilet; 19.09.2012 в 21:25.
123456789igor вне форума Ответить с цитированием
Старый 19.09.2012, 21:38   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

На каждой итерации цикла while..do будет выполняться цикл for .. do. В общем, так, как Вы и сказали

Цитата:
выполнит while затем все варианты for а потом вернется к while
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 19.09.2012, 21:40   #5
123456789igor
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 62
По умолчанию

Но почему тогда в моем коде объединяется только 2 ячейки, вот как я понимаю работу этого кода:
z это кол-во всех строк-1
dir это переменная типа string в неё записывается значение ячейки
далее захожу в цикл repeat если ячейка не пустая то объединяем ячейки 8,1 и 9,1
далее dir присваиваем значение ячейки 9,1
и значение nrow становиться 10 а так как 10<чем число строк то проходим по циклу ещё раз но только dir уже это ячейка 9,1 и она объединена с 8,1 соответственно она не пустая и тогда так как nrow уже 10 должны объединиться 10,1 и 11,1 но этого не происходит
123456789igor вне форума Ответить с цитированием
Старый 19.09.2012, 21:49   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

while и repeat циклы выполняют код внутри себя пока не выполнится их условие.

Чтобы выскочить из цикла нужно выполнить break, чтобы прыгнуть на след. виток - continue.

Больше инфы можно найти по ссылке "Основы delphi"
Человек_Борща вне форума Ответить с цитированием
Старый 19.09.2012, 21:55   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Начнем разбор кода по-порядку:

Код:
     a_:=8;
     NRow:= a_;
это можно уложить в одну строчку NRow:=8;

Код:
     repeat
     begin
NCol:=1;
...
      end;
until NRow<z;
repeat..until сами по себе как begin..end, поэтому в дополнительных бегинендах не нуждаются. А NCol:=1 вообще можно убрать - она у Вас внутри цикла все-равно нигде не меняется.

Теперь по конкретной проблеме:

Код:
     dir:= Excel.WorkBooks[1].WorkSheets[1].Cells[NRow,NCol];
     repeat
раз уж используете repeat..until, почему не определять dir внутри цикла?

Код:
repeat
    dir:= Excel.WorkBooks[1].WorkSheets[1].Cells[NRow,NCol];
Далее цитирую Вас:

Цитата:
...и значение nrow становиться 10...
Не вижу, в каком месте NRow у Вас инкрементируется (точнее вижу, но, прошу прощения за каламбур, этот инкремент в комменте

Ну и если Вы поменяете repeat и dir:=... местами так, как я сказал выше, то отпадет необходимость в этой строчке:

Код:
dir:= Excel.WorkBooks[1].WorkSheets[1].Cells[NRow+1,NCol];
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 19.09.2012, 22:14   #8
123456789igor
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 62
По умолчанию

Ну да, забыл что под комментарием вот переделал
Код:
z:=Excel.WorkBooks[1].WorkSheets[1].UsedRange.Rows.Count-1;
     NRow:= 8;
     NCol:= 1;
     repeat
     dir:= Excel.WorkBooks[1].WorkSheets[1].Cells[NRow,NCol];
     If dir<>'' then
      begin
 Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[NRow,NCol],Excel.WorkBooks[1].WorkSheets[1].cells[NRow+1,NCol]].merge;
      NRow:=NRow+1;
      dir:= Excel.WorkBooks[1].WorkSheets[1].Cells[NRow+1,NCol];
      end
      else
      NRow:=NRow+2;
     until NRow>=z;
Так компилируется но при выполнении excel не запускается и просто висит в процессах соответственно и программа тоже
123456789igor вне форума Ответить с цитированием
Старый 19.09.2012, 22:22   #9
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
но при выполнении excel не запускается и просто висит в процессах
Потому что где-то в коде нет Excel.Visible:=true; (или типа того, не помню точно, но в инете 100% где-нибудь есть инструкция)

И, кстати, тот код, который у Вас приведен сейчас, объединяет ячейки попарно - так и надо?


UPD. Заглянул в свою старую программулину - точно Excel.Visible:=true;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 19.09.2012, 22:25   #10
123456789igor
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 62
По умолчанию

Есть((( я скинул отрывок проги
123456789igor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл в цикле EkleP PHP 1 12.02.2012 01:29
Цикл в цикле Зод Помощь студентам 1 19.11.2011 04:40
цикл в цикле (Си++) ConChita Помощь студентам 2 11.03.2010 09:13
Цикл в цикле... Davlet M Помощь студентам 6 25.01.2010 01:42