Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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... вычисляется один раз при входе в цикл, так что заводить отдельную переменную нет абсолютно никакого смысла.



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

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

Наверх





Память: 0.51 MB
Время: 0.005 c
14-9269
mvg_first
2002-01-10 20:32
2002.03.04
Есть ли альтернатива АДО при доступе к MS SQL 2000


1-9219
Стас
2002-02-15 08:21
2002.03.04
Про анимированный gif.


3-9066
SGrigory
2002-02-06 14:07
2002.03.04
Ошибка в индексе Paradox


14-9297
Лана Розанова
2002-01-16 15:16
2002.03.04
Привет народу здешнему.


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский