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

王朝delphi·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

认真研究如下代码:DBTreeView--TreeView直接连接数据表

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.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航