Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

изменение диапазона цикла 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.04 c
4-1135390132
Grinder
2005-12-24 05:08
2006.03.26
Добавить пункт в чужое меню


3-1138889242
Silver...
2006-02-02 17:07
2006.03.26
DBGrid и "DataSet.AfterOpen"


15-1141160102
sniknik
2006-02-28 23:55
2006.03.26
В тему. ;)


2-1141708089
rainy_
2006-03-07 08:08
2006.03.26
String это тип или класс?


2-1142318231
dabreezy
2006-03-14 09:37
2006.03.26
Маленький вопросик по потокам.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский