一个设备管理系统,设备有多种类型,每种类型有多种型号,类型和型号都不确定,
要求能增加设备类型和型号,通过Treeview的拖动改变(包容和并列)关系,最好要有库表的设计说明和程序,(包括节点的编码说明),满意的话可加到500分

解决方案 »

  1.   

    i send to you to nextday
      

  2.   

    我也想要一份!可以吗?
    [email protected]
      

  3.   

    type
      PMyRecord = ^MyRecord;
      MyRecord = record
               ID : integer;
               Name:string;
               ParentID : integer;
    end;//end of recordprocedure  TfrmKhlxGl.pCreateTreeView(Node:TTreeNode;ParentID:integer;
              AtvnViewNode:TTreeView;AadoConnection:TADOConnection;AstrSQL:String;
              AImageIndex,ASelectedIndex:Integer;AstrFieldName:String);
    var
      tmpNode : TTreeNode;
      ADOTree : TADOQuery;
      p : PMyRecord;
    begin
      ADOTree := TADOQuery.Create(self);
      ADOTree.Connection := AadoConnection;
      ADOTree.close;
      ADOTree.SQL.clear;
     //SELECT lx_bh, lx_mc,lx_parentID FROM ESMDqxlx_1 
      
      ADOTree.SQL.Text := AstrSQL+' where '+AstrFieldName +' ='+inttostr(ParentID);
      ADOTree.open;
      if ADOTree.recordcount > 0  then
      begin
        ADOTree.First;
        while not ADOTree.Eof do
        begin
          new(p);
          p.ID := ADOTree.Fields[0].AsInteger;
          p.name :=ADOTree.Fields[1].AsString;
          p.ParentID := ADOTree.Fields[2].AsInteger;
          tmpNode := AtvnViewNode.Items.AddChildObject(Node,p.name,p);
          
          if  AtvnViewNode.Images<>nil then  //有图标时设置图标
           begin
             tmpNode.SelectedIndex := ASelectedIndex; //选中时图标
             tmpNode.ImageIndex := AImageIndex;       //没选中时图标
           end;  {== End If ==}
           
          pCreateTreeView(tmpNode,ADOTree.Fields[0].AsInteger,AtvnViewNode,AadoConnection,AstrSQL,16,17,AstrFieldName);
          ADOTree.next;
          //dispose(p);//一定要去掉这条语句,不然的话,Treeview中的Data也被dispose掉了。
        end;
      end;
      ADOTree.Free;
    end;
      

  4.   

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ESMDqxlx_1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[ESMDqxlx_1]
    GOCREATE TABLE [dbo].[ESMDqxlx_1] (
    [lx_bh] [bigint] IDENTITY (1, 1) NOT NULL ,
    [lx_mc] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
    [lx_bz] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
    [lx_ParentID] [bigint] NULL ,
    [lx_jb] [int] NULL 
    ) ON [PRIMARY]
    GO
      

  5.   

    begin
      dbTreeCodeTable.active:=false;
      cdsCodeTableTree.close;
      cdsCodeTableTree.sql.text:='select * from m_codeTable_info order by ct_code';
      cdsCodeTableTree.open;
      if cdsCodeTableTree.active then
      begin
        dbTreeCodeTable.Active:=true;
        dbTreeCodeTable.FullExpand;
      end;
    end;
      

  6.   

    我也想要一份!可以吗?
    [email protected]
      

  7.   

    未搞掂?用1stclass控件的fcdbTreeview吧
      

  8.   

    以前做过一个,感觉跟你的有点像,根据条件从表中读出关键字段生成树
    procedure TFrm_wjTree.ShowMsc(Nodex:  TTreeNode; Ls_ssds: string; I:integer);
      var BscNode,BtsNode,CellNode: array[0..500]of TTreeNode;
          MS,BS,BT,CE :Integer;
          NewNode: array[0..500]of TTreeNode;
    begin
      MS:=1;BS:=1;BT:=1;CE:=1;
      with AdoQuery1 do
        begin
          AdoQuery1.close;
          AdoQuery1.sql.Clear;
          AdoQuery1.sql.Add('select WX_MSCMC from WX_MSCXX where WX_SSDS=:SSDS order by wx_mscmc');
          AdoQuery1.Parameters.ParamByName('SSDS').Value:=Ls_ssds;
          AdoQuery1.open;
          AdoQuery1.first;
          while not AdoQuery1.eof do
            begin
              NewNode[MS]:=TV.Items.AddChild(Nodex,AdoQuery1.FieldByName('WX_MSCMC').AsString);
              NewNode[MS].ImageIndex:=1;
              begin
              with AdoQuery2 do
                begin
                  AdoQuery2.close;
                  AdoQuery2.sql.Clear;
                  AdoQuery2.sql.Add('select WX_BSCMC from WX_BSCXX where WX_SSMSC=:SSMSC order by wx_bscmc');
                  AdoQuery2.Parameters.ParamByName('SSMSC').Value:=AdoQuery1.FieldByName('WX_MSCMC').AsString;
                  AdoQuery2.Open;
                  AdoQuery2.First;
                  while not AdoQuery2.eof do
                  begin
                    BscNode[BS]:=TV.Items.AddChild(NewNode[MS],AdoQuery2.FieldByName('WX_BSCMC').AsString);
                    BscNode[BS].ImageIndex:=1;
                    begin
                    with AdoQuery3 do
                      begin
                        AdoQuery3.close;
                        AdoQuery3.sql.Clear;
                        AdoQuery3.sql.Add('select WX_JZMC from WX_JZXX where WX_GSBSC=:GSBSC order by wx_jzmc');
                        AdoQuery3.Parameters.ParamByName('GSBSC').Value:=AdoQuery2.FieldByName('WX_BSCMC').AsString;
                        AdoQuery3.Open;
                        AdoQuery3.First;
                        while not AdoQuery3.eof do
                        begin
                          BtsNode[BT]:=TV.Items.AddChild(BscNode[BS],AdoQuery3.FieldByName('WX_JZMC').AsString);
                          BtsNode[BT].ImageIndex:=1;
                          begin
                          with AdoQuery4 do
                            begin
                              AdoQuery4.close;
                              AdoQuery4.sql.Clear;
                              AdoQuery4.sql.Add('select WX_CELLID from WX_JZXQXX WHERE WX_SSBTS=:LS_SSBTS order by wx_cellid');
                              AdoQuery4.Parameters.ParamByName('LS_SSBTS').Value:=AdoQuery3.FieldByName('WX_JZMC').AsString;
                              AdoQuery4.Open;
                              AdoQuery4.First;
                              while not AdoQuery4.eof do
                              begin
                                CellNode[CE]:=TV.Items.AddChild(BtsNode[BT],AdoQuery4.FieldByName('WX_CELLID').AsString);
                                CellNode[CE].ImageIndex:=1;
                                AdoQuery4.Next;
                                //CE:=CE+1;
                              end;
                            end;
                          end;
                          AdoQuery3.Next;
                          BT:=BT+1;
                        end;
                      end;
                    end;
                    AdoQuery2.next;
                    BS:=BS+1;
                  end;
                end;
              end;
              AdoQuery1.next;
              MS:=MS+1;
            end;
        end;
    end;
      

  9.   

    拖动改变关系
    procedure TFrm_wjTree.TVDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);var TargetNode,SourceNode:TTreeNode;
    begin
      TargetNode:=TV.GetNodeAt(X,Y);
      if (Source = Sender) and (TargetNode <> nil) and (TargetNode.Level+1=TV.Selected.Level) then
        begin
          Accept:=true;
          SourceNode:=TV.Selected;
          while (TargetNode.Parent <> nil) and
                (TargetNode <> SourceNode) do
            TargetNode :=TargetNode.Parent;
          if (TargetNode = SourceNode) and (Trim(SourceNode.Parent.Text)=Trim(TargetNode.Text)) and (Trim(SourceNode.Parent.Parent.Text)=Trim(TargetNode.Text))then
            Accept :=False;
        end
      else
        Accept :=False;
    end;procedure TFrm_wjTree.TVDragDrop(Sender, Source: TObject; X, Y: Integer);
    var TargetNode,SourceNode :TTreeNode;
    begin
      //TV.BeginDrag(true);
      TargetNode:=TV.GetNodeAt(X,Y);
      if (TargetNode <> nil)  then
        begin
          try
          SourceNode :=TV.Selected;
          SourceNode.MoveTo(TargetNode,naAddChildFirst);
          case SourceNode.Level of
            3:begin
                with QTreeNodeYD do
                  begin
                    close;
                    sql.Clear;
                    sql.Add('update wx_mscxx set wx_ssds=:Ls_ssds where wx_mscmc=:Ls_mscmc');
                    Parameters.ParamByName('Ls_ssds').Value:=Trim(TargetNode.Parent.Text);
                    Parameters.ParamByName('Ls_mscmc').Value:=Trim(SourceNode.Text);
                    ExecSQL;
                  end;
              end;
            4:begin
                with QTreeNodeYD do
                  begin
                    close;
                    sql.Clear;
                    sql.Add('update wx_bscxx set wx_ssmsc=:Ls_ssmsc where wx_bscmc=:Lx_bscmc');
                    Parameters.ParamByName('Ls_ssmsc').Value:=Trim(TargetNode.Text);
                    Parameters.ParamByName('Lx_bscmc').Value:=Trim(SourceNode.Text);
                    ExecSQL;
                  end;
              end;
            5:begin
                with QTreeNodeYD do
                  begin
                    close;
                    sql.Clear;
                    sql.Add('update wx_jzxx set wx_gsbsc=:Ls_gsbsc where wx_jzmc=:Ls_jzmc');
                    Parameters.ParamByName('Ls_gsbsc').Value:=Trim(TargetNode.Text);
                    Parameters.ParamByName('Ls_jzmc').Value:=Trim(SourceNode.Text);
                    ExecSQL;
                  end;
              end;
            6:begin
                with QTreeNodeYD do
                  begin
                    close;
                    sql.Clear;
                    sql.Add('update wx_jzxqxx set wx_ssbts=:Ls_ssbts where wx_cellid=:Ls_cellid');
                    Parameters.ParamByName('Ls_ssbts').Value:=Trim(TargetNode.Text);
                    Parameters.ParamByName('Ls_cellid').Value:=Trim(SourceNode.Text);
                    ExecSQL;
                  end;
              end;
            end;
          TargetNode.Expand(False);
          TV.Selected :=TargetNode;
          Except;
            raise;
          end;   
        end;
      

  10.   

    zyxg(子夜)和我的做法很相似,我是根据节点编号的长度来确定级别的,这样原则上可以分到无限级(根据字段的长度而定),关于拖动我是从网上找的和你的基本相同单有一个问题我一直搞不出来,
    比如设备
      家用
        扳手
        钳子
      公用
        机床
        扳手当拖动改变关系的时候,如果拖动的是“扳手”的时候,不能通过 SourceNode.Text 
    update怎么办?
      

  11.   

    树型结构设计:
    分析代码表的结构,设计了两种存储的方式.。对于有明显层次结构的基础代码,在实际存储的数据里体现了它们的层次结构。对于没有层次结构的基础代码,也就是简单的二维表存储。表名和列名都遵循中文拼音命名格式,表基本架构如下:
    本文只针对有层次结构的表,设计格式如下:字段名 字段类型 字段功能描述
    xh integer 唯一的主键,和业务数据没有关系
    dm char 体现层次结构的唯一代码
    mc char 记录的名称
    jb Integer 体现记录在树结构上的层次
    xj integer 是否有子节点
    bz Char 备注,供用户填写备注的信息
    bjdm char 本级别的代码(明码,提供用户输入)
    zdydm char 所有上层代码 + 分隔符号 + bjdm
    … … 其他的业务数据字段
      

  12.   

    我也想要一份!可以吗?
    [email protected]
      

  13.   

    树型结构还有一种设计方法,就是编码定位方法:即如下操作编码:(假如18位)  BPBJ0010001  //备品备件...
                    BPFZ0010002  //备品辅助...但无法体现数据的详细层次关系
      

  14.   

    设计方式3:
    自增加序号    自身ID   上级ID   相应级别    自身详细描述    备注这种方式也是可行的,但如果数据量过大会造成资源占用!
      

  15.   

    http://www.tx.net.cn/school/dotnet/wz/37WYKIJNZZN51NJCHS.shtmlhttp://delphijl.99898.com/delphier/article/ShowArticle.asp?ArticleID=8
      

  16.   

    同意楼上     fcjg(★飘来飘去!★(一天18小时在线))   的,我试过可以用
      

  17.   

    当拖动改变关系的时候,如果拖动的是“扳手”的时候,不能通过 SourceNode.Text 
    update怎么办?你指的是数据库里的更新还是当前树的显示?
    procedure TFrm_wjTree.TVDragDrop(Sender, Source: TObject; X, Y: Integer);
    var TargetNode,SourceNode :TTreeNode;
    begin
      //TV.BeginDrag(true);
      TargetNode:=TV.GetNodeAt(X,Y);
      if (TargetNode <> nil)  then
        begin
          try
          SourceNode :=TV.Selected;
          SourceNode.MoveTo(TargetNode,naAddChildFirst); // 树更新
          case SourceNode.Level of
            3:begin                            //这一下根据拖动情况更新数据库
                with QTreeNodeYD do
                  begin
                    close;
                    sql.Clear;
                    sql.Add('update wx_mscxx set wx_ssds=:Ls_ssds where wx_mscmc=:Ls_mscmc');
                    Parameters.ParamByName('Ls_ssds').Value:=Trim(TargetNode.Parent.Text);
                    Parameters.ParamByName('Ls_mscmc').Value:=Trim(SourceNode.Text);
                    ExecSQL;
                  end;
              end;
            4:begin
                with QTreeNodeYD do
                  begin
                    close;
                    sql.Clear;
                    sql.Add('update wx_bscxx set wx_ssmsc=:Ls_ssmsc where wx_bscmc=:Lx_bscmc');
                    Parameters.ParamByName('Ls_ssmsc').Value:=Trim(TargetNode.Text);
                    Parameters.ParamByName('Lx_bscmc').Value:=Trim(SourceNode.Text);
                    ExecSQL;
                  end;
              end;
            5:begin
                with QTreeNodeYD do
                  begin
                    close;
                    sql.Clear;
                    sql.Add('update wx_jzxx set wx_gsbsc=:Ls_gsbsc where wx_jzmc=:Ls_jzmc');
                    Parameters.ParamByName('Ls_gsbsc').Value:=Trim(TargetNode.Text);
                    Parameters.ParamByName('Ls_jzmc').Value:=Trim(SourceNode.Text);
                    ExecSQL;
                  end;
              end;
            6:begin
                with QTreeNodeYD do
                  begin
                    close;
                    sql.Clear;
                    sql.Add('update wx_jzxqxx set wx_ssbts=:Ls_ssbts where wx_cellid=:Ls_cellid');
                    Parameters.ParamByName('Ls_ssbts').Value:=Trim(TargetNode.Text);
                    Parameters.ParamByName('Ls_cellid').Value:=Trim(SourceNode.Text);
                    ExecSQL;
                  end;
              end;
            end;
          TargetNode.Expand(False);
          TV.Selected :=TargetNode;
          Except;
            raise;
          end;   
        end;
      

  18.   

    拖动的操作所要处理的操作:  1,获得源节点(SourceNode) 和目标节点(TargetNode) 并将源节点移动到目标节点下面;(这还可以分剪切和复制,1,剪切用moveto就可以了,如果是复制就再目标节点下重新生成一个新节点  )  2,处理数据库
      

  19.   

    决定先放点分了,zyxg(子夜) 先得100分,
    zyxg(子夜) 见到 zyxg(子夜) 来领分的帖子就进来领分
    我另外开帖子给,别的都会给的
      

  20.   

    为什么还要自己编码呢???DevExpress DBTreeView可以实现你想要的功能!!!而且有完整的帮助和例子!!!