Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Компонент 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

Если не разберёшся - приведи весь код. Я на работе, если будет время - помогу.

Удачи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо