TTreeView , как изменить выделение

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

TTreeView , как изменить выделение

Сообщение alek111 » 09.08.2010 17:39:26

Как сделать так, чтобы:
- по нажатию левой кнопки мыши ничего не выделялось (по двойному щелчку поддеревья должны разворачиваться и сворачиваться)?
- устанавливать и снимать множественное выделение программно? Как устанавливать более-менее понятно, а вот со снятием ничего не выходит.
Аватара пользователя
alek111
новенький
 
Сообщения: 20
Зарегистрирован: 20.06.2006 16:17:50

Re: TTreeView , как изменить выделение

Сообщение Brainenjii » 09.08.2010 18:43:31

Давно уже отказался от TTreeView. Рекомендую TVirtualTreeView - еслии не ошибаюсь, первый вопрос там решается на уровне свойств дерева, второй - тоже достаточно тривиально.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: TTreeView , как изменить выделение

Сообщение Nik » 09.08.2010 18:55:40

- по нажатию левой кнопки мыши ничего не выделялось (по двойному щелчку поддеревья должны разворачиваться и сворачиваться)?

Подозреваю, что без извращений - никак. Можно пытаться снимать выделение на событии OnSelect.


- устанавливать и снимать множественное выделение программно? Как устанавливать более-менее понятно, а вот со снятием ничего не выходит.

Если устанавливать получилось, то снимать аналогично. Покажите кусок кода.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: TTreeView , как изменить выделение

Сообщение alek111 » 09.08.2010 19:03:07

Код: Выделить всё
procedure TForm1.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  node: TTreeNode;
begin
  node:= TreeView1.GetNodeAt(X, Y);
  if Button = mbRight then node.Selected:= not node.Selected;
end;
Выделение устанавливается, но не сбрасывается.

На всякий случай: Lazarus 0.9.28.2, WinXP

при этом node.Selected устанавливается по очереди в true и false.

Добавлено спустя 1 час 15 минут 3 секунды:
С программным управлением разобрался, нужно использовать не Selected, а MultiSelected.

Остается открытым вопрос о запрете выделения левой кнопкой мыши.
Аватара пользователя
alek111
новенький
 
Сообщения: 20
Зарегистрирован: 20.06.2006 16:17:50

Re: TTreeView , как изменить выделение

Сообщение Brainenjii » 09.08.2010 20:18:48

Поздно и не удаляется ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: TTreeView , как изменить выделение

Сообщение alek111 » 09.08.2010 20:24:54

После долгого "курения" исходников пришел к выводу, что нужно создавать потомка и перегружать в нем MouseDown.

Добавлено спустя 4 часа 6 минут 10 секунд:
Если кому интересно, в потомке нужно перегрузить MouseDown
Код: Выделить всё
procedure TTreeViewEx.MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
var
  node: TTreeNode;
begin
  node:= GetNodeAt(X, Y);
  if (Button <> mbLeft) or
     (([ssDouble] *Shift) <> []) or
     (X < node.DisplayExpandSignRight) then
      inherited MouseDown(Button, Shift, X, Y);
end;
При этом:
- левой кнопкой мыши выделение не происходит
- по одиночному левому клику на "плюс/минус" дерево разворачивется/сворачивается
- то же самое по двойному левому клику на ветви (на тексте или иконке)
Аватара пользователя
alek111
новенький
 
Сообщения: 20
Зарегистрирован: 20.06.2006 16:17:50


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

Рейтинг@Mail.ru