|
Help에 있는 부분을 발취한건데요...이해가 잘 가지 않네요..
For saving the tree the procedure
procedure TBaseVirtualTree.SaveToFile(const FileName: TFileName);
is called. Thereby the structure of the tree is automatically stored. In order to save our additional data there is an event
OnSaveNode where we can simply store our data into the provided stream.
property OnSaveNode: TVTSaveNodeEvent read FOnSaveNode write FOnSaveNode;
If OnSaveNode is triggered then the method SaveNode of the particular node class will be called:
procedure TMyForm.MyTreeSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream);
begin
PTreeData(Sender.GetNodeData(Node)).BasicND.SaveToFile(Stream);
end;
In the SaveNode method of the class fields like node name, image index etc. are stored in the tree:
//-------------------------------------------------------------------Save Node
procedure TBasicNodeData.SaveNode(Stream: TStream);
var
size: Integer;
begin
// save type of the node
Stream.Write(Art, SizeOf(Art));
// store cName
Size := Length(cName) + 1; // include terminating #0
Stream.Write(Size, SizeOf(Size)); // store length of the string
Stream.Write(PChar(cName)^, Size); // now the string itself
// store cImageIndex
Stream.Write(cImageIndex, SizeOf(cImageIndex));
// store cImageIndexFocus
Stream.Write(cImageIndexFocus, SizeOf(cImageIndexFocus));
Virtual Treeview step by step Virtual Treeview
// store cChildrenAllowed
Stream.Write(cChildrenAllowed, SizeOf(cChildrenAllowed));
end;
//---------------------------------------------------------------------Load
try
// load tree
MyTree.LoadFromFile(MainControlForm.Filename);
except
on E: Exception do
begin
Application.MessageBox(PChar(E.Message), PChar('Error while loading.'), MB_OK);
MainControlForm.Filename := '';
// create tree with top level node (since loading failed)
Node := MyTree.AddChild(nil);
NodeD := MyTree.GetNodeData(Node);
NodeD.BasicND := TBasicNodeData.Create('new project');
end;
end;
//------------------------------------------------------------------------------OnLoadNode Event
By the call of LoadFromFile the event OnLoadNode will be triggered and consequently the method LoadNode:
procedure TBasicNodeData.LoadNode(Stream: TStream);
var
Size: Integer;
StrBuffer: PChar;
begin
// load cName
Stream.Read(Size, SizeOf(Size)); // length of the string
StrBuffer := AllocMem(Size); // get temporary memory
Stream.Read(StrBuffer^, Size); // read the string
cName := StrBuffer;
FreeMem(StrBuffer);
// Alternatively you can simply use:
// SetLength(cName, Size);
// Stream.Read(PChar(cName)^, Size);
// load cImageIndex
Stream.Read(cImageIndex, SizeOf(cImageIndex));
// load cImageIndexFocus
Stream.Read(cImageIndexFocus, SizeOf(cImageIndexFocus));
// load cChildrenAllowed
Stream.Read(cChildrenAllowed, SizeOf(cChildrenAllowed));
end;
|