Правильное добавление, загрузка и сохранение узла с 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;

0 ответов

Другие вопросы по тегам