![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ПРоблема с Т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.
Вопросы по поиску и использованию готовых компонентов, редакторов или экспертов являются нарушением тематики и могут быть удалены.