【问题标题】:how to add objects to virtualtreeview如何将对象添加到virtualtreeview
【发布时间】:2013-01-03 10:23:57
【问题描述】:

简而言之,我正在尝试将 Object 添加到 VirtualTreeView 中,但在 CellText 上总是收到错误 EAccessViolation 我想知道错误的原因,我试图尽我所能但没有结果...

这是我的尝试:

 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;

【问题讨论】:

  • 我不熟悉 TVirtualStringtree,但我希望在这里:PersonRec := VirtualStringTree1.GetNodeData(VirtualStringTree1.AddChild(VirtualStringTree1.RootNode)); >> 将 PersonRec 指向 NIL。在您的代码中相同:PersonRec := VirtualStringTree1.GetNodeData(VirtualStringTree1.AddChild(nil));

标签: delphi virtualtreeview


【解决方案1】:

似乎在创建 TPerson 对象之前触发了 OnGetText 事件。尝试先检查对象不为零:

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;

【讨论】:

    【解决方案2】:

    我会改变这个:

    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;
    

    还有这个:

    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;
    

    【讨论】:

    • 它适用于 Windows 7 Delphi 2010。您必须在 VirtualStringTree1 上添加至少一列。转到对象检查器->标题->列。否则你会得到访问冲突。或者添加 if Assigned(PersonRec.PersonObj) then CellText := PersonRec.PersonObj.Name;
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2014-09-14
    • 2023-01-19
    • 2018-10-06
    • 2012-01-09
    • 2017-05-03
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多