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.
不知是何原因!

解决方案 »

  1.   

    是不是GetNode函数里面出的问题,跟进去看看
      

  2.   

    重启Delphi试下,有时候可以解决。嘿嘿
      

  3.   

    数据库结构为:
    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;