Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > VirtualTreeView и фокус определенной записи


Автор: MacTep 15.8.2012, 22:51
Есть следующее дерево.
http://s1.ipicture.ru/Gallery/Viewfull/12497722.html
Раскрываю его программно следующим кодом:
Код

        vt.ClearSelection;
        vt.FocusedNode := node;
        vt.FocusedNode.States := vt.FocusedNode.States + [vsSelected];
Но не пойму, почему далее по щелчке мышью на другом узле выделение работает некорректно (старое остается на узле, выделенным кодом сверху, новое устанавливается для только что выделенного мышью узла):
http://s1.ipicture.ru/Gallery/Viewfull/12497743.html
Что можно сделать, чтобы такого не было?

Автор: halfhope 16.8.2012, 03:49
Если это баги отрисовки, тогда попробуйте repaint, но это маловероятно.  По ходу это проблемы с vsSelected, точнее с ним все в порядке, попробуйте убирать флаг vsSelected со старого нода перед выделением нового. Т.е. на старом ноде остался флаг vsSelected; или свойство MultiSelect(False) но не знаю, поможет оно или нет.

Автор: kami 16.8.2012, 07:41
Цитата(MacTep @  15.8.2012,  22:51 Найти цитируемый пост)
Что можно сделать, чтобы такого не было?

Код

vt.Selected[OldNode]:=False;
vt.Selected[Node]:=True;
vt.FocusedNode := Node;
vt.FocusedColumn := 3;

Автор: MacTep 16.8.2012, 07:53
Цитата(halfhope @  16.8.2012,  03:49 Найти цитируемый пост)
Т.е. на старом ноде остался флаг vsSelected; или свойство MultiSelect(False) но не знаю, поможет оно или нет.
MultiSelect не установлено.

Код

vt.Selected[OldNode]:=False;
vt.Selected[Node]:=True;
vt.FocusedNode := Node;
vt.FocusedColumn := 3;
Это для какого события? И почему/зачем
Код

vt.FocusedColumn := 3;
?

Автор: kami 16.8.2012, 08:56
Цитата(MacTep @  16.8.2012,  07:53 Найти цитируемый пост)
Это для какого события?

Это для того, в котором "раскрывается программно следующим кодом".

Цитата(MacTep @  16.8.2012,  07:53 Найти цитируемый пост)
И почему/зачем

А это я не обратил внимания, что у тебя не включен ExtendedSelect, убрать.
Но в любом случае - нужно устанавливать Selected и Focused. Почему - не помню, давненько смотрел в исходники VT. Хотя... и версия VT у меня ни разу не последняя smile

Автор: MacTep 16.8.2012, 12:18
Первое: у меня нет OldNode на момент выделения найденного.
Второе: причем тут событие, когда у меня раскрывается определенный пункт дерева, если глюк происходит на следующем действии, а именно на действии выделения другого узла дерева?

Добавлено через 3 минуты и 55 секунд
В общем заработало корректно вот так:
Код

        vt.ClearSelection;
        vt.FocusedNode := node;
        vt.Selected[node] := true;
//        vt.FocusedNode.States := vt.FocusedNode.States + [vsSelected]; // оказалось ненужным совсем

Автор: kami 16.8.2012, 13:37
Цитата(MacTep @  16.8.2012,  12:18 Найти цитируемый пост)
Первое: у меня нет OldNode на момент выделения найденного.

Без комментариев.
Цитата(MacTep @  16.8.2012,  12:18 Найти цитируемый пост)
Второе: причем тут событие, когда у меня раскрывается определенный пункт дерева?

Ты спросил -
Цитата(MacTep @  16.8.2012,  07:53 Найти цитируемый пост)
Это для какого события?
 я ответил. Откуда мне знать, в какой части программы будет работать обсуждаемый код?
Код мной был приведен верный, в конце концов им ты и воспользовался. Какой смысл в этой критике?

Автор: MacTep 16.8.2012, 17:43
kami, спасибо большое. Никакой критики. Может быть просто слова подобрал не те, чтобы выразить свои вопросы. Наоборот очень благодарен, что помог. Спасибо!

Добавлено через 27 секунд
Код

vt.Selected[OldNode]:=False;
этого, кстати, не потребовалось smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)