Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

изменение диапазона цикла FOR внутри цикла   Найти похожие ветки 

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

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

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

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


 
Zeqfreed ©   (2006-03-11 17:09) [1]

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


 
API ©   (2006-03-11 17:09) [2]

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

 inc(i)
end;


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

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


 
grisme ©   (2006-03-11 17:22) [4]

класс..только что проверил:
конструкция
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:27) [5]

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


 
AlexeyT ©   (2006-03-11 17:31) [6]


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


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


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

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


 
grisme ©   (2006-03-11 17:36) [8]

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


 
API ©   (2006-03-11 17:40) [9]

[4] grisme ©   (11.03.06 17:22)

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

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

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

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


 
grisme ©   (2006-03-11 17:41) [10]

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


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

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


 
jack128 ©   (2006-03-11 21:43) [12]

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;


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
15-1141287739
Ламот
2006-03-02 11:22
2006.03.26
Ms Exchange 2000 &amp; Win2000 server


15-1141152916
ArtemESC
2006-02-28 21:55
2006.03.26
Модифицировать ячейку таблицы в HTML...


2-1141641175
kyn66
2006-03-06 13:32
2006.03.26
Поиск компонентов по наименованию.


15-1141288703
Mike Kouzmine
2006-03-02 11:38
2006.03.26
Вчера взломали мой компьютер.


1-1140416878
V.exeR
2006-02-20 09:27
2006.03.26
Корзина (Recycled)