捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:树 Tree 应用实例
xiaohua0851 28629 2007/4/2 10:42:09
该代码有问题,比如表中第三条记录是第六条记录的子接点,那么第3条记录就没有办法显示,现在我修改了,请大家看看还有没有什么问题:http://2ccc.com/article.asp?articleid=4011
lijianfu 20898 2006/1/12 21:30:27
我发现有个问题,如下
如果选择父类进行“删除”,(如:办公用品,卫生材料),子类的数据并没有被删除掉,虽然读取时已看不到,但可以打开数据库看一看就明白了,子类数据仍在?
另外,我认为进行添加时,可根据所选择的节点,就已知道父类了,无非是添加同级还是下级类别的问题,这样更人性化点。
在实际运用中还应考虑限制节点深度的问题,比如达到三级深度就不能再添加子类了。
chang888 20862 2006/1/11 17:43:18
可能是Connection或Query设置有问题?你检查一下。
bde也是一样的。
dglianda 20825 2006/1/10 14:05:58
CHANG888:帮帮我啦!好不好!我到现在还没搞掂呀.
你能不能用ACCESS做个BDE的贴出来给大家,好不好??谢谢!
dglianda 20735 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.
tanqth 20558 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。
chang888 20276 2005/12/23 13:50:16
你不看就什么都不用了!
youcheng 20273 2005/12/23 11:12:20
什么意思呀,难到还要让人记住一个父编号不成?
第一页 上一页 下一页 最后页 有 8 条纪录 共1页 1 - 8
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表