我要用TreeView显示三级科目,每一个节点我希望显示名称,不显示ID号,但我可以随时取出。
我希望当点击一级和二级科目时根据ID号能动态地从数据库查出它的下一级科目。
刚开始我想节点的Text显示为:id_名称,这样就可以很容易取出ID号。但客户希望不显示ID号。后来我采用如下方式:
type
PCustomNode = ^TCustmoNode;
TCustmoNode = record
id: string;
name: string;
end;
TForm1 = class(TForm)
TreeView1: TTreeView;
btAdd: TButton;
Query1: TQuery;
btSelect: TButton;
procedure btAddClick(Sender: TObject);
procedure btSelectClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.btAddClick(Sender: TObject);
var
PNode: PCustomNode;
Name: string;
begin
while not query1.Eof do
begin
new(PNode);
PNode.id := query1.FieldByName('id').asString;
TreeView1.Items.AddObject(nil,query1.FieldByName('name').asString,PNode);
//dispose(PNode);
query1.next;
end;
end;procedure TForm1.btSelectClick(Sender: TObject);
var
s: string;
begin
s:= pCustomNode(TreeView1.Selected.Data)^.id;
showMessage(s);
end;end;使用这种方法可以取出ID号,而且又不显示在窗口上,但这种方法在创建节点时分配的内存该在那里释放。我试过,如果在创建节点时释放,不会出错,但取ID号时要报错.请问该不该释放内存,在那里释放
我希望当点击一级和二级科目时根据ID号能动态地从数据库查出它的下一级科目。
刚开始我想节点的Text显示为:id_名称,这样就可以很容易取出ID号。但客户希望不显示ID号。后来我采用如下方式:
type
PCustomNode = ^TCustmoNode;
TCustmoNode = record
id: string;
name: string;
end;
TForm1 = class(TForm)
TreeView1: TTreeView;
btAdd: TButton;
Query1: TQuery;
btSelect: TButton;
procedure btAddClick(Sender: TObject);
procedure btSelectClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.btAddClick(Sender: TObject);
var
PNode: PCustomNode;
Name: string;
begin
while not query1.Eof do
begin
new(PNode);
PNode.id := query1.FieldByName('id').asString;
TreeView1.Items.AddObject(nil,query1.FieldByName('name').asString,PNode);
//dispose(PNode);
query1.next;
end;
end;procedure TForm1.btSelectClick(Sender: TObject);
var
s: string;
begin
s:= pCustomNode(TreeView1.Selected.Data)^.id;
showMessage(s);
end;end;使用这种方法可以取出ID号,而且又不显示在窗口上,但这种方法在创建节点时分配的内存该在那里释放。我试过,如果在创建节点时释放,不会出错,但取ID号时要报错.请问该不该释放内存,在那里释放
for i := 0 to tv.Items.Count - 1 do
if tv.Items[i].Data <> nil then
Dispose(tv.items[i].data)
一楼的
在delphi 的在线帮助里有对函数AddObject(...)这样描述的:
function AddObject(Node: TTreeNode; const S: string; Ptr: Pointer): TTreeNode;DescriptionThe node is added as the last sibling of the node specified by the Node parameter. The S parameter specifies the Text property of the new node. The Ptr parameter specifies the Data property value of the new node. AddObject returns the node that has been added. Note: The memory referenced by Ptr is not freed when the tree nodes object is freed.最后一句话意思好象是接点释放而指针指向的内存不释放。
谢谢