C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Проблема с компонентом TreeView
BreakPointMAN
  Отправлено: 16.06.2005, 23:33


Станционный диспетчер

Группа: Участник
Сообщений: 86



Доброго времени суток всем!.. занялся я Builder-ом и столкнулся с... ......... вообщем, если кто-нить что-нить подскажет, буду весьма признателен!

У компонента TreeView есть такие события, как OnEditing и OnEdited.
Оба они связаны с изменением свойства Text какого-либо узла при его редактировании с клавиатуры.
Первое из них, OnEditing, возникает перед началом редактирования (когда, например, мы выделили какой-то узел и сделали на нем одинарный щелчек мышью),
А второе, OnEdited, после окончания редактирования.

Вот...
Теперь конкретно о проблеме.

Нужно иметь возможность редактировать дерево (т.е. добавлять в него новые узлы, удалять их и т.п) с клавиатуры. Для этого в обработчике события OnKeyDown компонента TreeView проверяются нажатия таких клавиш, как Insert и Delete. При нажатии Insert создается новый узел на текущем уровне, при нажатии Shift+Insert создается новый дочерний узел от выделенного, при нажатии Delete выделенный узел удаляется.

Проблемы начинаются при входе в режим редактирования текста какого-либо узла. Хотелось бы, чтобы комбинации клавиш типа Shift+Delete, Shift+Insert, просто Insert и т.п. работали как в любом другом текстовом поле Windows, т.е. удаляли выделенный текст с помещением его в буфер, вставляли текст из буфера и т.п.

Вместо этого выскакивает обработчик OnKeyDown.


Окей, но ведь есть события OnEditing и OnEdited! Казалось бы — чего проще! Делаем глобальную переменную-флаг, которая запрещает нам ловить и обрабатывать нажатия Insert, Delete и т.п. при входе в режим редактирования (OnEditing) и разрешает после выхода из него (OnEdited).

Только вот одно НО: событие OnEdited возникает только в том случае, если редактируемый текст был действительно изменен! А вот если мы нажали Esc или сбросили режим редактирования выделением другого узла, то события OnEdited не возникает, и соответственно, возможность обработки Insert, Delete обработчиком OnKeyDown оказыается заблокированной (при входе в OnEditing флаг установили на временный запрет обработки в OnKeyDown, а назад после выхода из режима редактирования не вернули... )


Что делать? ............
xTrim
Отправлено: 17.06.2005, 05:57


Машинист паровоза

Группа: Участник
Сообщений: 208



У TreeView есть метод IsEditing, проверяй его в OnKeyDown
BreakPointMAN
Отправлено: 17.06.2005, 10:26


Станционный диспетчер

Группа: Участник
Сообщений: 86



QUOTE (xTrim @ 17/06/2005, 05:57)
У TreeView есть метод IsEditing, проверяй его в OnKeyDown

Все работает! smile.gif
Большое спасибо за столь быстрый ответ! cool.gif

Вернуться в Вопросы программирования в C++Builder