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

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

Я заглючила основательно [D5, Win95/98]


Страницы:   1 2

Galy ©   (2002-02-15 11:21:00) 

Не могу вспомнить, что я пишу неправильно.

for i:=0 to listbox1.items.count-1 do begin
if strtoint(listbox1.items[i])=0 then
listbox1.Items.delete;
end;

Надо удалить запись из listbox"а, при условии равенства двух сторон.


Petrovich (origin)   (2002-02-15 22:02:00) [1]

Да, чем стандартнее вопрос, тем длиннее флейм :)

to wicked:
выражение в конструкции for... вычисляется один раз при входе в цикл, так что заводить отдельную переменную нет абсолютно никакого смысла.


JohnnyCrisJoe   (2002-02-15 21:37:00) [2]

Извращаемся...
I := 0;
while I < ListBox1.Items.Count do
if StrToInt(ListBox1.Items[I]) = 0
then ListBox1.Items.Delete(I)
else Inc(I);


Fast   (2002-02-15 18:28:00) [3]

Можно еще короче.

while listBox1.Items.IndexOf("0")>=0 do
listbox1.Items.Delete(listBox1.Items.IndexOf("0"));


Только тут надо осторожней строку "00" процедура не удалит.


Набережных С.   (2002-02-15 17:56:00) [4]

i:=listbox1.items.Count;
while i > 0 do
begin
Dec(n);
if strtoint(listbox1.items[i])=0 then
listbox1.Items.delete(i);
end;


Плюс MBo © (15.02.02 14:41)


Nemesis   (2002-02-15 17:35:00) [5]

>Dimka Maslov © (15.02.02 15:15)
И все же начать надо бы с конца


Dimka Maslov   (2002-02-15 15:44:00) [6]

>McSimm
Попробую и посложнее, только сложность не гарантирую :)


McSimm   (2002-02-15 15:23:00) [7]

>Dimka Maslov © (15.02.02 15:15)
В принципе можно еще сложнее придумать вариант :)


Dimka Maslov   (2002-02-15 15:15:00) [8]

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

var
i, Count: Integer;
List: array of Integer;
begin
Count:=0;
for i:=0 to ListBox1.Items.Count - 1 do
if StrToInt(ListBox.Items[i]) = 0 then begin
Inc(Count);
SetLength(List, Count);
List[Count-1]:=i;
end;
for i:=0 to Count-1 do ListBox1.Items.Delete(List[i]);
if Count<>0 then Finalize(List);
end;


Turalyon   (2002-02-15 15:00:00) [9]

j := listbox1.items.count-1;
i := 0;
while i < j do
begin
if strtoint(listbox1.items[i])=0 then
begin
listbox1.Items.delete(i);
dec(j);
end;
inc(i)
end;


Nemesis   (2002-02-15 14:55:00) [10]

Согласен Downtoснимает проблему (так мне и надо за невнимательность)
но попробую настоять: while либо repeat..until


Turalyon   (2002-02-15 14:50:00) [11]

>McSimm ©
:) Ну вот пока набирал, ты сам ответил.


Turalyon   (2002-02-15 14:49:00) [12]

>Nemesis ©
MCSimms написал же в цикле Downtoтак что по идее все дожно работать как он написал в McSimm © (15.02.02 12:54)
Но, как мне кажется, правильнее было бы все воспользоваться либо while либо repeat..until


McSimm   (2002-02-15 14:47:00) [13]

>Nemesis © (15.02.02 14:40)
Не рискую. Посмотри McSimm © (15.02.02 12:54)
Цикл идет от конца. i всегда будет в пределах списка, независимо от кол-ва удалений


MBo   (2002-02-15 14:41:00) [14]

>лучше проводить скрыто
BeginUpdate/EndUpdate


Nemesis   (2002-02-15 14:40:00) [15]

McSimm © (15.02.02 14:17)

Вот этот цикл выполнится ровно 10 раз, как не меняй переменную M
внутри цикла

Ты рискуеш в коде обратится к Items"у у которго индекс больше от Count (надеюсь ты не будешь оспаривать тот факт, что удаление одного итемся отразится на их количестве)


QD   (2002-02-15 14:39:00) [16]

>McSimm © (15.02.02 12:54)
>А чем этот вариант не подошел?
>
> for i:=listbox1.items.count-1 downto 0 do
> if strtoint(listbox1.items[i])=0 then
> listbox1.Items.delete(i);

Любую работу со строками в визуальных компонентах (TListBox, TMemo...) лучше проводить скрыто, создавая дополнительные переменные и работая с ними, так как при этом не вызываются методы обновления отображаемой на экране информации (меньше загрузка процессора, меньше глюков, быстрее обработка, особенно при сортировке)


McSimm   (2002-02-15 14:17:00) [17]

Вот этот цикл выполнится ровно 10 раз, как не меняй переменную M
внутри цикла
M := 10;
for I := 1 to M do
begin
M := Round(Rand*100);
Writeln(I)
end;


Nemesis   (2002-02-15 13:53:00) [18]

> McSimm
изменение Count никак не влияет на количество проходов цикла
Как это не влияет - она ведь в цикле собирается Items"ы удалять


Galy   (2002-02-15 12:57:00) [19]

QD<
Спасибо попробую.


McSimm   (2002-02-15 12:54:00) [20]

А чем этот вариант не подошел?

fori:=listbox1.items.count-1 downto0 do
ifstrtoint(listbox1.items[i])=0 then
listbox1.Items.delete(i);


Страницы:   1 2

Наверх

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