用TreeView遇到的问题(50分)

  • 主题发起人 主题发起人 sun2003
  • 开始时间 开始时间
S

sun2003

Unregistered / Unconfirmed
GUEST, unregistred user!
unit URecorder;

interface
type
PNodeData=^TNodeData;
TNodeData=record
NodeId:integer;
end;

implementation

end.

Public
TmpNodeData:PNodeData;

procedure TFmMain.FormShow(Sender: TObject);
begin
inherited;
with adodataset2 do
if active=false then open;

with adodataset1 do
if active=false then open;

showtv;
end;



//procedure showtv

treeview1.Items.Clear;
rootnode:=treeview1.Items.Add(nil,'信息');


with ADODataSet1 do
begin
Open;first;
new(TmpNodeData);

while not eof do
begin
TmpNodeData^.NodeId:=fieldbyname('省份id').AsInteger;
Treeview1.Items.AddChild(rootnode,fieldbyname('省份名称').AsString);
rootnode.Data:=TmpNodeData;
next;
end;

close;
end;


procedure TFmMain.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
inherited;
treeview1.Selected.SelectedIndex:=1;

if treeview1.Selected<>nil then
label1.Caption:=inttostr(pnodedata(treeview1.Selected.Data)^.NodeId);

//程序一开始运行正常,当按下TreeView1中的节点时却出错“Acess Violation
at address 004CCCAC in module 'a.exe'”,请指教。

end;
 
查了以前的贴子,好象是这么来着。可我怎么老是出错。。。。。
 
change事件里先判断
if treeview1.selected == nill then exit;
 
to chenxz:与TreeView.selected<>nil 没什么分别吧。
 
应该是这样:
type
TNodeData=class
NodeId:integer;
end;
 
是没什么分别,你因为没有判断selected是否不为空就赋他的SelectedIndex(第一句话),
这样会发生内存地址错误,因为这个地址是nil的,所以报你说的错误!!!!
 
To chenxz:可是我试了,还是报错。
 
treeview1.Selected.Data是空的啊,你在showtv中没有赋值,所以一用就会出错了
 
对TreeView怎样赋值啊,好象没地方放,所以放到rootnode中去了,见笑。还请指点一二。
 
你在TreeView的Expending事件中是如何执行的???
 
showtv

var
ChldNode:TTreeNode;

...
ChldNode := Treeview1.Items.AddChild(rootnode,fieldbyname('省份名称').AsString);
ChldNode.Data^ := 'aaa';

其实你不用定义pnodedata,直接用treenode的data就可以了
 
不行啊,因为我要找的是每一条记录,并不是一条。
 
前面说得很明白了,你只要把
treeview1.Selected.SelectedIndex:=1;
也放到treeview1.Selected<>nil后面的语句块里面就安全了。
 
每个treenode都有data的啊
 
To 一个过客:难道我这么笨,早就试过了呀
 
你是挺笨,在你这段代码里
with ADODataSet1 do
begin
Open;first;
new(TmpNodeData);

while not eof do
begin
TmpNodeData^.NodeId:=fieldbyname('省份id').AsInteger;
Treeview1.Items.AddChild(rootnode,fieldbyname('省份名称').AsString);
rootnode.Data:=TmpNodeData;
next;
end;
close;
end;
你重复给rootnode.Data赋值,不知出于什么目的
 
to chenxz:那我如何取出选中某个节点的记录呢?
 
记录指针是否和数组一样,是否可以将所有记录内容保存在指针变量里。如:TmpNodeData.nodeid。
 
怎么没人理?[:(]
 
showtv

var
ChldNode:TTreeNode;

...
ChldNode := Treeview1.Items.AddChild(rootnode,fieldbyname('省份名称').AsString);
ChldNode.Data := pointer(fieldbyname('省份id').AsString);

if treeview1.Selected<>nil then
label1.Caption:=string(treeview1.Selected.Data);

 
后退
顶部