|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
30.12.2010, 13:34 | #1 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Общение tThread и ListView.items
Всем привет!
Проблема: В ListView 2 колонки: Название Статус при запуске потоку передаётся номер(ItemIndex) элемента ListView.items к которому принадлежит поток. По номеру ItemIndex поток посылает в колонку Статус сообщения. Но вот если с ListView добавить или убрать элемент. То поток в случае добавления элемента будет посылать сообщения не своему item'у, а чужому. в случае удаления поток попытается послать сообщение item/s которого уже нет в списке, и вызовет AccesViolation. Как это можно исправить? При помощи чего можно уведомить поток о том что произошло? Хотелось бы наглядного примера или подробной растолковки ситуации. |
30.12.2010, 13:39 | #2 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Фишка в том чтобы в потоке было поле - TListItem, которому передается итем, с которым будет работать поток, а не передавать потоку ItemIndex. Тогда при удалении этот Итем и освобождай. а в потоке проверяй - если он не nil то продолжать иначе выйти
I'm learning to live...
|
|
30.12.2010, 14:45 | #3 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
гм все немного сложно=)
А если SendMessages ипользовать? и при помощи них сообщать новый индекс... |
30.12.2010, 14:58 | #4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Поясню примером )
Становись на Итем, и жми кнопку - итем удалится, его поток прекратит работу.
I'm learning to live...
|
30.12.2010, 15:23 | #5 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Не так поняли=)
В LIstView 3 итема и один поток принадлежный к итему с индексом 2. 0 - Неработает 1 - неработает 2 - работает удаляем 1 итем, получается 0 - неработает 1 - работает в поток 1 итема(Бывший 2-ой) хранит значение 2, потому что изначально 3 итема(0,1,2). При попытке послать сообщение на 2 индекс, вываливает AV потому что элемента с индексом 2 нет вообще т.к. есть только 0 и 1. Последний раз редактировалось Человек_Борща; 30.12.2010 в 15:26. |
30.12.2010, 15:45 | #6 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,527
|
Цитата:
Или же как сказал Stilet в Thread хранить не индекс а ссылку на TListViewItem которую и посылать. И при этом не забывать чистить эту самую ссылку при удалении в ListView.
программа — запись алгоритма на языке понятном транслятору
|
|
30.12.2010, 17:53 | #7 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
Цитата:
|
|
30.12.2010, 20:07 | #8 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
В том и дело что поток привязывается (в моем примере) не к индексу, который изначально нестабилен, а к элементу, который до момента освобождения аки пуп земли несокрушим и не сдвинуть его никому ). А то что ListView у себя в канве перестраивает, это его проблемы - обьекты все равно размещены так что поток, привязанный к обьекту знает всегда где он и как к нему обратится (Не здря я тебе пример дал где не по индексу связь )
I'm learning to live...
|
|
30.12.2010, 22:08 | #9 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,527
|
Цитата:
программа — запись алгоритма на языке понятном транслятору
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как перетащить элемент ListView в другой ListView? | Paul Hindenburg | Компоненты Delphi | 5 | 26.01.2013 11:35 |
программное добавление items в ListView | Марк Охман | Общие вопросы Delphi | 4 | 30.12.2010 16:44 |
Синхронизация работы Tthread и данных в ListView как реализовать? | Человек_Борща | Общие вопросы Delphi | 4 | 20.12.2010 01:00 |
[C# + WPF] ListView. Узнать выделена ли строка в нём. ListView.View == GridView. | Casper-SC | WPF, UWP, WinRT, XAML | 2 | 12.08.2010 19:04 |
Удаление Items в ListView | BioHEX | Общие вопросы Delphi | 1 | 04.01.2010 19:43 |