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

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

Заморочки с 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-ы, то все работало!
> Не пойму, что не так! Поможииите!


Вреш в листбоксах такой код не работает


Наверх

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