Treeview 记录对应数据库中的记录,通过指针进行关连!在生成树时,将记录号分给 data 指针
这种情况下如何对Treeview 进行刷新呢? 我写的是
procedure TWdForm.ClearTree(tree: TTreeview);// 释放 指针
var
i:integer;
begin
if tree<>nil then
begin
for i:=0 to tree.Items.Count-1 do
begin
if tree.items.Item[i].Data<>nil then
begin
Dispose(tree.Items.Item[i].Data);
end; end;
tree.Items.Clear;
end;end; procedure TWdForm.E5Click(Sender: TObject);//刷新treeview
begin
ClearTree(TreeView1);
TreeView1.Visible:=false;
GetNode;//从数据库中读取数据,生成树并分配指针
TreeView1.Visible:=true;
end;当执行到 最后一句TreeView1.Visible:=true;
时出错:project document.exe raised exception class EAccessViolation with message' access violation at address 0046ef88 in module'document.exe'. Read of address 000000004' process stopped. Use Step or Run to continue.
不知是何原因!
这种情况下如何对Treeview 进行刷新呢? 我写的是
procedure TWdForm.ClearTree(tree: TTreeview);// 释放 指针
var
i:integer;
begin
if tree<>nil then
begin
for i:=0 to tree.Items.Count-1 do
begin
if tree.items.Item[i].Data<>nil then
begin
Dispose(tree.Items.Item[i].Data);
end; end;
tree.Items.Clear;
end;end; procedure TWdForm.E5Click(Sender: TObject);//刷新treeview
begin
ClearTree(TreeView1);
TreeView1.Visible:=false;
GetNode;//从数据库中读取数据,生成树并分配指针
TreeView1.Visible:=true;
end;当执行到 最后一句TreeView1.Visible:=true;
时出错:project document.exe raised exception class EAccessViolation with message' access violation at address 0046ef88 in module'document.exe'. Read of address 000000004' process stopped. Use Step or Run to continue.
不知是何原因!
id parentId xh
0004 29
00040001 0004 43
000400020002 00040002 44
0004000200020001 000400020002 45
说明:ID 为当前记录的记录号 ParentID 为当前记录的上级记录号 XH 为唯一值procedure TWdForm.GetNode;//从数据库中取数据动态生成树形结构
var
parent:string; //父级代码
qi,hi,i,tmpi:integer;
myshuju: PMyData;
begin
TreeView1.Items.Clear;
TreeView1.Items.BeginUpdate;
adoquery1.Close;
ADOQuery1.SQL.Clear;
adoquery1.SQL.Add('select id,name,parentid,xh from table2 order by id');
ADOQuery1.open; //所有记录列表
ADOQuery1.First;
while not adoquery1.Eof do
begin
parent:=ADOQuery1.Fields[2].AsString;
if parent='' then
begin
new(myshuju);
myshuju^.nIndex:=ADOQuery1.Fields[3].AsInteger;
rootNode:=TreeView1.Items.Add(nil,ADOQuery1.Fields[1].asstring);
rootNode.ImageIndex:=0;
rootNode.SelectedIndex:=0;
Nodel:=rootNode;
Nodel.Data:=myshuju; //创建根内容
//i:=integer(pmydata(Nodel.Data^));
// showmessage(inttostr(i));
qi:=length(ADOQuery1.Fields[0].asstring);//得到当前记录ID的长度
ADOQuery1.Next;
end
else
begin
hi:=length(ADOQuery1.Fields[0].asstring);//得到下一条记录ID的长度
if hi>qi then //下一条记录长度大于前一条记录,则为下级记录
begin
new(myshuju);
myshuju^.nIndex:=ADOQuery1.Fields[3].AsInteger;
TmpNode:=TreeView1.Items.AddChild(nodel,ADOQuery1.Fields[1].asstring);
qi:=hi;//length(ADOQuery1.Fields[0].asstring);
//TreeView1.Selected:=TmpNode; 如果
nodel:=tmpNode;
nodel.Data:=myshuju;
ADOQuery1.next;
end
else
if hi=qi then //记录ID长度相等,则为同级记录
begin
new(myshuju);
myshuju^.nIndex:=ADOQuery1.Fields[3].AsInteger;
TmpNode:=TreeView1.Items.AddChild(nodel.Parent,ADOQuery1.Fields[1].asstring);
//TreeView1.Selected:=TmpNode;
qi:=hi;
nodel:=TmpNode;
nodel.Data:=myshuju;
ADOQuery1.next;
end
else
begin //为上级记录
//leveli:=Nodel.Level+1; //当前记录的层次
tmpi:=round((qi-hi)/4);//两条记录相差层数
for i:=0 to tmpi do
begin
nodel:=nodel.Parent;//得到当前记录的上一个层次
end;
new(myshuju);
myshuju^.nIndex:=ADOQuery1.Fields[3].AsInteger;
TmpNode:=TreeView1.Items.AddChild(nodel,ADOQuery1.Fields[1].asstring);
qi:=hi;
//TreeView1.Selected:=TmpNode;
nodel:=TmpNode;
nodel.Data:=myshuju;
ADOQuery1.next;
end;
end;
end;
TreeView1.Items.EndUpdate;
end;