|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Не получается сравнение элементов в списке listbox
Работает только по первому добавлению в список, а потом работает не правильно. О задаче: Есть пустой список, добавляю туда из Грида, а после если добавляется уже существующее в списке, то выводится сообщение о добавлении.
Код:
procedure Tform_books.Button4Click(Sender: TObject); var i:integer; begin listbox1.Items.Add(adoquery1.fieldbyname('Название_книги').AsString); if listbox1.Items.Count<>0 then for i:=1 to listbox1.Items.Count-1 do if listbox1.Items.Strings[i]=listbox1.Items.strings[i] then begin if MessageDlg('Вы действительно хотите добавить существующую книгу?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin break; end else begin listbox1.Items.Delete(i); end; end; end; |
#2
|
|||
|
|||
Попробовал это, но теперь после 2-й добавленной строки, не сравнивается...
Код:
if listbox1.Items.Count<>0 then for i:=1 to listbox1.Items.Count-1 do begin f:=listbox1.Items.IndexOf(listbox1.Items.strings[i]); if f=1 then begin if MessageDlg('Хотите добавить уже добавленную книгу?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin break; end else begin listbox1.Items.Delete(i); end; end; end; Последний раз редактировалось xbron, 15.04.2013 в 19:35. |
#3
|
|||
|
|||
Если добавление из БД, соответсвенно, регистр будет одинаковый для любой попытки, то можно так:
Код:
procedure AddItemToListBox(AListBox : TListBox; AItem : String); begin If AListBox.Items.IndexOf(AItem) = -1 Then AListBox.Items.Add(AItem) Else If MessageDlg('Элемент уже есть. Добавляем?',mtConfirmation,[mbYes,mbNo],0) = mrYes Then AListBox.Items.Add(AItem); end; Если надо проверять без учета регистра, то можно сделать свою функцию IndexOf, например: Код:
function IndexOfText(AList : TStringList; AStr : String) : Integer; var I : Integer; begin Result := -1; For I := 0 To AList.Count-1 Do If AnsiCompareText(AList[i],AStr) = 0 Then Begin Result := I; Break; End; end; |
#4
|
||||
|
||||
Так работать с живым списком нельзя. Вы же для цикла определили границы в цикле. В Дельфи для цикла for границы задаются константно, а не динамически. Затем изменили их произвольно удалив элемент из списка. Хотите удалять таким способом - ради бога, но просматривать тогда надо список не с начала, а с конца.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#5
|
|||
|
|||
Цитата:
|
#6
|
|||
|
|||
Цитата:
|
#7
|
||||
|
||||
Цитата:
Код:
for i:=1 to listbox1.Items.Count-1 do Так вот, for вычисялет значение для правой границы только один раз, при входе в цикл. Т.е. если у вас при входе в цикл было 10 элементов в listbox1.Items.Count, то 10 раз он и будет выполнятся, независимо от того что вы будете делать внутри цикла с listbox1. И если в результате удаления элементов из listbox1 у вас их станет меньше 10, то вы получите ошибку выхода за границы. Но! Если цикл работает в обратную сторону, т.е: Код:
for i:=listbox1.Items.Count-1 downto 0 do Надеюсь теперь понятно. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#8
|
|||
|
|||
Цитата:
И кое-что , Код:
f:=listbox1.Items.IndexOf(listbox1.Items.strings[i]); Последний раз редактировалось xbron, 16.04.2013 в 17:50. |