Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > [Virtual TreeView] Обновить 3-state checkbox...


Автор: Marsianin 31.7.2007, 05:44
Статью прочитал, да и уже какое-то время плотно ковыряю VT, всё ясно, однако не могу додумать одну вещь.
При создании дерева у меня есть дети, у которых родитель имеет triStateCheckBox.
Так вот эти дети сами имеют checkbox и при создании имеют различные положения.
Когда дерево показывается дети все прочеканы по разному, а вот родитель - нет.
Если кликать мышкой, то автоматом всё встаёт на свои места и родитель чекается, как надо.

Как, если я программно изменил состояния детей, обновить состояние triCheckBox их родителя?

Автор: AriX 31.7.2007, 13:03
Marsianin
Код
VT.TreeOptions.AutoOptions := VT.TreeOptions.AutoOptions + [toAutoTristateTracking];

И также у родителей нужно выставить:
Код
Node.CheckType := ctTriStateCheckBox

Автор: Marsianin 1.8.2007, 05:07
Не, ты не понял.
Это дело у меня по умолчанию включено и всё делается как надо.
Проблема в том, что когда я программно заполняю дерево и сначала делаю родителя (присваивая ему triStateCheckbox), а потом этому родителю создаю детей, у которых обычный checkbox, и дети эти имеют всякие разные значения.
Так вот после создания всех этих детей состояние чекбокса родителя - снято, а должно быть серым.
Как только тыкаешь в дереве мышкой по одному из детей и меняешь его состояние, то тогда и начинает срабатывать toAutoTristateTracking и родитель меняет своё состояние автоматом.
Вообщем как вызвать руками ту процедуру, которая автоматом происходит при чеканьи руками детей...

Автор: AriX 1.8.2007, 13:47
Marsianin, вот так работает на ура, только что проверил:
Код

var
  Node: PVirtualNode;
begin
  Node := VT.AddChild(nil);
  VT.CheckType[Node] := ctTriStateCheckBox;
  Node := VT.AddChild(VT.GetFirst);
  VT.CheckType[Node] := ctCheckBox;
  VT.CheckState[Node] := csCheckedNormal;
  Node := VT.AddChild(VT.GetFirst);
  VT.CheckType[Node] := ctCheckBox;
  VT.CheckState[Node] := csUncheckedNormal;
end;

Может быть ты работаешь непосредственно с данными в PVirtualNode? А нужно использовать свойства CheckType и CheckState дерева.

Добавлено через 57 секунд
Хм, а я и сам написал Node.CheckType smile Извини, ошибся.

Автор: Marsianin 2.8.2007, 01:25
Так, понятное дело, работает.
Пока сделал именно так, но в первом случае у меня они инициализировались в событии OnInitNode и там я им присваивал
Node.CheckState:=csCheckedNormal;

В этом случае не обновляется родитель, как я только не пробовал  smile 

Автор: AriX 2.8.2007, 13:54
Marsianin, ну так я и говорю, юзать нужно не PVirtualNode.CheckState, а TVirtualStringTree.CheckState[Node: PVirtualNode].

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