WEB开发网
开发学院软件开发Delphi 我的DBTreeView--TreeView直接连接数据表 阅读

我的DBTreeView--TreeView直接连接数据表

 2006-02-04 13:50:51 来源:WEB开发网   
核心提示:unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, DBTables, ComCtrls, Grids, DBGrids, ExtCtrls,
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.

Tags:DBTreeView TreeView 直接

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接