Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

изменение диапазона цикла FOR внутри цикла [D7, XP]


хочу все знать ©   (2006-03-11 17:02:00) 

всем привет
народ подскажите как обойти проблему
я использую цикл
for n:=0 to listbox1.count-1 do
begin
........
if .... then здесь происходит добавление колличества записей в     листбоксе
........
end

в результате чего цикл отрабатывает не все записи а только стока скока их было до добавления в листбокс

как  етого избежать и пройти по всем записям


хочу все знать   (2006-03-11 23:49:00) [1]

да предложений масса но я полностью согласен что через
while (i < ListBox.Count) do
будет безопасние


jack128   (2006-03-11 21:43:00) [2]

grisme ©   (11.03.06 17:22) [4]
изменить значение счетчика можно и без асма, но тя на каждом шагу будут поджидать неприятные сюрпризы

var
 I: Integer;
begin
 for I := 0 to 10 do
 begin
   PInteger(@I)^ := I + 1;
   ShowMessage(IntToStr(I));
 end;
end;


Сколько итераций будет в этом коде??


API   (2006-03-11 17:42:00) [3]

[7], [8] - чего и следовало ожидать. Причина - вариант 2.


grisme   (2006-03-11 17:41:00) [4]

можешь посмотреть в окне CPU. можно будет делать пересчет если мы в досе(править сегмент кода):)


API   (2006-03-11 17:40:00) [5]

[4] grisme ©   (11.03.06 17:22)

Два варианта:

1. Оптимизатор отловит вставку на ассемблере, и будет использовать неоптимальный код для цикла. Для работы с ListBox'ом - заметной разницы не будет. Но в других случаях эта неоптимальность может привести к значительным потерям производительности.

2. Оптимизатор не отловит вставку на ассемблере. Нервотрепка автору ветки и флейм в самой ветке - обеспечены. Опять же - потеря времени.

Ни первый, ни второй вариант проверять не собираюсь по причине изначально "кулхацкерского" подхода к решению задачи, предложенного в [4].


grisme   (2006-03-11 17:36:00) [6]

пересчет в for все-таки не удасться.:( Но изменение параметра цикла работает.:)


grisme   (2006-03-11 17:35:00) [7]

К стати, это и не работает...сорри...:)


AlexeyT   (2006-03-11 17:31:00) [8]


> Еще эксперимнт. Как мы знаем,цикл for - в асме аналог loop


Дурацкие эксперименты IMHO. Никто не гарантирует, что это будет работать с разными версиями дельфей и с/без оптимизации. Правильно сказали, надо использовать while.


grisme   (2006-03-11 17:27:00) [9]

Еще эксперимнт. Как мы знаем,цикл for - в асме аналог loop(где кон.значение-ecx).Так вот, я просто поменял значение ecx - все работает.
В твоем случае, пихай в ecx(при добавлении элементов) новое значение listbox1.count.


grisme   (2006-03-11 17:22:00) [10]

класс..только что проверил:
конструкция
for i:=1 to 15 do
 if i=6 then i:=i+1;
отказалась работать, но согласилась работать
вот эта:
for i:=1 to 15 do
begin
  if i=6 then
  begin
       asm
         inc i
       end;
  end;
end;
Причем i дошло не до 15, а до 16!!!8))


grisme   (2006-03-11 17:16:00) [11]

однозначно while, т.к. конечное и начальное выражение for рассчитываются один раз, а в while, каждый цикл..:)


Zeqfreed   (2006-03-11 17:09:00) [12]

Лучше так не делать. Но если приспичит, то можно использовать циклы repeat и while.


API   (2006-03-11 17:09:00) [13]

i := 0;
while (i < ListBox.Count) do
begin

 inc(i)
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо