程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 我的DBTreeView--TreeView直接連接數據表

我的DBTreeView--TreeView直接連接數據表

編輯:Delphi
unit Unit1;

  interface

  uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, DB, DBTables, ComCtrls, Grids, DBGrids, ExtCtrls,
    DBCtrls, Mask, ImgList;

  
  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;

      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
      function  GetFieldList: TStringList;
      { Private-Declarationen }
    public
      { Public-Declarationen }
    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;//forbid treeview update
       Table1.first;
       while not Table1.eof do
         begin
            TreeAddItem(TreeView1, GetFieldList, Table1.getBookmark, 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.Gotobookmark(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.getbookmark, True);

       TreeView1.items.endUpdate;
  end;

  end.
  ///------------------------
  unit TreeFunc;

  interface

  uses
    Windows, Messages, SysUtils, Classes, Graphics, ComCtrls, DB, Forms, Dialogs;

  function  TreeFindItem(Sender: TTreeView; NodeItem: TTreeNode; Name: String): TTreeNode;
  function  TreeAddItem(Sender: TTreeView; ItemList: TStrings; Bookmark: TBookmark; 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; Bookmark: TBookmark; 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 //for
            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], Bookmark)
                      else
                        Node := Sender.items.AddChildObject(Node, Itemlist[i], Bookmark);
                   end;
                 Node.stateIndex := Node.level + 1;
                 if Resort and (Node.parent <> nil) then Node.parent.alphasort;
              end;
          end; //for
       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.
  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved