DataSetToTreeView

{
 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 

转载于:https://www.cnblogs.com/hnxxcxg/archive/2008/04/02/2941043.html

BDS2006下编译通过。 有没有使用过Adobe Photoshop如果用过,你就会对插件的概念比较熟悉。对外行人来说,插件仅仅是从外部提供给应用程序的代码块而已(举个例子来说,在一个DLL中)。一个插件和一个普通DLL之间的差异在于插件具有扩展父应用程序功能的能力。例如,Photoshop本身并不具备进行大量的图像处理功能。插件的加入使其获得了产生诸如模糊、斑点,以及其他所有风格的奇怪效果,而其中任何一项功能都不是父应用程序自身所具有的。 对于图像处理程序来说这很不错,可是为什么要花偌大的力气去完成支持插件的商业应用程序呢?假设,我们举个例子,你的应用程序要产生一些报表。你的客户肯定会一直要求更新或者增加新的报表。你可以使用一个诸如Report Smith的外部报表生成器,这是个不怎么样的解决方案,需要发布附加的文件,要对用户进行额外的培训,等等。你也可以使用QuickReport,不过这会使你身处版本控制的噩梦之中——如果每改变一次字体你就要Rebuild你的应用程序的话。 然而,只要你把报表做到插件中,你就可以使用它。需要一个新的报表吗?没问题,只要安装一个DLL,下次应用程序启动时就会看见它了。另外一个例子是处理来自外部设备(比如条形码扫描器)的数据的应用程序,为了给用户更多的选择,你不得不支持半打的各种设备。通过将每种设备接口处理例程写成插件,不用对父应用程序作任何变动就可以获得最大程度的可伸缩性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值