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

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

ПРоблема с ТListView [D7, WinXP]


Виталий ©   (2008-02-06 14:45:00) 

Добрый день
Проблема следующая. Надо В ТListView вставлять итемы в алфавитном порядке. Использую следующий код

for i:=0 to count-1 do
 begin
      //Поиск места вставки
      Organizer_MainForm.OMS.Local_Storage_Plugin.GetCategorieName(CategoryID[i],name) ;

if ListView1.Items.Count<>0 then begin
j:=1;
     while (j<=ListView1.Items.Count)and(name>listView1.Items.Item[j-1].Caption) do
        inc(j);

   NewItem:=ListView1.Items.Insert(j-1);
  end
 else NewItem:=Listview1.Items.add;

  NewItem.ImageIndex:=0;
  NewItem.Caption:=name;

  end;

Места для вставки определяються верно но теме не менне итем вставленный Add( то есть самый первый) всегда оказываеться самым последним) А если ListView пустой то Insert не работает. Если заранее вставить пустой Item то все нормально сортируеться. Использую библиотеку CLX.


MsGuns   (2008-02-06 22:40:00) [1]

Для хранения данных о базеданных (хе-хе-хе) использовать TList, для сортировки которого написать соотв. код.
Листвью только для отображения


Сергей М.   (2008-02-06 17:27:00) [2]

Есть.

Data оно зовется.


Виталий   (2008-02-06 17:17:00) [3]

а есть у Item  свойство где можно хранить ID папки? Id- значение
LongInt


Сергей М.   (2008-02-06 17:14:00) [4]

В простейшем же случае (а у тебя он простейший) достаточно после заполнения списка вызвать метод AlphaSort.


Сергей М.   (2008-02-06 17:06:00) [5]

Пардон, речь идет, конечно же, о TListView.
Почему-то меня заклинило на TTreeView)

У объекта класса TListView есть замечательный метод CustomSort - он отсортирует тебе элементы списка так как тебе заблагорассудится и внезависимости от изначального порядка добавления элементов в список.


icWasya   (2008-02-06 17:00:00) [6]

Insert (Index) всавляет элемент ПЕРЕДIndex, а не после.

j:=0;
while (j<ListView1.Items.Count)and(name>listView1.Items.Item[j].Caption) do    inc(j);

if j <ListView1.Items.Count then
  NewItem:=ListView1.Items.Insert(j)
else
 NewItem:=Listview1.Items.add;


Сергей М.   (2008-02-06 16:59:00) [7]


> как потом модули отсортировать


Какие еще "модули" ?

Оперируй терминами "узел TTreeView". Там нет никаких "модулей".


Виталий   (2008-02-06 16:57:00) [8]

А как потом модули отсортировать. Надо же чтобы сначала папки отображались потом только модули.


Сергей М.   (2008-02-06 16:52:00) [9]


> База данных вовсе не супер пупер, и проблема не в ней


А зачем тогда упомянул ?


> как вставить то что из нее получаеться в алфавитном порядке


Не надо ничего "вставлять в алфавитном порядке".

Вставляй в порядке выборки.

После того как добавишь/вставишь всеэлементы своей древовидной структуры, запусти сортировку. На то есть спецметоду у объектов, имеющих отношение к классу TTreeView


Виталий   (2008-02-06 16:43:00) [10]

>Какое отношение иетоды объекта TListView.Items имеют к какой-от там >твоей супер-пупер-базеданных ?

База данных вовсе не супер пупер, и проблема не в ней. а именно спрашиваю как вставить то что из нее получаеться в алфавитном порядке  TListView. Может я чего то не понимаю. Но первый Item у меня получилось вставить только Add. А все последущие вставляються Insert(j-1). И например первая пака была "Иностранный язык", она вставляеться Add. Следущая папка "Математика". получаем j=2. То есть вставлять надо после, иностранного языка. а всеравно папка математика оказываеться на первом месте.


Виталий   (2008-02-06 16:35:00) [11]

пробовал  NewItem:=Listview1.Items.additem(nil, -1);
показывает ошибку List index out of bounds(0); на Insert(-1) тоже самое.


Сергей М.   (2008-02-06 16:31:00) [12]


> потому и не вызываеться что не работает


Бред какой-то ...

Какое отношение иетоды объекта TListView.Items имеют к какой-от там твоей супер-пупер-базеданных ?

Никакого абсолютно.


Виталий   (2008-02-06 16:25:00) [13]

Сергей М. ©   (06.02.08 15:39) [3]
>Он, Insert, у тебя и не вызывается, если список пустой.
>Как он при этом может "не работать" - совершенно не понятно)

потому и не вызываеться что не работает. надо организовать работу с базой данных так как в моем компьютере. Т.е. Есть база данных в которой таблица папок и таблица модулей в этих папках. папки могут быть вложены друг в друга.И при двойном щелчке по итему, если это папка получаем сначала список папки содержащихся в выбранной папке сортируем его, потом получаем список модулей сортируем его. вариант получать уже сортированный список из базы данных не подходит потому что название папки может быть в кавычках. которые надо отображать но при сортировке не учитывать. А проблема в том что первый элемент вставляеться Add. Потом к примеру получаем что следущий итем должен быть вставлен после этого, на позицию 1. но когда вставляем инсертом он всеравно вставляеться перед первым. И получаеться что все папки отсортированные а та пака которая была вставлена Add. Оказываеться последней.


Сергей М.   (2008-02-06 15:42:00) [14]

И гораздо проще и очевидней другое решение : не искать никакие "места вставки", а заполнить список в любом порядке и после этого одним махом отсортировать этот список.


clickmaker   (2008-02-06 15:41:00) [15]

function TListItems.Add: TListItem;
begin
 Result := AddItem(nil, -1);
end;

function TListItems.Insert(Index: Integer): TListItem;
begin
 Result := AddItem(nil, Index);
end;


Сергей М.   (2008-02-06 15:39:00) [16]


> если ListView пустой то Insert не работает


Он, Insert, у тебя и не вызывается, если список пустой.
Как он при этом может "не работать" - совершенно не понятно)


Сергей М.   (2008-02-06 15:37:00) [17]


> итем вставленный Add( то есть самый первый) всегда оказываеться
> самым последним


На то и Add, чтобы дополнить список добавлением элемента в конец этого сптиска.


> если ListView пустой то Insert не работает


Нафига же вставлять что-то туда куда оно по элементарной логике вставлено быть не может ?

Если список пуст, то очевижнго же, что решением является Add()


DimaBr   (2008-02-06 15:28:00) [18]

Внимание! Здесь обсуждаются вопросы, связанные с разработкой компонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.


Наверх

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