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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2015, 15:40   #1
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
Вопрос Почему происходит TVN_SELCHANGED после TVM_DELETEITEM?

Отправляю компоненту TreeView сообщение TVM_DELETEITEM с wParam = 0, lParam = TVI_ROOT для удаления всех его элементов.
Но, после этого, иногда почему-то происходит событие TVN_SELCHANGED.
В MSDN не написано, что сообщение TVM_DELETEITEM вызывает TVN_SELCHANGED.
Может, кто знает, почему такое может быть?
Alexan-Dwer вне форума Ответить с цитированием
Старый 26.09.2015, 17:30   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ну я предположить могу, что при удалении происходит в дереве сдвиг веток, а соответственно и выделенная ветка, если она удаляется - теряет свое выделение в пользу другой.
Попробуй при посыле TVM_DELETEITEM в какю-то переменку булеву ставить флаг, а в обработчике TVN_SELCHANGED этот флаг проверяй. И если он скажем false - выходи из обработчика.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.09.2015, 19:14   #3
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Stilet, да, с проверкой флага я так и реализовал, просто не пойму почему так получается...

Насколько знаю, Вы программируете тоже на Lazarus, может посмотрите проект, если не сложно? Вдруг я что то упустил или делаю не так...
Архив с проектом прикрепил.

P.S. У меня при нажатии на кнопку "Add Element", в процедуре перезагрузки элементов TreeView, после
Код:
SendMessage(hTreeView, TVM_DELETEITEM, 0, LPARAM(TVI_ROOT));
происходит событие выбора элемента, которого в самом TreeView нет. Не пойму, из-за чего происходит это событие
Вложения
Тип файла: zip Project.zip (220.5 Кб, 11 просмотров)

Последний раз редактировалось Alexan-Dwer; 26.09.2015 в 19:22.
Alexan-Dwer вне форума Ответить с цитированием
Старый 27.09.2015, 07:56   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx
Я бы предложил такое:
Код:
procedure SelectedNewItem(Item: HTREEITEM);
begin
if Item^.action=TVC_UNKNOWN then exit;
Но чет в моем Лазарьке
Цитата:
{ TV_INSERTSTRUCT structure }
{ added manually PM, TREEITEM is not defined in the C headers }


Видать робяты не стали связываться с WinAPI серьезно.
Вообще логично, я бы наверное тоже не стал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.09.2015, 13:10   #5
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Stilet, я думал, что если отправить:
Код:
SendMessage(hTreeView, TVM_DELETEITEM, 0, LPARAM(TVI_ROOT));
то TreeView просто очистит список и обнулит счетчик количества элементов.
Но, оказалось, что это не так. Он перебирает все элементы, которые созданы в корне, и удаляет каждый по очереди, выделяя следующий по списку элемент.
Что бы избавиться от ненужных событий TVN_SELCHANGED просто перед очисткой элементов выставляю false для флага проверки, и после удаления присваиваю true. В обработчике события TVN_SELCHANGED проверяю, если значение флага истина, то нужно обрабатывать событие, если нет, то выхожу из обработчика.
Alexan-Dwer вне форума Ответить с цитированием
Старый 27.09.2015, 13:25   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Зачем ты с Винапи связался? Лазарь всетки кроссовый, и для него не характерны такие выкрутасы. Чем не угодило его дерево стандартное из LCL?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.09.2015, 13:54   #7
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Stilet, писал раньше на Delphi, когда уже заканчивал, неожиданно начали сыпаться ошибки, причём, сами по себе. Намучившись с VCL, выбрал Lazarus и WinApi, пока вроде всё работает, только иногда бывает, надо где-то что-нибудь подправить и всё
Alexan-Dwer вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не происходит запись в файл? RaccoonRocket Помощь студентам 3 06.06.2015 13:18
Почему не происходит удаление?Язык С++. RG21 Помощь студентам 0 28.05.2013 21:32
Почему происходит зацикливание? Arigato Общие вопросы Delphi 8 29.04.2013 19:06
почему событие buttonclic происходит после второго клика? brutalis Общие вопросы Delphi 4 23.10.2011 21:21
Почему так происходит? Zeraim Общие вопросы Delphi 1 05.05.2008 14:10