![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Заморочки с TListView.IndexOf [D7, WinXP]
_Mike_ © (2006-03-27 06:33:00)Уважаемые мастера! Не подскажет-ли кто почему при поиске индекса строки в двух абсолютно идентичных ListView мне всегда выдается "-1"?
Имеем: ListView1 и ListView2, ViewStyle=vsReport; в каждом 2-е колонки и одна и та же строка (Петров|зачёт). Пишу так:
P := ListView1.Items.IndexOf(ListView2.Items.Item[I]);
А "P" всегда = -1! Если использовал ListBox-ы, то все работало!
Не пойму, что не так! Поможииите!
_Mike_ (2006-03-27 10:15:00) [1]
> > типа ("Иванов - пришел") или ("Иванов - ушел").
>
>
> откуда тогда Петров|зачёт
Так это уже дальше я ушел! :-)
> > а то уже перепробовал кучу вариантов - не могу подобрать
>
> > оптимальный!
>
>
> Для 20-ти строк - думать об оптимальности - не обязательно.
> Дочтаточно правильной функциональности.
А можно мне пример какой-нибудь поиметь? :-) на black_ghost@mail.ru
ЮЮ (2006-03-27 10:07:00) [2]разницы нет никакой
item из 2-го вариата это тот же объект, что и ListView1.Items.Item[ListView1.Items.Count-1] из первого.
Только текст становится удобочитеемым.
Можно ещё упростить:
var
item:TListItem;
subItems: TStrings;
begin
subItems:= ListView2.Items.Item[ListView2.ItemIndex].SubItems;
item := ListView1.Items.Add;
item.Caption := S;
item.SubItems.Add(subItems.Strings[0]) ;
item.SubItems.Add(subItems.Strings[1]) ;
item.ImageIndex := -1;
item.Data := nil;
end;
ЮЮ (2006-03-27 10:00:00) [3]
> типа ("Иванов - пришел") или ("Иванов - ушел").
откуда тогда Петров| зачёт
> а то уже перепробовал кучу вариантов - не могу подобрать
> оптимальный!
Для 20-ти строк - думать об оптимальности - не обязательно. Дочтаточно правильной функциональности.
_Mike_ (2006-03-27 09:57:00) [4]И ещё... Не пойму в чем разницаесли я добавляю из одного ListView1 в другой такими методами...
...
ListView1.Items.Add.Caption := S;
ListView1.Items.Item[ListView1.Items.Count-1].SubItems.Add(ListView2.Items.Item[ListView2.ItemIndex].SubItems.Strings[0]);
ListView1.Items.Item[ListView1.Items.Count-1].SubItems.Add(ListView2.Items.Item[ListView2.ItemIndex].SubItems.Strings[1]);
ListView1.Items.Item[ListView1.Items.Count-1].SubItems.Add('');
ListView1.Items.Item[ListView1.Items.Count-1].ImageIndex := -1;
... или так...
var item:TListItem;
begin
item := ListView1.Items.Add;
item.Caption := S;
item.SubItems.Add(ListView2.Items.Item[ListView2.ItemIndex].SubItems.Strings[0]) ;
item.SubItems.Add(ListView2.Items.Item[ListView2.ItemIndex].SubItems.Strings[1]) ;
item.ImageIndex := -1;
item.Data := nil;
end;
_Mike_ (2006-03-27 09:37:00) [5]Ситуация такая: есть два списка, в каждом по 10 строк, причем половина строки может отличаться от такой же строки в другом списке. типа ("Иванов - пришел") или ("Иванов - ушел").
1) нужно найти одинаковые записи в них и удалить. Затем
2) проанализировать присутствие Иванова на занятиях. (Пришел или Ушел)
и, наконец,
3) проделать то же самое с Петровым, Сидоровым, Васечкиным...
Может лучше использовать для такого дела TStringList? Каким образом лучше это сделать, подскажите, пожалуйста, а то уже перепробовал кучу вариантов - не могу подобрать оптимальный!
ЮЮ (2006-03-27 09:23:00) [6]Без циклов - никак, ибо цикл - естественный алгоритмический прием для выполнения несколько раз одного и того же действия.
Напиши и отладь функцию поиска в одном TListView.Items по шаблону из TListViewItem один раз, а затем используй её в дальнейшем "без циклов"
MBo (2006-03-27 09:22:00) [7]>без циклов (типа for I:=0 to ListView.Items.Count -1) ???
Чудес не бывает, и, даже если бы был встроенный метод для поиска, он бы проходил все элементы в цикле.
P.S. Если список отсортирован, поиск можно делать быстрее.
_Mike_ (2006-03-27 09:05:00) [8]А как тогда сравнить Item и SubItem (String) одного листа с другим без циклов (типа for I:=0 to ListView.Items.Count -1) ???
ЮЮ (2006-03-27 08:36:00) [9]Это же не TStringList, где IndexOf ищет строку,
TListItems.IndexOf
function IndexOf(Value: TListItem): Integer;
Никогда TListItem одного TListView не будет элементом коллекции другого TListView
balepa (2006-03-27 07:05:00) [10]P := ListView1.Items.IndexOf( ListView2.Items[I]);
> Если использовал ListBox-ы, то все работало!
> Не пойму, что не так! Поможииите!
Вреш в листбоксах такой код не работает