发信人: 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.
|
|