精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>控件开发和使用>>使用tree的问题

主题:使用tree的问题
发信人: 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. 
  

[关闭][返回]