Ustas писал(а):Не пойму, как мои данные попадают в TVirtualStringTree:
TVirtualStringTree - работает с узлами (Node), может выводить списком, таблицей, и деревом..
у него есть свой рабочий класс PVirtualNode (он же Node)..
PVirtualNode могут друг за друга цепляться, таким образом получаются цепочки, деревья.. TVirtualStringTree читает эту нить.
у PVirtualNode есть волшебное поле Data - оно нужно для того чтобы указывать на пользовательские данные (String,Integer, record.. class, TPhone);
Node:=TVirtualStringTree.AddChild(ParentNode); -- Node цепляется к ParentNode..
Phone := Sender.GetNodeData(Node); -- читает у Node поле Data, если оно nil то выделяет в памяти(куче) объем равный NodeDataSize. теперь Data указывает на память где размещено новый [TPhone]
Phone^.Name ... теперь можно работать с данным участком памяти..
Добавлено спустя 7 минут 44 секунды:Ustas писал(а):До меня никак не дойдет, где и как, данные со структурой (условно)
- Код: Выделить всё
TPhone = record
Name:String;
Number:String;
end;
- это описание структуры типа Record у его есть поля [Name,Number]
- теперь компилятор знает о TPhone и знает его размер SizeOf(TPhone)
мы указываем что пользовательские данные в ноде [Node.Data]должны иметь размер SizeOf(TPhone)
VirtualStringTree.NodeDataSize:=SizeOf(TPhone);
Phone := Sender.GetNodeData(Node); тут идет определение Node.[Data] поля, оно NIL - тогда: выделяет память размером SizeOf(TPhone) и указывает где оно в [Phone].
теперь Phone рзмещено в памяти и можно с ним работать (читать/писать)