精华区 [关闭][返回]

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

主题:tree 问题
发信人: ringotu()
整理人: teleme(2000-12-05 19:09:57), 站内信件
【 在 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.
 

--
You may say I'm a dreamer,
but I'm not the only one.
I hope someday you can join us,
and the world will be as one.

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.142.73.41]

[关闭][返回]