0

In short, I'm trying to add Object into VirtualTreeView but am always getting error EAccessViolation at CellText I'm wondering about the reason for the error i tried to do my best but without result...

this is my attempt:

 TForm1 = class(TForm)
 private

 public

 end;

 TPerson = class;

 PPersonNode = ^TPersonNode;
 TPersonNode = record
   PersonObj: TPerson;
 end;

 TPerson = class(TObject)
 private
   FName: string;
 public
   property Name: string read FName write FName;
 end;

 procedure TForm1.Button1Click(Sender: TObject);  
 var
   PersonRec: PPersonNode;
 begin
   PersonRec := VirtualStringTree1.GetNodeData(VirtualStringTree1.AddChild(nil));
   PersonRec.PersonObj := TPerson.Create;
   PersonRec.PersonObj.Name := 'aaa'; 
 end;

 procedure TForm1.VirtualStringTree1GetNodeDataSize(Sender: TBaseVirtualTree;
   var NodeDataSize: Integer);
 begin
   NodeDataSize := SizeOf(TPersonNode);
end;

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: string);
var
   PersonRec: PPersonNode;
begin
   PersonRec := Sender.GetNodeData(Node);
   CellText := PersonRec.PersonObj.Name;
end;
S.FATEH
  • 451
  • 8
  • 16
  • I'm not familiar with TVirtualStringtree, but I'd expect here: PersonRec := VirtualStringTree1.GetNodeData(VirtualStringTree1.AddChild(VirtualStringTree1.RootNode)); >> pointing PersonRec to NIL. Same here in your code: PersonRec := VirtualStringTree1.GetNodeData(VirtualStringTree1.AddChild(nil)); – bummi Jan 03 '13 at 11:07

2 Answers2

2

It looks like the OnGetText event is being fired before the TPerson object has been created. Try checking that the object isn't nil first:

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: string);
var
   PersonRec: PPersonNode;
begin
   PersonRec := Sender.GetNodeData(Node);

   if PersonRec <> nil then  // <- check that the object has been created
     CellText := PersonRec.PersonObj.Name;
end;
norgepaul
  • 6,013
  • 4
  • 43
  • 76
0

I would change this:

procedure TForm1.Button1Click(Sender: TObject);  
var
 PersonRec: PPersonNode;
begin
 PersonRec := VirtualStringTree1.GetNodeData(VirtualStringTree1.AddChild(VirtualStringTree1.RootNode));
 PersonRec.PersonObj := TPerson.Create;
 PersonRec.PersonObj.Name := 'aaa'; 
end;

and this:

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: string);
var
 PersonRec: PPersonNode;
begin
 if Assigned(Node) then
 begin
  PersonRec := Sender.GetNodeData(Node);
  CellText := PersonRec.PersonObj.Name;
 end;
end;
AvgustinTomsic
  • 1,809
  • 16
  • 22
  • 1
    It works for me on windows 7 Delphi 2010. You have to add at least one column on VirtualStringTree1. Go to Object Inspector->Header->Columns. Otherwise you get Access Violation. Or add if Assigned(PersonRec.PersonObj) then CellText := PersonRec.PersonObj.Name; – AvgustinTomsic Jan 03 '13 at 11:18