{
Copyright (c) 咏南工作室
Author: 陈新光
Date: 2006.11.26
ToDo: 类别、部组业务单元
}
unit uTree;
interface
uses
sysUtils, comCtrls, db, dbClient,
forms,
iTree, //接口单元
uDm2; //数据模块
type
Ttree = class(TinterfacedObject, It)
private
dm2: Tdm2;
{增加节点}
procedure AppendNode(Tree: TTreeView; NODE: TTreeNode;
cds: TclientDataSet);
{查找节点}
function FindNode(Tree: TTreeView; s: string): TTreeNode;
public
constructor create;
destructor destroy; override;
{读取数据生成树型控件}
procedure DrawTree(Tree: Ttreeview; cds: TclientDataSet);
{得到类别数据集}
function GetType: oleVariant;
{保存类别}
procedure saveType(data: oleVariant; out ErrCount: integer);
{类别树型控件的OnClick事件代码}
procedure typeClick(node: TTreeNode; cds: TclientDataSet);
end;
implementation
{ Ttree }
constructor Ttree.create;
begin
dm2 := Tdm2.Create(nil);
end;
destructor Ttree.destroy;
begin
freeandnil(dm2);
inherited;
end;
function Ttree.FindNode(TREE: TTreeView; s: string ): TTreeNode;
var
i: Integer;
P: Pstring;
begin
result := nil;
for i := 0 to tree.items.count - 1 do
begin
P := Tree.Items[i].Data;
if P^ = s then
begin
result := Tree.Items[i];
Exit;
end;
end;
end;
procedure Ttree.DrawTree(Tree: Ttreeview; cds: TclientDataSet);
var
i: Integer;
node, pnode: TtreeNode;
begin
Tree.Items.Clear;
Tree.Items.BeginUpdate;
node := Tree.Items.GetFirstNode;
for i := 0 to cds.RecordCount - 1 do
begin
{if type_from_id = '0' then it is root node}
if cds.Fields[2].Text = '0' then
AppendNode(Tree, NODE, cds)
else
begin
pnode := FindNode(Tree, cds.Fields[2].Text);
if pnode <> nil then
AppendNode(Tree, pnode, cds);
end;
cds.Next;
end;
Tree.Items.EndUpdate;
end;
procedure Ttree.AppendNode(Tree: TTreeView; NODE: TTreeNode;
cds: TclientDataSet);
var
CatNode: TTreeNode;
P: PString;
begin
CatNode := Tree.Items.AddChild(NODE, cds.Fields[1].Text + '(' +
cds.Fields[0].Text + ')');
New(P);
P^ := cds.Fields[0].Text ;
CatNode.Data := P;
end;
function Ttree.GetType: oleVariant;
begin
if not dm2.ac.Connected then
dm2.ac.Connected := true;
dm2.adqType.Open;
result := dm2.dspType.Data;
dm2.adqType.Close;
dm2.ac.Close;
end;
procedure Ttree.saveType(data: oleVariant; out ErrCount: integer);
begin
dm2.dspType.ApplyUpdates(data, 0, ErrCount);
end;
procedure Ttree.typeClick(node: TTreeNode; cds: TclientDataSet);
var
pid: pstring;
begin
pid := Node.DATA;
if not dm2.ac.Connected then
dm2.ac.Open;
with dm2.adqType do
begin
close;
sql.Clear;
sql.Text := ' select * from type WHERE type_id= ''' + pid^ + ''' ';
open;
end;
cds.Data := dm2.dspType.Data;
dm2.adqType.Close;
dm2.ac.Close;
end;
end.
{
Copyright (c) 咏南工作室
Author: 陈新光
Date: 2006.11.26
ToDo: 类别、部组接口单元
}
unit iTree;
interface
uses
db, dbClient, comCtrls;
type
It = interface
{读取数据生成树型控件}
procedure DrawTree(Tree: Ttreeview; cds: TclientDataSet);
{得到类别数据集}
function GetType: oleVariant;
{保存类别}
procedure saveType(data: oleVariant; out ErrCount: integer);
{类别树型控件的Onchange事件代码}
procedure typeClick(node: TTreeNode; cds: TclientDataSet);
end;
implementation
end.
类别数据表设计
--类别
create table type (
type_id varchar (50) primary key ,
type_name varchar (100) not null ,
type_from_id varchar (8) not null