![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Компонент TVirtualStringTree [D7, WinXP]
DEMs © (2005-11-16 10:09:00)Здравствуйте
Если кто-нибудь работал с компонентом TVirtualStringTree, подскажите пожайлуста!!!!
Вначале я заполняю дерево.
procedure TfrmMain.LoadTree;
var
dat: PNodeData;
TipDolg1, TipDolg2, TipDolg3: PVirtualNode;
begin
Tree.NodeDataSize:= SizeOf(TNodeData);
if (TipDolg1=nil)and(TipDolg2=nil)and(TipDolg3=nil) then
begin
TipDolg1:=Tree.AddChild(nil);
dat:=Tree.GetNodeData(TipDolg1);
dat.Text:='AAAAAAAA';
TipDolg1.States:=TipDolg1.States+[vsExpanded];
TipDolg2:=Tree.AddChild(nil);
dat:=Tree.GetNodeData(TipDolg2);
dat.Text:='BBBBBBBBB';
TipDolg2.States:=TipDolg2.States+[vsExpanded];
TipDolg3:=Tree.AddChild(nil);
dat:=Tree.GetNodeData(TipDolg3);
dat.Text:='CCCCCCCC';
TipDolg3.States:=TipDolg3.States+[vsExpanded];
end;
end;
Затем начинаю заново перегружать его:
Tree.Clear;
TipDolg1:=nil;
TipDolg2:=nil;
TipDolg3:=nil;
LoadTree;
После нескольких таких перезагрузок компонет пропадает с экрана и выдаётиься ошибка. Подскажите пожалуйста в чём проблема.
jack128 (2005-11-16 11:02:00) [1]jack128 © (16.11.05 10:56) [2]
Абсолютно НЕверная(!!!!!!!!!!!!!) работа с компонентом.
lol
DEMs (2005-11-16 11:02:00) [2]Спасибо
jack128 (2005-11-16 10:56:00) [3]DEMs © (16.11.05 10:09)
TipDolg1:=Tree.AddChild(nil);
dat:=Tree.GetNodeData(TipDolg1);
dat.Text:='AAAAAAAA';
TipDolg1.States:=TipDolg1.States+[vsExpanded];
Абсолютно верная работа с компонентом.
Если сразу после добавления узла ты хочешь заполнить данные, то ты должен "обвалидить" узел.
VST. ValidateNode(Node, False); Иначе ты не сможешь освободить данные связанные с узлом с событии OnFreeNode и у тебя будет MemLeak
DEMs © (16.11.05 10:09)
dat.Text:='AAAAAAAA';
Вот яркий пример. В OnFreeNode - ты обязательно должен будешь сделатьFinalize(PNodeData(VST.GetNodeData(Node))^);
DEMs © (16.11.05 10:09)
TipDolg1.States:=TipDolg1.States+[vsExpanded];
TipDolg1 - это просто указатель на запись. Считай, что эта запись ReadOnly, а если ты хочешь изменить какие то свойства узла, то используй соответствующие методы дерева. В данном случае VST.Expanded[Node] := True;
В результате твой код должен будет выглядить так:
Node := Tree.AddChild(nil);
Tree.Validate(Node, False);
Data := Tree.GetNodeData(Node);
Data.Text := 'AAAAAAA'; // Я так понимаю - это у тебя заголовок узла?
Tree.InvalidateNode(Node); // Если ты меняешь заголовок узла напрямую, а не через свойство Text, то ты должен перерисовать узел
Tree.Expanded[Node] := True;
...
+ не забыть обработчик OnFreeNode
Lin7 (2005-11-16 10:43:00) [4]
> DEMs © (16.11.05 10:09)
Привет.
Без обид - проблема в нежелании разобраться, почитав help к компоненту (там ВСЁ! расписано на примере) и как следствие - в кривых ручках.
Загружаешь дерево не правильно.
Примеры с русскими комментариями см. здесь
http://forum.sources.ru/index.php?showtopic=85824&hl=virtualtreeview
http://forum.sources.ru/index.php?showtopic=101679&hl=virtualtreeview
http://forum.sources.ru/index.php?showtopic=92880&hl=virtualtreeview
http://forum.sources.ru/index.php?showtopic=94023&hl=virtualtreeview&view=showall
http://forum.sources.ru/index.php?showtopic=94023&st=0
Если не разберёшся - приведи весь код. Я на работе, если будет время - помогу.
Удачи.