想给TTreeView控件中节点node增加一个属性?可以吗?(50分)

  • 主题发起人 主题发起人 noall
  • 开始时间 开始时间
N

noall

Unregistered / Unconfirmed
GUEST, unregistred user!
节点node是属于TTreeNode
那我在TTreeNode = class(TPersistent)中增加了一个属性
fmyint:INteger;

property myint :integer read fmyintwrite fmyint

现在应该如何编译使node有自己增加的属性呢?谢谢!!!;
 
TTreeNode 都有一个Data属性,它是一个指针,可以指向任何对象或者数据结构。你可以用
它做很多文章的。比如:
Interface
type PTreeData = ^TTreeData;
TTreeData = Record
Name,Alias:string;
ID:Integer;
end;

implementation
begin
new(PTreeData);
PTreeData.Name:='asdf';
PTreeData.Alias:='asdfdd';
PTreeData.ID:=1;
NewNode.Data:=PTreeData;
showMessage(PTreeData(NewNode.Data).Name);
end;
如果你要直接改TTreeNode肯定是不行的啦。至少也要继承,如果只是要这样一个属性的话,
也没有必要了。
只是这个指针指向的内容在TTreeNode释放的时候不会跟着释放,要自己动手了(最好Try住)。
 
谢谢agaric,其实我本来是用data来做的,但用data来做太麻烦了,所以想增加一个属性,
因为在我的程序里较多用Ttreeview该控件。

如果是继承的,那应该如何操作,使TTreeview该控件的节点node属性可以增加一个属性呢?
 
采用agaric的方法也比较好,也不是很麻烦
 
继承的话,不能光继承TTreeNode,因为TTreeView的Item是不能直接赋值的,所以也要从
TCustomTreeView继承TreeView,主要是CreateNode函数。
代码大概如下:
type
TMyTreeNode = class(TTreeNode)
private
FindexData: integer;
public
property indexData:integer read FindexData write FindexData;
destructor Destroy; override;
end;
TMyTreeview = class(TCustomTreeView)
private
protected
function CreateNode: TTreeNode; override;
public
end;
implementation
function TMyTreeview.CreateNode: TTreeNode;
begin
Result := TMyTreeNode.Create(Items);
end;

我测了一下,也没有什么错误,但是不能完全保证。
其实你可以考虑一下用其他的TreeView,比如fcTreeView,它功能强大而且速度更快。
 
我自己改写了Delphi 5 下的 TreeView 单元,
写了个 TMyTreeView 类,但 TTreeNode 也要被改为 TMyTreeNode
在 Delphi 6 下也能用,但有 warning
增加了 DBID(数据库唯一键), Data 指向的是从 TObject 继承的类(可放自己的数据),
Delete Node 时,自动 Free Data

当然我还写了个和 MyTreeView 联动的 TMyListView
需要请 Mail koyochen@sina.com

建议你从网上找一找其他的 TreeView ,也许有好用的
 
接受答案了.
 
后退
顶部