Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2011, 18:25   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Согласование TObjectList и TlistView при отображении, только, определённых элементов в ListView

Доброго времени всем!

Есть ListView и есть ObjectList.

В ListView понадобилось отображать только те элементы, которые хочет юзер.
это успешно получается путём перезаполнения списка:
1. чистим ListView
2. для TObjectList пишем код, который будет добовлять в ListView обьекты из себя,только с опред. характеристикой(идентификатор).


Далее мне понадобилось удалять, смотреть данные из отсоритрованного списка. Обращение к элементу TObjectList идёт через индекc который выделен в Listview в данный момент. Следовательно баг. Отображается не то что хотелось.

К примеру:
Есть 4 элемента в ObjectList:
Формат: Индекс элемента - идентификатор
0 - 1
1 - 1
2 - 2
3 - 2

ListView отсортирован и отображает элементы только с ид. = 2:
0 - 2
1 - 2

Не сложно догодаться, что дабл-кликнув на элементе ListView, с индексом 0, нам вернёт ObjectList не верные данные, так ещё и не из этого элемента(0 - 1). т.к обращение к элементам ObjectList идёт через тек. ItemIndex у ListView.

Как это исправить?

Последний раз редактировалось Человек_Борща; 23.10.2011 в 18:31.
Человек_Борща вне форума Ответить с цитированием
Старый 23.10.2011, 18:54   #2
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Один TList - как хранилище всех созданных объектов
Второй TList - для отображения отобранных по фильтру из первого списка (только ссылки на элементы первого списка).
Сортировки по второму. Удаление: сначала из хранилища (поиск по объекту), а затем из второго - по индексу. А затем уже освобождение удалённого элемента.
TListView - в режиме работы с виртуальными данными
ReportCube вне форума Ответить с цитированием
Старый 23.10.2011, 19:17   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

хм, о промежуточном TList как-то не подумал.

А об:
Цитата:
TListView - в режиме работы с виртуальными данными
можно подробнее? Как это? Что это? Где это?
Человек_Борща вне форума Ответить с цитированием
Старый 23.10.2011, 19:43   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

в ListItem есть свойство Data, в котором можно хранить как любой индекс, так и ссылку на объект. Можно им пользоваться для идентификации. Можно в неотображаемых SubItem-ах хранить ссылочную инфу, не очень удобно, что в символьном виде.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.10.2011, 20:08   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Я всегда подобные вещи делал через привязку навроде
Код:
with TlistView.additem(somestring) do
data := a_bindable_object;
...
if (Tlistview.items[tlistview.itemindex].data as Tmybindableobject).somemethod ...
У.П.С. Аватар опередил
phomm вне форума Ответить с цитированием
Старый 23.10.2011, 20:40   #6
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

TListView().OwnerData := True;
TListView().Items.Count := TList().Count;
Данные для визуализации в обработчике событии OnData по индексу параметра Item: TListItem. Добавлять Item не надо. В обработчике: Item.Caption и Item.SubItems - присваиваете данные из Вашего объекта TList[Item.Index]. Вот, в общем-то, и всё.
ReportCube вне форума Ответить с цитированием
Старый 23.10.2011, 21:58   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

phomm,
Интересно, вот как запихиваю в DATA что-то:
Код:
procedure TVisibleLog.AddRecord(aRecordData: TLogRecord; Creating: boolean);
var
  LI: TlistItem;
begin
  Add(aREcordData);
  with fListView do
  begin
    LI := Items.Add;
    Li.SubItems.Add(aRecordData.LogMessage);
    LI.SubItems.Add(aRecordData.RecordTime);
    Li.Data:=@aRecordData;
Пытаюсь вытащить:
Код:
procedure THLRVisibleLog.ShowLogMessage(aIndx: Integer);
var
  LR:TLogRecord;
begin
  LR:=TLogRecord(fListView.Items[aIndx].Data^);
  MessageBox(Application.handle,PChar(LR.LogMessage),PChar(LR.TypeAsText+' - '+LR.RecordTime),MB_OK or MB_ICONINFORMATION);
end;
Красным отметил строку, где программа выпадает в AV.
Человек_Борща вне форума Ответить с цитированием
Старый 23.10.2011, 22:04   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
//Запихивать
Li.Data:=aRecordData;
//Читать
LR:=TLogRecord(fListView.Items[aIndx].Data);
Насколько помню TLogRecord это объект?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.10.2011, 22:11   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Да, TObject если быть точным.

Но ведь, Li.Data это Pointer.
И передовать нужно через @, или я опять что-то напутал?

[UP]
попробовал ваш вариант. Всеравно, на той же строке, выпадает в AV.

Последний раз редактировалось Человек_Борща; 23.10.2011 в 22:14.
Человек_Борща вне форума Ответить с цитированием
Старый 23.10.2011, 22:13   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так Pointer это адрес, а все указатели на объекты тоже адреса

ADD

А колпак убрали при чтении? aIndx правильно передали?
Этот метод 100% рабочий, так что ошибка в другом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.10.2011 в 22:21.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TListView перемещиение(вверх-вниз) элементов списка Человек_Борща Общие вопросы Delphi 11 05.02.2012 18:51
Плагин для Windows или действия с контекстным меню при выборе опр. типа файла Человек_Борща Общие вопросы Delphi 7 02.10.2011 21:09
TListView+AlphaControls+CustomDrawI tem - баг при отрисовке. XerSon Общие вопросы Delphi 9 09.03.2011 12:36
Закрытие окна при нажатии опр. клавиши на клавиатуре. Borgond Общие вопросы Delphi 6 25.08.2010 01:14
Отбор при отображении winson БД в Delphi 1 18.05.2009 17:04