捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
树 Tree 应用实例
关键字:Tree 树应用 ADO 节点
来 自:原创
平 台:Win9x,Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:初级 完成时间:2005/12/16
发布者:chang888 发布时间:2005/12/22
编辑器:DELPHI7 语  种:简体中文
分 类:数据库 下载浏览:2817/17999
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
有问题请QQ:410696570
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
将数据记录直接高速生成树实例
400109 2007/12/2 下+9114/浏+18811 评+11
树 Tree 应用实例改进
xiaohua0851 2007/4/3 下+3458/浏+16181 评+0
测试一次性加载父子结构表数据到树控件
liqj 2006/12/28 下+3161/浏+11498 评+5
一张表的个人的树型结构程序例
suerwork 2006/10/24 下+2815/浏+12063 评+2
TreeView + SQL的应用
fcl91244 2006/7/25 下+4993/浏+18669 评+3
一种具有树型关系的对象管理
mrjiou 2006/5/17 下+1239/浏+11848 评+2
树 Tree 应用实例
chang888 2005/12/22 下+2817/浏+18000 评+8
快速创建树的方法 (抛弃拙劣的数据库结构和…
vvyang 2005/12/20 下+3512/浏+19816 评+52
一个创建树Tree的例子
lichina 2005/11/26 下+3138/浏+17124 评+4
树的快速创建算法 (只需读一次数据库)
tangming2811 2005/11/8 下+2/浏+18706 评+9
由特定数据库表格式(3个字段)生成TreeView树…
xvjie2002 2005/7/2 下+8007/浏+18138 评+15
用TreeView从数据库中动态装载信息
hxb_leiyuan 2005/3/15 下+5298/浏+23408 评+14
dbtree (数据库连接treeview函数)
lyq2276959 2004/12/8 下+4283/浏+22004 评+27
Treeview与数据库的联合使用实例
kwbin 2004/3/29 下+5343/浏+28798 评+39
TreeView与数据表关联应用实例
george_hu 2004/3/10 下+4606/浏+25741 评+19
相关评论
共有评论8条 当前显示最后6条评论
tanqth 2006/1/1 22:43:15
http://sms.tomore.com/2/23031.html
很好的一个DBTREE控件
用于编码树的显示,数据库中有一个编码、一个名称,就行了,编码可以用两种方式,1、编码级(treecodeformat):如224,就是说一级编码长度为2位,二级长度为2位,三级长度为4位,第四级长度不定。编码最大或为9级,最小为1级,
2、分隔符(treecoedseperate),:可用规定字符为每一级的分隔符,以该字符进行分隔,如用‘-’等。
控件主要使用方法及属性:
JsDbTree1.DataSource:=编码数据库;
JsDbTree1.DataField:=显示编码用字段;
JsDbTree1.McData:=显示名称用的字段;
JsDbTree1.Images:=显示树的图片;
JsDbTree1.Menu:=菜单按钮按下后显示的菜单;
JsDbTree1.Title.Caption:=树的名称(标题);
JsDbTree1.TreeCodeFormat:=编码级方式的编码格式;
JsDbTree1.TreeCodeSeperate:=分隔符方式的分隔字符;
JsDbTree1.TreeName:=树的根名;
JsDbTree1.ButtonMenuVisible:=是否显示菜单按钮;
JsDbTree1.ButtonCloseVisible:=是否显示关闭按钮;
JsDbTree1.ButtonRefreshVisible:=是否显示刷新按钮;
JsDbTree1.OnTreeChange:=在树选择项更改时;
JsDbTree1.TreeRefresh=控制树刷新;

支持D6、D7。
dglianda 2006/1/7 22:41:09
CHANG888:谢谢你的源码!真的很实用.
我正好要建一个产品类型管理的树结构,只是我把的你源码下载后ACCESS的ADO正常运行.
可我用INTERBASE数据库无ODBC,无法用ADO建立连接,现选用BDE的QUERY控件及DATABASE控件管理数据表,我把你的源码修改后,正常编译,按"读取"出现".. class EDBengineerror
with message 'general sql  error unexpected end of  command'process stop,...
帮我看看改后的源码,哪里出错啦,谢谢!

nit TREE_new;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, ComCtrls, DB, ADODB, StdCtrls, DBTables;

type
  Tnew_tree = class(TForm)
    ImageList1: TImageList;
    TreeView1: TTreeView;
    EdtId: TEdit;
    EdtName: TEdit;
    EdtFid: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    BtnSave: TButton;
    BtnClear: TButton;
    BtnEdit: TButton;
    BtnDelete: TButton;
    BtnAdd: TButton;
    BtnExit: TButton;
    Button3: TButton;
    GFTConnection1: TDatabase;
    ADOQ_Tree: TQuery;
    Function AddNode(TreeView:TTreeView;Node:TTreeNode;ADOQ:TQuery):TTreeNode;
    Function SearchNode(TreeView:TTreeView;Txts:String):TTreeNode;
    Procedure ShowTree(TreeView:TTreeView;ADOQ:TQuery);
    Procedure BtnEnabled(Btn:Boolean=True);
    procedure BtnClearClick(Sender: TObject);
    procedure EdtIdExit(Sender: TObject);
    procedure EdtNameExit(Sender: TObject);
    procedure BtnAddClick(Sender: TObject);
    procedure BtnEditClick(Sender: TObject);
    procedure BtnSaveClick(Sender: TObject);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
    procedure BtnDeleteClick(Sender: TObject);
    procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure CopyNodeUnder(TreeView:TTreeview;SourceNode,TargetNode:TtreeNode);
    procedure Button3Click(Sender: TObject);
    procedure BtnExitClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Procedure Init();
    Procedure Clear_Edt();
    Function Exec_SQL(Que:TQuery;Text:String;Flag:Boolean=True):Boolean;   //运行时不认
  end;

var
  new_tree: Tnew_tree;
  str,tempstr,tempname:string;

implementation

{$R *.dfm}
Function Tnew_tree.AddNode(TreeView:TTreeview;Node:TTreeNode;ADOQ:TQuery):TTreeNode;
var
  Node1:TTreeNode;
  s:PString;
begin
  Node1:=TreeView.Items.AddChild(Node,ADOQ.FieldByName('name').Text+'('+
    ADOQ.FieldByName('id').Text+')');
  New(s);
  s^:=ADOQ.FieldByName('id').Text;
  Node1.Data:=s;
  Result:=Node1;
end;

Function Tnew_tree.SearchNode(TreeView:TTreeView;Txts:String):TTreeNode;
var
  i:integer;
  s:PString;
begin
  Result:=nil;
  For i:=0 To TreeView.Items.Count-1 Do
    begin
      s:=TreeView.Items[i].Data;
      If s^=Txts Then
        begin
          Result:=TreeView.Items[i];
          Exit;
        end;
    end;
end;

Procedure Tnew_tree.ShowTree(TreeView:TTreeView;ADOQ:TQuery);
var
  i,Rec_Num:integer;
  Node1,Node2:TTreeNode;
begin
  TreeView.Items.Clear;
  TreeView.Items.BeginUpdate;
  Node1:=TreeView.Items.GetFirstNode;
  Exec_SQL(ADOQ,'Select * From product_type Order By pid,id',True);
  If ADOQ.RecordCount>0 Then
  Begin
    Rec_Num:= ADOQ.RecordCount;
    For i:=0 To Rec_Num-1 Do
    begin
      If ADOQ.FieldByName('pid').Text='0' Then
        Node2:=AddNode(TreeView,Node1,ADOQ)
      Else
        begin
          Node2:=SearchNode(TreeView,ADOQ.FieldByName('pid').Text);
          If Node2<>nil Then
          AddNode(TreeView,Node2,ADOQ);
        end;
        ADOQ.Next;
      end;
   End;
   TreeView.Items.EndUpdate;
end;

Procedure Tnew_tree.BtnEnabled(Btn:Boolean=True);
begin
  BtnSave.Enabled:=not Btn;
  BtnAdd.Enabled:=Btn;
  Btndelete.Enabled:=Btn;
  BtnExit.Enabled:=Btn;
  BtnEdit.Enabled:=Btn;
  BtnClear.Enabled:=not Btn;
  EdtId.Enabled:=not Btn;
  EdtName.Enabled:=not Btn;
  EdtFid.Enabled:=not Btn;
end;

procedure Tnew_tree.BtnClearClick(Sender: TObject);
begin
  Init();
  Clear_Edt;
end;

procedure Tnew_tree.EdtIdExit(Sender: TObject);
  Function Rec:Boolean;
  Var
    ADOQ:TQuery;
  begin
    ADOQ:=TQuery.Create(self);
    With ADOQ Do
      begin
        DATABASENAME:=GFTConnection1.databasename;
        SQL.Text:='select * from product_type  where id='''+EdtId.Text+'''';
        Open;
        Result:=RecordCount>0;
        Free;
      end;

  end;
begin
  If (Rec) Then
    begin
       Application.MessageBox('记录已存在请重新输入?', '提示', MB_OK);
       EdtId.SelectAll;
    end;
end;

procedure Tnew_tree.EdtNameExit(Sender: TObject);
begin
  If (Trim(EdtName.Text)='')And(Trim(Edtid.Text)<>'') then
    begin
      Application.MessageBox('名称不能为空白!','警告',48);
      EdtName.SetFocus;
    end;
end;

procedure Tnew_tree.BtnAddClick(Sender: TObject);
begin
  BtnEnabled(False);
  str:='增加';
end;

procedure Tnew_tree.BtnEditClick(Sender: TObject);
var
  Sql_Txt:String;
begin
  BtnEnabled(False);
  str:='修改';
  Sql_Txt:='select * from product_type where id='''+tempstr+'''';
  Exec_SQL(ADOQ_Tree,Sql_Txt,True);
  Edtid.Text:=ADOQ_Tree.FieldValues['id'];
  EdtName.Text:=ADOQ_Tree.FieldValues['name'];
  EdtFid.Text:=ADOQ_Tree.FieldValues['pid'];
end;

procedure Tnew_tree.BtnSaveClick(Sender: TObject);
var
  Sql_Txt:string;
begin
  If EdtFid.Text='' then EdtFid.Text:='0';
  If str='增加' Then
    Try
      Sql_Txt:='insert into product_type  values('''+Edtid.Text
        +''','''+Edtname.Text+''','''+EdtFid.Text+''')';
      Exec_SQL(ADOQ_Tree,Sql_Txt,False);
    Except
      Application.MessageBox('记录增加失败!!!','提示信息',0);
    end;
  If str='修改' Then
    Try
      Sql_Txt:='update product_type  set id='''+Edtid.Text
        +''',name='''+Edtname.Text+''',pid='''+EdtFid.Text
        +''' Where id='''+tempstr+'''';
      Exec_SQL(ADOQ_Tree,Sql_Txt,False);
    Except
      Application.MessageBox('记录修改失败!!!','提示信息',0);
    end;
  Button3Click(nil);
end;

procedure Tnew_tree.TreeView1Change(Sender: TObject; Node: TTreeNode);
var
  Pid:PString;
  Sql_Txt:String;
begin
    Pid:=Node.Data;
    Sql_Txt:= 'select * from product_type  where id='''+Pid^+'''';
    Exec_SQL(ADOQ_Tree,Sql_Txt,True);
    tempstr:=ADOQ_Tree.FieldByName('id').Text;
    tempname:=ADOQ_Tree.FieldByName('name').Text;
end;

procedure Tnew_tree.BtnDeleteClick(Sender: TObject);
var
   Sql_Txt:String;
begin
  If MessageDlg('你确认删除该记录吗?',mtWarning,[mbYES,mbNO],0)=mrYES then
  try
    Sql_Txt:= 'delete from product_type  where id='''+tempstr+'''';
    Exec_SQL(ADOQ_Tree,Sql_Txt,False);
    Init();
  Except
    Application.MessageBox('删除失败!!!','提示',0);
  end;
end;

procedure Tnew_tree.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var
  TargetNode,SourceNode:TTreeNode;
begin
  TargetNode:=TreeView1.GetNodeAt(X,Y);
  If (Source=Sender) and (TargetNode<>nil) then
    begin
      Accept:=True;
      SourceNode:=TreeView1.Selected;
      while (TargetNode.Parent<>nil) and (TargetNode <> SourceNode) do
        TargetNode:=TargetNode.Parent;
        if (TargetNode = SourceNode) then Accept:=False;
    end
  else Accept:=False;
end;

procedure Tnew_tree.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  targetnode,sourcenode:TTreenode;
  Pstr:Pstring;
  Sql_Txt:String;
begin
  TargetNode:=TreeView1.GetNodeAt(x,y);
  SourceNode:=TreeView1.Selected;
  Pstr:=TargetNode.Data;
  Sql_Txt:= 'update product_type  set pid='''+Pstr^+''' where id='''+tempstr+'''';
  Exec_SQL(ADOQ_Tree,Sql_Txt,False);
  TreeView1.Items.BeginUpdate;
  try
    CopyNodeUnder(TreeView1,SourceNode,TargetNode);
    TreeView1.Selected:=TargetNode;
  finally
    TreeView1.Items.EndUpdate;
  end;
end;

procedure Tnew_tree.CopyNodeUnder(TreeView:TTreeView;SourceNode,TargetNode:TtreeNode);
var
  Node:TTreeNode;
  i:integer;
begin
  Node:=TreeView.Items.AddChildFirst(TargetNode,'');
  Node.Assign(SourceNode);
  for i:=SourceNode.Count-1 downto 0 do
    begin
      CopyNodeUnder(Treeview,SourceNode.Item[i],Node);
    end;
  TreeView.Items.Delete(SourceNode);
end;


procedure Tnew_tree.Init;
begin
  ShowTree(TreeView1,ADOQ_Tree);
end;

procedure Tnew_tree.Button3Click(Sender: TObject);
begin
    Init();
    Clear_Edt;
end;

procedure Tnew_tree.BtnExitClick(Sender: TObject);
begin
    Close;
end;

procedure Tnew_tree.Clear_Edt;
begin
  EdtId.Text:='';
  EdtName.Text:='';
  EdtFid.Text:='';
  str:='';
  tempstr:='';
  BtnEnabled();
end;

Function Tnew_tree.Exec_SQL(Que:TQuery;Text:String;Flag:Boolean=True):Boolean;
Begin
    With Que Do
    begin
      Close;
      Sql.Clear;
      Sql.Add(Text);
      If Flag Then
          Open
      Else
          ExecSQL;
    end;
End;
end.
dglianda 2006/1/10 14:05:58
CHANG888:帮帮我啦!好不好!我到现在还没搞掂呀.
你能不能用ACCESS做个BDE的贴出来给大家,好不好??谢谢!
chang888 2006/1/11 17:43:18
可能是Connection或Query设置有问题?你检查一下。
bde也是一样的。
lijianfu 2006/1/12 21:30:27
我发现有个问题,如下
如果选择父类进行“删除”,(如:办公用品,卫生材料),子类的数据并没有被删除掉,虽然读取时已看不到,但可以打开数据库看一看就明白了,子类数据仍在?
另外,我认为进行添加时,可根据所选择的节点,就已知道父类了,无非是添加同级还是下级类别的问题,这样更人性化点。
在实际运用中还应考虑限制节点深度的问题,比如达到三级深度就不能再添加子类了。
xiaohua0851 2007/4/2 10:42:09
该代码有问题,比如表中第三条记录是第六条记录的子接点,那么第3条记录就没有办法显示,现在我修改了,请大家看看还有没有什么问题:http://2ccc.com/article.asp?articleid=4011
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表