Recent

Author Topic: [SOLVED} Virtual Strint Tree Load Error  (Read 870 times)

Pe3s

  • Hero Member
  • *****
  • Posts: 596
[SOLVED} Virtual Strint Tree Load Error
« on: July 13, 2022, 07:39:02 pm »
Hello, I have a code that saves and loads data into a Virtual String Tree, I have a question why the code causes an access violation error with more than 2 columns

Code: Pascal  [Select][+][-]
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var
  3.   FS: TStream;
  4.   CNT, I: Integer;
  5.   Node: PVirtualNode;
  6.   Data: PData;
  7. begin
  8.   VST.Clear;
  9.   FS := TFileStream.Create(Application.Location + 'baza.vst', fmOpenRead or fmShareDenyNone);
  10.   try
  11.     CNT := FS.ReadWord;
  12.     if CNT > 0 then
  13.     begin
  14.       I := 1;
  15.       while I <= CNT do
  16.       begin
  17.         Node := VST.AddChild(nil);
  18.         Data := VST.GetNodeData(Node);
  19.         FS.Read(Data^, SizeOf(TData) -2*SizeOf(String));
  20.         Data^.Imie := FS.ReadAnsiString;
  21.         Data^.Nazwisko := FS.ReadAnsiString;
  22.         Inc(I);
  23.       end;
  24.     end;
  25.   finally
  26.     FS.Free;
  27.   end;
  28. end;
  29.  
  30. procedure TForm1.Button3Click(Sender: TObject);
  31. var
  32.   FS: TStream;
  33.   Node: PVirtualNode;
  34.   Data: PData;
  35. begin
  36.   FS := TFileStream.Create(Application.Location + 'baza.vst', fmCreate or fmShareDenyWrite);
  37.   try
  38.     FS.WriteWord(VST.RootNodeCount);
  39.     Node := VST.GetFirst;
  40.     while Assigned(Node) do
  41.   begin
  42.     Data := VST.GetNodeData(Node);
  43.     FS.Write(Data^, SizeOf(TData) -2*SizeOf(String));
  44.     FS.WriteAnsiString(Data^.Imie);
  45.     FS.WriteAnsiString(Data^.Nazwisko);
  46.     Node := VST.GetNext(Node);
  47.   end;
  48.   finally
  49.     FS.Free;
  50.   end;
  51. end;
  52.  
« Last Edit: July 15, 2022, 05:25:23 pm by Pe3s »

Ericktux

  • Sr. Member
  • ****
  • Posts: 378
    • ericksystem software
Re: Virtual Strint Tree Load Error
« Reply #1 on: July 14, 2022, 02:06:43 pm »
Hello friend, I currently use this code, I hope it helps you.

Code: Pascal  [Select][+][-]
  1. procedure TForm1.VSTGetNodeDataSize(Sender: TBaseVirtualTree;
  2.   var NodeDataSize: Integer);
  3. begin
  4.   NodeDataSize := SizeOf(TData);  // important to put if error exception appears
  5. end;
  6.  
  7. procedure TForm1.VSTLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
  8.   Stream: TStream);
  9.   var
  10.     Data: Pdata;
  11.     Len: Integer;
  12.   begin
  13.     Data := VST.GetNodeData(Node);
  14.     //NewNode:=Sender.GetNodeData(Node);
  15.  
  16.         Stream.Read(Len, SizeOf(Len));
  17.   SetLength(Data^.Fnombre, Len);
  18.   Stream.Read(PChar(Data^.Fnombre)^, Len * SizeOf(Data^.Fnombre[1]));
  19.  
  20.       Stream.Read(Len, SizeOf(Len));
  21.   SetLength(Data^.Fapellido, Len);
  22.   Stream.Read(PChar(Data^.Fapellido)^, Len * SizeOf(Data^.Fapellido[1]));
  23.  
  24.       Stream.Read(Len, SizeOf(Len));
  25.   SetLength(Data^.Fedad, Len);
  26.   Stream.Read(PChar(Data^.Fedad)^, Len * SizeOf(Data^.Fedad[1]));
  27.  
  28.       Stream.Read(Len, SizeOf(Len));
  29.   SetLength(Data^.Ftrabajando, Len);
  30.   Stream.Read(PChar(Data^.Ftrabajando)^, Len * SizeOf(Data^.Ftrabajando[1]));
  31.  
  32.      //FImageIndex
  33.    //Stream.Read(PChar(Data^.FImageIndex)^, SizeOf(Data^.FImageIndex));
  34.  
  35.      // load cImageIndex
  36.   Stream.Read(Data^.FImageIndex, SizeOf(Data^.FImageIndex));
  37.   end;
  38.  
  39. procedure TForm1.VSTSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
  40.   Stream: TStream);
  41.   var
  42.      data: Pdata;
  43.      len: Integer;
  44.   begin
  45.   Data := VST.GetNodeData(Node);
  46.  
  47. Len := Length(Data^.Fnombre);
  48. Stream.Write(Len, SizeOf(Len));
  49. Stream.Write(PChar(Data^.Fnombre)^, Length(Data^.Fnombre) * SizeOf(Data^.Fnombre[1]));
  50.  
  51. Len := Length(Data^.Fapellido);
  52. Stream.Write(Len, SizeOf(Len));
  53. Stream.Write(PChar(Data^.Fapellido)^, Length(Data^.Fapellido) * SizeOf(Data^.Fapellido[1]));
  54.  
  55. Len := Length(Data^.Fedad);
  56. Stream.Write(Len, SizeOf(Len));
  57. Stream.Write(PChar(Data^.Fedad)^, Length(Data^.Fedad) * SizeOf(Data^.Fedad[1]));
  58.  
  59. Len := Length(Data^.Ftrabajando);
  60. Stream.Write(Len, SizeOf(Len));
  61. Stream.Write(PChar(Data^.Ftrabajando)^, Length(Data^.Ftrabajando) * SizeOf(Data^.Ftrabajando[1]));
  62.  
  63. //FImageIndex
  64. //Stream.Write(Data^.FImageIndex, SizeOf(Data^.FImageIndex));
  65. //Stream.Write(Data^.FImageIndex, SizeOf(Data^.FImageIndex));
  66.  
  67. // store cImageIndex
  68.   Stream.Write(Data^.FImageIndex, SizeOf(Data^.FImageIndex));
  69.   end;
  70.  
  71. procedure TForm1.Button2Click(Sender: TObject);  // botón para guardar
  72. begin
  73.   VST.SaveToFile('filename.dat');
  74.  
  75. end;
  76.  
  77. procedure TForm1.Button3Click(Sender: TObject);  // botón para abrir
  78. begin
  79.   VST.LoadFromFile('filename.dat');
  80. end;



I love desktop software
https://www.ericksystem.com

Pe3s

  • Hero Member
  • *****
  • Posts: 596
Re: Virtual Strint Tree Load Error
« Reply #2 on: July 14, 2022, 06:08:59 pm »
@Ericktux Thank you friend, I will check

Pe3s

  • Hero Member
  • *****
  • Posts: 596
Re: Virtual Strint Tree Load Error
« Reply #3 on: July 14, 2022, 09:34:00 pm »
@Ericktux The code works, I can ask for read and write hints of such types as Integer, float, TTime

 

TinyPortal © 2005-2018