我做的一个软件。我想点击添加课程按钮,只在树形控件中添加一个新结点(都在第一层中)。点击添加班级,不管当前选中是子结点还是父结点都在当前父结点下添加一个结点。(也就是添加的结点都在第二层中) 结点层次共两层。 ADO连接ACCESS数据库读取结点。   哪位高手可能指点一下,或者给点代码。   
QQ:9828453  E:[email protected]  
先送100分,不够再送!!!!!

解决方案 »

  1.   

    unit TreeFunc;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, ComCtrls, DB, Forms, Dialogs;function  TreeFindItem(Sender: TTreeView; NodeItem: TTreeNode; Name: String): TTreeNode;
    function  TreeAddItem(Sender: TTreeView; ItemList: TStrings; Book: TBook; Resort: Boolean): TTreeNode;
    function  TreeGetItem(Sender: TTreeView; ItemList: TStrings): TTreeNode;
    procedure TreeDeleteItem(Sender: TTreeView; ItemList: TStrings; Level: Integer);implementation
    function TreeAddItem(Sender: TTreeView; ItemList: TStrings; Book: TBook; Resort: Boolean): TTreeNode;
    var
    ThisNode, Node: TTreeNode;
    I: Integer;
    begin
     Node := nil;   //nil = level 0 has no parent node
                    //this is checked by TreeFindItem
     for I := 0 to Itemlist.count -1 do
     begin
          ThisNode := TreeFindItem(Sender, node, Itemlist[i]); //查找当前是否有此值
          if ThisNode <> nil then Node := ThisNode else
          begin
               if I < Itemlist.count -1 then
               begin
                    if I = 0 then Node := Sender.items.Add(Node, Itemlist[i])
                    else Node := Sender.items.AddChild(Node, Itemlist[i]);
               end else
               begin
                    if I = 0 then Node := Sender.items.AddObject(Node, Itemlist[i], Book)
                    else Node := Sender.items.AddChildObject(Node, Itemlist[i], Book);
               end;
               Node.stateIndex := Node.level + 1;
               if Resort and (Node.parent <> nil) then Node.parent.alphasort; 
          end;
     end;
     Result := Node;
    end;function TreeFindItem(Sender: TTreeView; NodeItem: TTreeNode; Name: String): TTreeNode;
    begin
     if NodeItem = nil then NodeItem := Sender.items.getfirstnode
     else NodeItem := NodeItem.getfirstchild;
    //NodeItem is now the first item of the desired level
    //if this level has no items, NodeItem is nil if (NodeItem <> nil) and (NodeItem.text <> Name) then
     repeat
           NodeItem := NodeItem.getnextsibling;
     until (NodeItem = nil) or (NodeItem.text = Name);
     Result := NodeItem;
    end;function TreeGetItem(Sender: TTreeView; ItemList: TStrings): TTreeNode;
    begin
     Result := TreeAddItem(Sender, Itemlist, nil, false);
    end;procedure TreeDeleteItem(Sender: TTreeView; ItemList: TStrings; Level: Integer);
    var
    Node, Parent: TTreeNode;
    begin
     Node := TreeGetItem(Sender, ItemList);
     while Node.level >= Level do
     begin
          Parent := Node.parent;
          Node.delete;
          if (Parent = nil) or (Parent.hasChildren) then break;
          Node := Parent;
     end;
    end;
    end.
    unit Unit1;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, DB, DBTables, ComCtrls, Grids, DBGrids, ExtCtrls,
    DBCtrls, Mask;
    type
    TForm1 = class(TForm)
    TreeView1: TTreeView;
    ImageList1: TImageList;
    DataSource1: TDataSource;
    DBEdit1: TDBEdit;
    Label1: TLabel;
    Label2: TLabel;
    DBEdit2: TDBEdit;
    Table1: TTable;
    Label3: TLabel;
    DBNavigator1: TDBNavigator;
    Label4: TLabel;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    function  GetFieldList: TStringList;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
    procedure DataSource1StateChange(Sender: TObject);
    procedure Table1AfterInsert(DataSet: TDataSet);
    procedure Table1BeforeDelete(DataSet: TDataSet);
    procedure Table1BeforeEdit(DataSet: TDataSet);
    procedure Table1AfterDelete(DataSet: TDataSet);
    procedure Table1AfterPost(DataSet: TDataSet);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;var
    Form1: TForm1;
    FieldList: TStringList;implementation
    uses TreeFunc;{$R *.DFM}
    function TForm1.GetFieldList: TStringList;
    begin
     FieldList.clear;
     FieldList.add(Table1.fieldbyname('Country').asstring);
     FieldList.add(Table1.fieldbyname('city').asstring);
     FieldList.add(Table1.fieldbyname('Company').asstring);
     Result := FieldList;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
     FieldList := TStringList.create; TreeView1.items.BeginUpdate; Table1.first;
     while not Table1.eof do
     begin
          TreeAddItem(TreeView1, GetFieldList, Table1.getBook, false);
          Table1.next;
     end; FieldList.clear;
     TreeView1.Alphasort;
     TreeView1.items.Endupdate;//make first record selected:
     TreeView1.items[2].selected := true;
    end;procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    begin
     Datasource1.enabled := Node.data <> nil;
     if DataSource1.enabled then Table1.gotobook(node.data);
    end;procedure TForm1.DataSource1StateChange(Sender: TObject);
    var
    ItemList: TStringList;
    Node: TTreeNode;
    begin
    end;procedure TForm1.Table1AfterInsert(DataSet: TDataSet);
    begin
     FieldList.clear;
    end;procedure TForm1.Table1BeforeDelete(DataSet: TDataSet);
    begin
     GetFieldList;
    end;procedure TForm1.Table1BeforeEdit(DataSet: TDataSet);
    begin
     GetFieldList;
    end;procedure TForm1.Table1AfterDelete(DataSet: TDataSet);
    var
    CascadeDeleteLevel: Integer;
    begin
     CascadeDeleteLevel := 0;
     TreeDeleteItem(TreeView1, FieldList, CascadeDeleteLevel);
    end;procedure TForm1.Table1AfterPost(DataSet: TDataSet);
    begin
     TreeView1.items.beginUpdate; if FieldList.count > 0 then TreeDeleteItem(TreeView1, Fieldlist, 0);
     TreeView1.selected := TreeAddItem(TreeView1, GetFieldlist, Table1.getbook, True); TreeView1.items.endUpdate;
    end;end.
    treefunction 为功能FUNCTION UNIT1为调用;数据库为delphi 自带例子
      

  2.   

    自己写代码控制太麻烦,可否用dxdbtreeview控件呢,就不用这么麻烦了