Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Вниз

Я заглючила основательно 


Galy   (2002-02-15 11:21) [0]

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

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

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



McSimm   (2002-02-15 11:32) [1]

Организовывая цикл для удаления из списка лучше организовывать его в обратном порядке. Тогда не будет проблем с неверными индексами:

for i:=listbox1.items.count-1 downto 0 do begin



McSimm   (2002-02-15 11:33) [2]

listbox1.Items [i] .delete;



wicked   (2002-02-15 11:37) [3]

неправильного здесь то, что при выполнении операции удаления у тебя уменьшается listbox1.items.count... надо бы перебирать элементы listbox"а "сверху вниз" и завести отдельную переменную для количества элементов в listbox"е... например, во так:
var n: integer;
...
n := listbox1.items.count - 1;
for i := n downto 0 do begin
if strtoint(listbox1.items[i])=0 then listbox1.Items.delete;
end;
...

не проверял, но думаю, что должно работать..



wicked   (2002-02-15 11:38) [4]

упс... не заметил глюка... :)
2 McSimm © ;)



Galy   (2002-02-15 11:44) [5]

Listbox1.Items.delete;
D5 вякает на данную строчку и выдает следующее сообщение об ошибке:
NOT ENOUGH ACTUAL PARAMETERS



McSimm   (2002-02-15 11:53) [6]

>Galy (15.02.02 11:44)
См. McSimm © (15.02.02 11:33)



Galy   (2002-02-15 11:57) [7]

McSimm >пробовала и так, но вон что получается
Выдается следующая ошибка:
RECORD, OBJECT OR CLASS TYPE REQUIRED



McSimm   (2002-02-15 12:02) [8]

Извиняюсь. Перепутал с другим объектом.
listbox1.Items.delete(i);



Nemesis   (2002-02-15 12:11) [9]

Сначала попробуй переделать этот цикл как Repeat ... Until

Еще ТР относился очень плохо к смене границ и переменной цикла "для



McSimm   (2002-02-15 12:19) [10]

>переделать этот цикл как Repeat ... Until
не обязательно
>относился очень плохо к смене границ и переменной цикла "для
Это вообще не возможно :) Измененить переменную не даст компилятор, изменение Count никак не влияет на количество проходов цикла



QD   (2002-02-15 12:46) [11]

Var sl: TStringList;
i: integer;
begin
Try
sl:=TStringList.Create ;
for i:=0 to listbox1.items.count - 1 do
if strtoint(listbox1.items[i])<>0 then sl.Add(listbox1.items[i]);
ListBox1.Items:=sl;
finally
sl.Free;
end;
end;

А так работает, и неплохо :)



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

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

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



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

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



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

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



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

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



QD   (2002-02-15 14:39) [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...) лучше проводить скрыто, создавая дополнительные переменные и работая с ними, так как при этом не вызываются методы обновления отображаемой на экране информации (меньше загрузка процессора, меньше глюков, быстрее обработка, особенно при сортировке)



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

McSimm © (15.02.02 14:17)

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

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



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

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



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

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



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

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



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

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



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

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



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

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;



Dimka Maslov   (2002-02-15 15:15) [24]

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

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;



McSimm   (2002-02-15 15:23) [25]

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



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

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



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

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



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

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)



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

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

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


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



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

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



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

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

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




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.04 c
14-9288           Ежик                  2002-01-14 15:06  2002.03.04  
Подскажите плииз где можно скачать Windows 3.1


1-9196            ДмитрийВ              2002-02-14 17:47  2002.03.04  
Комплексные числа


1-9242            hooky-mars            2002-02-12 21:18  2002.03.04  
Реестр и левые данные


7-9320            AlexKniga             2001-11-27 18:10  2002.03.04  
Не в тему. Про аудио системы.


3-9084            karafuto              2002-02-07 10:10  2002.03.04  
Глюк клиента MS SQL 2000?