发信人: hawkliu@GZ() 
整理人: delfan(2001-03-30 21:55:10), 站内信件
 | 
 
 
标  题: tree 问题
 发信站: 网易虚拟社区 (Mon Aug 14 16:48:48 2000), 站内信件
 
 我用tree 控件时动态添加数据库数据
 出现
 raised exception class EAccessViolation
 with message 'access violation ' at address BFF7A125 
 in module 'kernel32.dll'
 这是怎么回事?
 
 //************************************************
 
 标  题: Re: tree 问题
 发信站: 网易虚拟社区 (Mon Aug 14 17:40:52 2000), 站内信件
 
 【 在 ringotu (ringo) 的大作中提到: 】 
 : 【 在 hawkliu (hawk) 的大作中提到: 】 
 : : 我用tree 控件时动态添加数据库数据 
 : : 出现 
 : : raised exception class EAccessViolation 
 :    ....... 
 rocedure TForm1.Button1Click(Sender: TObject); 
 VAR 
 s1,s2,s3,s4,sn: integer; 
 getid,i: integer; 
 root1,node1,node2,node3: TfcTreeNode; 
 begin 
  s1:=0; 
  s2:=0; 
  s3:=0; 
  s4:=0; 
  sn:=0; 
  TB1.First ; 
  tv1.Items.BeginUpdate; 
  FOR I:=1 TO TB1.RecordCount-1 DO 
  BEGIN 
  getid:=0; 
  getid:=TB1.Fields[0].AsInteger; 
  SHOWMESSAGE(INTTOSTR(GETID)); 
  tv1.Items.add(nil,tb1.fields[6].asstring); 
  { 
  IF getid=0 then root1:=tv1.Items.Add(nil,tb1.fields[6].asstring) 
  ELSE  BEGIN 
         s1:=getid div (256*256*256); 
         sn:=getid mod (256*256*256); 
          if sn=0 then 
                 node1:=tv1.items.add(root1,tb1.fields[6].asstring) 
           else  begin 
                    s2:=sn div (256*256); 
                    sn:=sn mod (256*256); 
                     if sn=0 then node2:=tv1.Items.AddChildFirst(node1,
 tb1.Fields[6].asstring) 
                      else begin 
                           s3:=sn div 256; 
                           sn:=sn mod 256; 
                              if sn=0 then node3:=tv1.items.AddChildFir
 st(node2,tb1.fields[6].asstring) 
                             else 
                          tv1.items.add(node3,TB1.fields[6].asstring);
 
                            end; 
                  end; 
           END;} 
    TB1.Next ; 
  END; 
  tv1.Items.EndUpdate ; 
 end; 
 //********************************************
 标  题: Re: tree 问题
 发信站: 网易虚拟社区 (Tue Aug 15 13:09:49 2000), 站内信件
 
 【 在 hawkliu (hawk) 的大作中提到: 】 
 : 【 在 ringotu (ringo) 的大作中提到: 】 
 : : 【 在 hawkliu (hawk) 的大作中提到: 】 
 : :    ....... 
 : rocedure TForm1.Button1Click(Sender: TObject); 
 :    ....... 
 
 看你的代码,估计你是用getid来标识节点的级数,但是我看不到你是如何标识某
 个节点的父节点的,通常来说,构造树,都是需要用到递归算法的,这样做从理
 论上可以构造出n级的树,只是受到堆栈容量的限制而已。 
 
 下面是我的数据库结构,以及代码。代码中,首先将所有的节点从数据库中读入
 到内存,使用一个TmyTreeNode类,以及一个数组来维护。 
 
 数据库结构: Create table test_tree(id varchar(10) not null, 
                                    parentid varchar(10), 
                                    name varchar(32), 
                                    primary key (id)) 
 
 代码的pas文件: 
 
 unit DBtree; 
 
 interface 
 
 uses 
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dia
 logs, 
   ComCtrls, StdCtrls, Db, DBTables; 
 
 type 
 
   TMyTreeNode = class 
   public 
     id: String; 
     Parentid: String; 
     Name: String; 
     added: Boolean;  //to special wether this node has been added into
  the tree; 
     constructor Create(Aid, AParentid, AName: String); 
    end; 
 
   TForm1 = class(TForm) 
     tv: TTreeView; 
     Table1: TTable; 
     Button1: TButton; 
     procedure Button1Click(Sender: TObject); 
   private 
     Nodearr: array of TMyTreeNode; 
     function AddANode(MyTreeNode: TMyTreeNode): TTreeNode; 
   public 
     { Public declarations } 
   end; 
 
 var 
   Form1: TForm1; 
 
 implementation 
 
 {$R *.DFM} 
 
 constructor TMytreeNode.Create(Aid, AParentid, AName: String); 
 begin 
   inherited Create; 
   id := Aid; 
   Parentid := AParentid; 
   Name := AName; 
   Added := false; 
 end; 
 
 function TForm1.AddANode(MyTreeNode: TMyTreeNode): TTreeNode; 
 var 
   i: Integer; 
   parentNode: TTreeNode; 
 begin 
   if MyTreeNode.Added then 
   begin 
     for i := 0 to tv.Items.count - 1 do 
       if TMyTreeNode(tv.Items[i].data).id = MyTreeNode.id then 
       begin 
         Result := tv.Items[i]; 
         break; 
       end; 
   end else 
   begin 
     for i := 0 to Length(Nodearr) - 1 do 
       if Nodearr[i].id = MyTreeNode.parentid then 
       begin 
         parentNode := AddaNode(Nodearr[i]); 
         break; 
       end; 
      MyTreeNode.Added := True; 
      Result := tv.Items.AddChildObject(parentNode, MyTreeNode.Name, My
 treeNode); 
   end; 
 end; 
 
 procedure TForm1.Button1Click(Sender: TObject); 
 var 
   i: Integer; 
 begin 
   Table1.OPen; 
   Table1.First; 
   SetLength(Nodearr, 0); 
   while not table1.Eof do 
   begin 
     SetLength(Nodearr, Length(Nodearr) + 1); 
     Nodearr[High(Nodearr)] := TMyTreeNode.Create(table1.FieldByName('i
 d').AsString, 
                               table1.FieldByName('parentid').AsString,
 
                               table1.FieldByName('id').AsString); 
 
     Table1.Next; 
   end; 
   for i := 0 to high(Nodearr) do if not Nodearr[i].Added then addANode
 (Nodearr[i]); 
 end; 
 
 end. 
   
  | 
 
 
 |