Правильное добавление, загрузка и сохранение узла с Delphi XE8 и VirtualStringTree
Я использую virtualstringtree для базовой функциональности дерева с флажками и т. Д.
Я использовал оригинальную документацию (с 2006 года), но получаю ошибки при загрузке сохраняемых данных, хотя дерево виртуальных строк выглядит нормально.
Я считаю, что я должен использовать InitNode
а не MAddVSTStructure
,
Может кто-нибудь предложить правильный способ добавить узел в этом контексте?
Возможно, поэтому процедуры загрузки загружают информацию, но я получаю нарушения прав доступа при нажатии на загруженные узлы.
type
PTreeData = ^TTreeData;
TTreeData = record
FCaption: String;
FRichText: String;
FImageIndex: integer;
FVisibility: integer;
FUniqueID: integer;
end;
function MAddVSTStructure(AVST: TCustomVirtualStringTree; ANode: PVirtualNode; ARecord: TTreeData): PVirtualNode;
var
Data: PTreeData;
begin
Result:= AVST.AddChild(ANode);
Result.CheckType:=ctTriStateCheckBox;
Data:= AVST.GetNodeData(Result);
Data^.FCaption:= ARecord.FCaption;
Data^.FRichText:= ARecord.FRichText;
Data^.FImageIndex:= ARecord.FImageIndex;
Data^.FVisibility:= ARecord.FVisibility;
Data^.FUniqueID:= ARecord.FUniqueID;
AVST.ValidateNode(Result, False);
end;
procedure vstSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream);
var
Data: PTreeData;
Len: integer;
begin
Data:= Sender.GetNodeData(Node);
//FCaption
Len:= Length(Data.FCaption);
Stream.Write(Len, SizeOf(Len));
Stream.Write(PChar(Data.FCaption)^, Len * SizeOf(Char));
//FRichText
Len:= Length(Data.FRichText);
Stream.Write(Len, SizeOf(Len));
Stream.Write(PChar(Data.FRichText)^, Len * SizeOf(Char));
//FImageIndex
Stream.Write(Data.FImageIndex, SizeOf(Data.FImageIndex));
//FVisibility
Stream.Write(Data.FVisibility, SizeOf(Data.FVisibility));
//FUniqueID
Stream.Write(Data.FUniqueID, SizeOf(Data.FUniqueID));
end;
procedure vstLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream);
var
Data: PTreeData;
Len: Integer;
begin
Data:= Sender.GetNodeData(Node);
//Len:= Length(Data.FCaption);
//FCaption
Stream.Read(Len, SizeOf(Len));
SetLength(Data.FCaption, Len);
Stream.Read(PChar(Data.FCaption)^, Len * SizeOf(Char) );
//FRichText
Stream.Read(Len, SizeOf(Len));
SetLength(Data.FRichText, Len);
Stream.Read(PChar(Data.FRichText)^, Len * SizeOf(Char));
//FImageIndex
Stream.Read(PChar(Data.FImageIndex)^, SizeOf(Data.FImageIndex));
//FVisibility
Stream.Read(PChar(Data.FVisibility)^, SizeOf(Data.FVisibility));
//FUniqueID
Stream.Read(PChar(Data.FUniqueID)^, SizeOf(Data.FUniqueID));
end;