Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.23;
Скачать: CL | DM;

Вниз

ПРоблема с ТListView   Найти похожие ветки 

 
Виталий   (2008-02-06 14:45) [0]

Добрый день
Проблема следующая. Надо В Т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.


 
DimaBr ©   (2008-02-06 15:28) [1]

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


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


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


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


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


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

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


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


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


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


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

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:42) [5]

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


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

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

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


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


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


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

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

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


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

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


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

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

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


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


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


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


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


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

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

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


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

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


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


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


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

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


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

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 17:06) [14]

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

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


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

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


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

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


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

Есть.

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


 
MsGuns ©   (2008-02-06 22:40) [18]

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



Страницы: 1 вся ветка

Текущий архив: 2008.11.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
2-1223445414
Девушка
2008-10-08 09:56
2008.11.23
cxGrid столбец типа ImageComboBox отобразить значение поля


6-1195631001
novill
2007-11-21 10:43
2008.11.23
Как получить показания времени на удаленной машине по сети?


15-1222070588
DillerXX
2008-09-22 12:03
2008.11.23
Требуется помощь телепатов высокого уровня


2-1223563971
Сергей
2008-10-09 18:52
2008.11.23
Как организовать поиск "Найти далее"?


15-1222006281
@!!ex
2008-09-21 18:11
2008.11.23
Где взять StarCraft с полной озвучкой(русской или английской)