Delphi自定义TTreeNode

Delphi自定义TTreeNode,delphi,treeview,treenode,Delphi,Treeview,Treenode,我正在尝试创建我的自定义TTreeNode类 比如说 TCustomTreeNode = class(TTreeNode) private public Comment:string; end; 我在树状视图中创建并添加节点,如下所示: var NewCustomTreeNode:TCustomTreeNode; begin NewCustomTreeNode:= TCustomTreeNode.Create(TreeView.Items); NewCustom

我正在尝试创建我的自定义TTreeNode类

比如说

TCustomTreeNode = class(TTreeNode)
  private
  public
    Comment:string;
  end;
我在树状视图中创建并添加节点,如下所示:

var
  NewCustomTreeNode:TCustomTreeNode;
begin
  NewCustomTreeNode:= TCustomTreeNode.Create(TreeView.Items);
  NewCustomTreeNode.Comment:='blqblq';
  TreeView.Items.AddChild(NewCustomTreeNode,'NodeText');
TCustomTreeNode(TreeNode).Comment:='asdadssadas';
当我尝试访问自定义创建的树节点时,会弹出错误。例如,我确实喜欢这样:

var
  NewCustomTreeNode:TCustomTreeNode;
begin
  NewCustomTreeNode:= TCustomTreeNode.Create(TreeView.Items);
  NewCustomTreeNode.Comment:='blqblq';
  TreeView.Items.AddChild(NewCustomTreeNode,'NodeText');
TCustomTreeNode(TreeNode).Comment:='asdadssadas';

plase help

代码的问题是调用
AddChild
会导致树视图创建新节点。由于您没有告诉树视图创建子类的节点,因此它创建了一个普通的
treenode
。然后,当你试图将它转换为一个
TCustomTreeNode
,世界就结束了

您需要使用
OnCreateNodeClass
方法来确保树视图能够创建新节点。像这样:

type
  TCustomTreeNode = class(TTreeNode)
  protected
    procedure Assign(Source: TPersistent); override;
  public
    Comment: string;
  end;

procedure TCustomTreeNode.Assign(Source: TPersistent);
begin
  if Source is TCustomTreeNode then
    Comment := TCustomTreeNode(Source).Comment;
  inherited;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
  NewNode: TCustomTreeNode;
begin
  NewNode := TreeView1.Items.Add(nil, 'Node1') as TCustomTreeNode;
  NewNode.Comment := 'A comment';
  NewNode := TreeView1.Items.Add(nil, 'Node2') as TCustomTreeNode;
  NewNode.Comment := 'Another comment';
end;

procedure TForm1.TreeView1Click(Sender: TObject);
var
  Node: TCustomTreeNode;
begin
  Node := TreeView1.Selected as TCustomTreeNode;
  if Assigned(Node) then
    ShowMessage(Node.Comment);
end;

procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
begin
  NodeClass := TCustomTreeNode;
end;
我不能说自己是世界上最伟大的Delphi树视图专家,但以我的经验,你从来没有自己创建过树节点。您应该始终调用
t预览.Items
上的
AddXXX
方法之一来创建新节点