表名:dept_staff
结构:guid/id/kind/UPguid/role/staff/dept
==========================================具体以后再说=============
连接数据库代码:
===================================================================={*******************************************************}
{*                                                      }
{* Unit Name: TreeDataU                                 }
{* Purpose  :                                           }
{* Author   :桂双林                                     }
{* History  :                                           }
{* Copyright(c) 2004-2004 SinoSoftwareGroup Corporation }
{*                                                      }
{*******************************************************}unit TreeDataU;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, ADODB;type
  TForm2 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    ComboBox1: TComboBox;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    ADOConnection1: TADOConnection;
    procedure BitBtn2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    ThisStr,ThisProvider:WideString;
    Function Table_connt(sender: TADOTable):boolean;
  end;
var
  Form2: TForm2;
  s:Array[0..5] of string;
implementationuses TreeU;{$R *.dfm}
//============================================
//把表连接数据源
//--------------------------------------------
Function TForm2.Table_connt(sender: TADOTable):boolean;
begin
  Result := False;
  if (Sender <> nil) and (not sender.Active)and ADOConnection1.Connected then
    begin
      sender.Connection.ConnectionString:=Form2.ThisStr;
      sender.Connection.Provider:=Form2.ThisProvider;
      //showmessage(sender.Connection.ConnectionString+'//'+sender.Connection.Provider);
      Result := True;
    end
  else
    begin
     if (Sender <> nil) and (sender.Active) then
       sender.Active :=False;
       sender.Close;
    end;
end;//============================================
//把新连接写入配置文件
//--------------------------------------------
Procedure WriteF();
Var
  VarFile:TextFile;
begin
Try
  AssignFile(VarFile,'DBCfg.ini');
  ReWrite(VarFile);
  writeln(VarFile,'DataBase:',S[0]);
  writeln(VarFile,'ServerName:',S[1]);
  writeln(VarFile,'DataNmae:',S[2]);
  writeln(VarFile,'UserName:',S[3]);
  writeln(VarFile,'UserPass:',S[4]);
  CloseFile(VarFile);
Except
End;
end;
//================================
//读配置文件
//-------------------------------
Procedure ReadF();
Var
  i:integer;
  IniFile: TextFile;
begin
 if FileExists('DBCfg.ini')then
   Begin
   i:=0;
   AssignFile(IniFile,'DBCfg.ini');
   Reset(IniFile);
   while not Eof(IniFile) do
   begin
      ReadLn(IniFile,S[i]);
      I:=I+1;
   end;
   closeFile(IniFile);
   end
 else
   begin
   ReWrite(IniFile);
   end;
end;
//============================================
procedure TForm2.BitBtn2Click(Sender: TObject);
begin
 form2.Close;
end;procedure TForm2.FormCreate(Sender: TObject);
begin
  ReadF();
   ComboBox1.Text:= Copy(S[0],10,Length(S[0])-9);
   Edit2.Text:= Copy(S[1],12,Length(S[1])-11);
   Edit3.Text:= Copy(S[2],10,Length(S[2])-9);
   Edit4.Text:= Copy(S[3],10,Length(S[3])-9);
   Edit5.Text:= Copy(S[4],10,Length(S[4])-9);
   //Label6.Color := clGreen;
end;
procedure Save_Cofig();
begin
   s[0]:= form2.ComboBox1.Text;
   s[1]:= Trim(form2.Edit2.Text);
   s[2]:= Trim(form2.Edit3.Text);
   s[3]:= Trim(form2.Edit4.Text);
   s[4]:= Trim(form2.Edit5.Text);
end;
//=============================================
//配置数据源连接
//--------------------------------------------
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
  ThisProvider:='SQLOLEDB.1';
  ThisStr:= 'Provider=SQLOLEDB.1;Password='+Trim(Edit5.Text)+';Persist Security Info=True;User ID='+Trim(Edit4.Text)+';Initial Catalog='+Trim(Edit3.Text)+';Data Source='+Trim(Edit2.Text)+';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID='+Trim(Edit2.Text)+';Use Encryption for Data=False;Tag with column collation when';
  //Showmessage(ThisStr);
 if ADOConnection1.Connected then
  begin
  ADOConnection1.Close;
  //ADOConnection1.Destroy;
  Label6.Color:= clred;
  BitBtn1.Enabled:= True;
  end
 else
  begin
  ADOConnection1 := TADOConnection.Create(nil);
  ADOConnection1.ConnectionString:=ThisStr;
  try
    ADOConnection1.LoginPrompt:=false;
    ADOConnection1.Provider:=ThisProvider;
    ADOConnection1.Open;
    Label6.Color:= clGreen;
    //Showmessage('数据库连接成功');
    Save_Cofig();
    WriteF();
    form2.Close;
    BitBtn1.Enabled:= false;
  Except
    ADOConnection1.close;
    ADOConnection1.Destroy;
    Showmessage('数据库连接失败');
    Label6.Color:= clred;
    BitBtn1.Enabled:= true;
    Raise;
  end;
 end;
end;procedure TForm2.Edit3Change(Sender: TObject);
begin
BitBtn1.Enabled:= True;
end;end.
==============================================================

解决方案 »

  1.   

    //============================================================
    //主窗体代码
    //============================================================{*******************************************************}
    {*                                                      }
    {* Unit Name: TreeU                                     }
    {* Purpose  :                                           }
    {* Author   :桂双林                                     }
    {* History  :                                           }
    {* Copyright(c) 2004-2004 SinoSoftwareGroup Corporation }
    {*                                                      }
    {*******************************************************}unit TreeU;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Menus, ExtCtrls, DBCtrls, ComCtrls, Grids, ValEdit, Buttons, DB,
      ADODB, DBGrids, ImgList, StdCtrls;type
      TForm1 = class(TForm)
        ControlBar1: TControlBar;
        DBNavigator1: TDBNavigator;
        MainMenu1: TMainMenu;
        N1: TMenuItem;
        N2: TMenuItem;
        N3: TMenuItem;
        N4: TMenuItem;
        StatusBar1: TStatusBar;
        Panel1: TPanel;
        Splitter1: TSplitter;
        Panel2: TPanel;
        Panel4: TPanel;
        TreeView1: TTreeView;
        Panel5: TPanel;
        SpeedButton1: TSpeedButton;
        DataSource1: TDataSource;
        ADOTable1: TADOTable;
        Panel6: TPanel;
        SpeedButton2: TSpeedButton;
        SpeedButton3: TSpeedButton;
        SpeedButton4: TSpeedButton;
        ImageList1: TImageList;
        DBGrid1: TDBGrid;
        N5: TMenuItem;
        PopupMenu1: TPopupMenu;
        EXCEL1: TMenuItem;
        ValueListEditor1: TValueListEditor;
        procedure SpeedButton2Click(Sender: TObject);
        procedure SpeedButton3Click(Sender: TObject);
        procedure SpeedButton4Click(Sender: TObject);
        procedure TreeView1Click(Sender: TObject);
        procedure N2Click(Sender: TObject);
        procedure AddChildTree();
        procedure N4Click(Sender: TObject);
        procedure SpeedButton1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        TreeSelect: TTreeNode;
        TreeItemXY:String;
        function SFilter:boolean;
        Function UpTree(memberid: String):String;
        Function AddValueList(k,v:string):boolean;
      end;var
      Form1: TForm1;implementationuses TreeDataU, Data_TableU;{$R *.dfm}
    //==========================================
    //到ValueListEditor1中查到父接点的id
    //------------------------------------------
    Function TForm1.UpTree(memberid: String):String;
    var
      UpTree:string;
    begin
     UpTree:='not';
     UpTree:=Form1.ValueListEditor1.Values[memberid];
     Result := UpTree;
    end;//==========================================
    //在加子树的同时
    //把显示名(k)和id(v)存到ValueListEditor1中
    //------------------------------------------
    Function TForm1.AddValueList(k,v:string):boolean;
    begin
        Result := false;
      if Form1.ValueListEditor1.Values[k]=''then
       begin
        Form1.ValueListEditor1.InsertRow(k,v,true);
        Result := true;
       end;
    end;
    //============================================
    //      'BORLAND'           { BORLAND }
    //      'You''ll see'       { You'll see }
    //      ''''                { ' }
    //      ''                  { null string }
    //      ' '                 { a space }
    //用本接点的ID过滤数据源,找到要做儿子的数据
    //----------------------------------------------
    function Tform1.SFilter:boolean;
    var
      aFilter,ParentTree:string;
    begin
      Result := false;
      if TreeView1.Selected<>nil then
        begin
          TreeItemXY:=inttostr(Treeview1.Selected.StateIndex);
          ParentTree:=Uptree(TreeItemXY);
          ADOTable1.Filtered:= false;
          aFilter:= 'PARENTGUID = ';
          afilter:=afilter + ''''+ ParentTree + '''';
          ADOTable1.Filter := aFilter;
          ADOTable1.Filtered:= true;
        end;
    end;
    //==============================================
    //从过滤后的数据源中的数据一个个他添置到本节点下
    //成为子点
    //--------------------------------------------
    procedure Tform1.AddChildTree();
    var
      index:integer;
      TreeChild: TTreeNode;
      k,v,ChildTree:string;
    begin
      if ADOTable1.RecordCount >0 then
        begin
            ADOTable1.First;
        for index:=0 to ADOTable1.RecordCount-1 do
          begin
          try
            if ADOTable1.Fields[2].Value = 'omRole' then
               ChildTree:=ADOTable1.Fields[5].Value
            else if ADOTable1.Fields[2].Value = 'omStaff' then
               ChildTree:=ADOTable1.Fields[6].Value
            else if ADOTable1.Fields[2].Value = 'omDept' then
               ChildTree:=ADOTable1.Fields[7].Value;
          except
            showmessage('数据列值为NULL错误');
          end;
            v:=ADOTable1.Fields[0].Value;
            TreeChild:= TreeView1.Items.AddChild(TreeView1.Selected,ChildTree);
            TreeChild.StateIndex:= TreeView1.Items.Count;
            k:=inttostr(TreeChild.StateIndex);
            AddValueList(k,v);
            ADOTable1.Next;
          end;
        end;
      StatusBar1.Panels.Items[0].Text:=' ['+Form3.Table_name+']表过滤后: 共 '+IntToStr((ADOTable1.RecordCount))+' 条数据';
    end;//============================================
    procedure TForm1.SpeedButton2Click(Sender: TObject);
    begin
      Form3.ShowModal;
      if Form3.Table_name ='Dept_Staff' then TreeView1.Enabled:=True
      else
         TreeView1.Enabled:=false;  //渐时这样写,以后可以写成通用程式
      if Form3.Table_name <>'' then
      if Form2.ADOConnection1.Connected then
        try
          AdoTable1.Active:=false;
          ADOTable1.TableName:=Form3.Table_name;
          AdoTable1.Open;
          SpeedButton4.Enabled:= true;
          StatusBar1.Panels.Items[0].Text:=' ['+Form3.Table_name+']表: 共 '+IntToStr((ADOTable1.RecordCount))+' 条数据';
        except
          AdoTable1.Close;
          //showmessage('fdfds');
        end
    end;procedure TForm1.SpeedButton3Click(Sender: TObject);
    begin
     try
      if Form2.Table_connt(ADOTable1) then
        begin
          SpeedButton3.Enabled:=false;
          SpeedButton2.Enabled:=true;
        end
        else
         showmessage('数据源没找到');
     except
      Adotable1.Close;
      showmessage('连接数据源出错')
     end;
    end;
    //=======================接下楼.....
      

  2.   

    //========================接上楼......//==============================================
    //首先加一个准备好的根节点
    //---------------------------------------------
    procedure TForm1.SpeedButton4Click(Sender: TObject);
    var
      STree:TTreeNode;
      //index:integer;
      k,v,SFilter:string;
    begin
      Stree:=TreeView1.GetNodeAt(0,0);
      if  (not Stree.HasChildren) and (Form3.Table_name ='Dept_Staff') then
      begin
        ADOTable1.Filtered:= false;
        SFilter:= '(PARENTGUID = ''-1'')';
        ADOTable1.Filter := SFilter;
        ADOTable1.Filtered:= true;
        ADOTable1.First;
        Stree.Text:= '组织机构';
        Stree.StateIndex:=Treeview1.Items.Count;
        k:=inttostr(Stree.StateIndex);
        v:='-0';
        AddValueList(k,v);
        try
          Form1.SFilter;
          AddChildTree;
        except
          showmessage('初始树出错');
        end;
      end;
      //showmessage(inttostr(ADOTable1.RecordCount));
    end;//=====================================================
    //当点对节点时,如果没有子节点就去想法找数据添加
    //-----------------------------------------------------
    procedure TForm1.TreeView1Click(Sender: TObject);
    begin
      StatusBar1.Panels.Items[1].Text:=' 第['+inttostr(TreeView1.Selected.Level)+']层第['+inttostr(TreeView1.Selected.Index)+ ']列'+ inttostr(Treeview1.Selected.StateIndex);
     if  (not TreeView1.Selected.HasChildren) and (TreeSelect<> TreeView1.Selected)then
     begin
       TreeSelect:= TreeView1.Selected ;
       TreeItemXY:=inttostr(Treeview1.Selected.StateIndex);
     if Form1.ValueListEditor1.Values[TreeItemXY]<>'' then
        begin
          Form1.SFilter;
          AddChildTree;
        end;
     end;
    end;procedure TForm1.N2Click(Sender: TObject);
    begin
      form2.show;
    end;procedure TForm1.N4Click(Sender: TObject);
    begin
      form1.ADOTable1.Close;
      form2.ADOConnection1.Close;
      form2.ADOConnection1.Destroy;
      form1.Close;
    end;procedure TForm1.SpeedButton1Click(Sender: TObject);
    begin
      if panel1.Visible then
        begin
         panel1.Visible:= false;
         Splitter1.Visible:=false;
        end
      else
        begin
         Splitter1.Visible:=true;
         panel1.Visible:= true;
        end;
    end;end.
      

  3.   

    //=============================================
    //选表窗口
    //============================================={*******************************************************}
    {*                                                      }
    {* Unit Name: Data_TableU                               }
    {* Purpose  :                                           }
    {* Author   :桂双林                                     }
    {* History  :                                           }
    {* Copyright(c) 2004-2004 SinoSoftwareGroup Corporation }
    {*                                                      }
    {*******************************************************}
    unit Data_TableU;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ExtCtrls, CheckLst, DB, ADODB, ComCtrls,
      ImgList;type
      TForm3 = class(TForm)
        GroupBox1: TGroupBox;
        Panel1: TPanel;
        BitBtn1: TBitBtn;
        BitBtn2: TBitBtn;
        ListView1: TListView;
        Label1: TLabel;
        ImageList1: TImageList;
        procedure FormShow(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        Table_name :string;
      end;var
      Form3: TForm3;implementationuses TreeDataU;{$R *.dfm}{***********************************************************}
    {*                                                          }
    {*从数据库取得表,如果表太多,用8倍MOD算法优化While语句的    }
    {*执行次数,本来可以用ListBox组件一行就可以解决:           }
    {*Form2.ADOConnection1.GetTableNames(ListBox1.Items,False); }
    {*跟本不用几十行,但是LISTBox当数据太多选择表时显示太慢      }
    {*                                                          }
    {***********************************************************}procedure TForm3.FormShow(Sender: TObject);
    var
      SL: TStrings;
      item: TListItem;
      j:integer;
      index: Integer;
    begin
        if Form2.ADOConnection1.Connected then
        begin
           SL := TStringList.Create;
           Form2.ADOConnection1.GetTableNames(SL, False);
           ListView1.Clear;       
           j:=SL.Count mod 8;
           index:=0;
           if (j= 0) and (SL.Count>8)then
             while index <=(SL.Count - 1) do
             begin
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+1];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+2];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+3];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+4];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+5];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+6];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+7];
                  index:= index+8;
                  //item.SubItems.Add('数据表');
                  //item.SubItems.Add('ff');
             end
           else if (j <> 0) and (SL.Count>8) then
           begin
             while index <=(SL.Count - 1-j) do
             begin
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+1];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+2];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+3];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+4];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+5];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+6];
                  item:= ListView1.Items.Add;
                    item.Caption := SL[index+7];
                  index:= index+8;
                  //item.SubItems.Add('数据表');
                  //item.SubItems.Add('ff');
             end;
             for index:=(SL.Count -j) to (SL.Count - 1) do
             begin
               item:= ListView1.Items.Add;
               item.Caption := SL[index];
             end;
           end
           else if SL.Count<=8 then
              for index := 0 to (SL.Count - 1) do
                begin
                   item:= ListView1.Items.Add;
                   item.Caption := SL[index];
                end;
        Label1.Caption := '共有 ' + intTostr(ListView1.Items.Count)+ '  张表';
        end
        else
        ShowMessage('没有配置数据库连接');
    end;procedure TForm3.BitBtn2Click(Sender: TObject);
    begin
      form3.Close;
      Table_name:='';
    end;procedure TForm3.BitBtn1Click(Sender: TObject);
    begin
      Table_name:= ListView1.Selected.Caption;
      form3.Close;
    end;end.
    //===============================================
      

  4.   

    现在我来解释所有的代码。
    //============================================
    //把表连接数据源
    //--------------------------------------------
    Function TForm2.Table_connt(sender: TADOTable):boolean;
    begin
      Result := False;
      if (Sender <> nil) and (not sender.Active)and ADOConnection1.Connected then
        begin
          sender.Connection.ConnectionString:=Form2.ThisStr;
          sender.Connection.Provider:=Form2.ThisProvider;
          //showmessage(sender.Connection.ConnectionString+'//'+sender.Connection.Provider);
          Result := True;
        end
      else
        begin
         if (Sender <> nil) and (sender.Active) then
           sender.Active :=False;
           sender.Close;
        end;
    end;
    ===========================================
    这是因要改动ado的表数据源连接所以单独写了个函数 
    来重新配置连接字符串
      

  5.   

    Save_Cofig();是把连接好的新配置写入数好存到文件
    TForm2.FormCreate启动窗本时,把上次连接文件读出来。。
    ReadF();读配置文件
    WriteF();写配置文件
      

  6.   

    //=============================================
    //配置数据源连接
    //--------------------------------------------
    procedure TForm2.BitBtn1Click(Sender: TObject);
    begin
    end;
    //
    这个是用来连数据库的,这里是sqlserver2000我现这个
      

  7.   

    //自定义类型
    type
      PMyRecord = ^MyRecord;
      MyRecord = record
               ID : integer;
               Name:string;
               ParentID : integer;
    end;//end of record//要据SQL 语句生成树型目录
    procedure 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(application);
      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,AImageIndex,ASelectedIndex,AstrFieldName);
          ADOTree.next;
          //dispose(p);//一定要去掉这条语句,不然的话,Treeview中的Data也被dispose掉了。
        end;
      end;
      ADOTree.Free;
    end;例:
      FstrSql:='SELECT SYS_BM_ID, SYS_BM_BMMC, SYS_BM_ParentID FROM SYS_BM';
       //格式为
            SYS_BM_ID          ID 唯一编号  Integer 类型
            SYS_BM_BMMC        名称         Varchar 类型
            SYS_BM_ParentID    父节点ID     Integer 类型      // 以上是SQL 语句的格式
     //调用方式介绍 {
        Node:TTreeNode   父节点
        ParentID:integer  数据库中父节点ID
        AtvnViewNode:TTreeView  要初始化的TTreeView 控件名
        AadoConnection:TADOConnection  TADOConnection  控件名
        AstrSQL:String                 SQL 语句
        AImageIndex:Integer ;          未选中时的图标索引号
        ASelectedIndex:Integer;        选中时的图标索引号
        AstrFieldName:String           父节点字段名      
    }pCreateTreeView(Node:TTreeNode;ParentID:integer;
              AtvnViewNode:TTreeView;AadoConnection:TADOConnection;AstrSQL:String;
              AImageIndex,ASelectedIndex:Integer;AstrFieldName:String);
      pCreateTreeView(Nil,0,self.tvwBm,self.ado_CreateTree.Connection,FstrSql,17,16,'SYS_BM_ParentID');
    {数据库存的表结构如下:}
      
      ID       :  Int      自增
      MC       :  Varchar  名称
      ParentID :  Int       父节点ID
      

  8.   

    fcjg(★飘来飘去!★(一天18小时在线)) 
    我上面有这样的,
    但你有几个问题没有解决:
     1,那就是我用树显示 汉字 ,而你这样做只是生成树,显示 ID ,谁都不知道ID是代表什么啊
     2,树上没有数据库用的ID,你的ID在点树时在那里找到?而且用来生成子树?不完整
     3,如果你把树显用的文本加上ID,那不好看,象补丁:)我的树完全是显示汉字不会有什么ID,我是通过另一个途径找到ID的。
      

  9.   

    我的树思路:
    ===============================1表结构=========================================
    表结构:guid/id     /kind   /UPguid/role/staff/dept
    对应名: 主键/模块ID/关系类型/父ID /角色/员工/部门       //所有都是字符类型解释:实际上我这个表是一个由部门表,岗位角色表,员工表,和功能模块表,他们之间的关系统生成的权限树
          如: 一个部门有多个岗位,多位员工,一个岗位能在多个门里等关系。
          而我这个树实现模块在部门,公司,人员,岗位之间的灵活分配!!!想分给谁就分给谁,想给岗位授权就给岗位授权!!!!(关于权限继续由自己去想,还不是一样的:)呵呵)作用:这个功能树实际上是用来代替菜单的!!,树会变他是活的,而菜单是死的,难于控制.
    重点:我这个表用了数据结构里的"连表"是用数组实现的,数组是这里的表!!!一行就是节点
    ==================================2============================================
    //这是个完整的例子不是单是树代码
    步骤如下:
    0,打开窗时提出原来的正确数据库配置                  //就是读文件那里,我不说了.
    1,连接数据库:procedure TForm2.BitBtn1Click(Sender: TObject);
    2, 把adotable连接数据 :Function TForm2.Table_connt(sender: TADOTable):boolean;
    3, 选择数据库表(当然一定要有父子结构)procedure TForm1.SpeedButton2Click(Sender: TObject);
       从数据里得到表:procedure TForm3.FormShow(Sender: TObject);
    4, 得到表名:procedure TForm3.BitBtn1Click(Sender: TObject);
    5,初始化树:procedure Tform1.AddChildTree();
    6, 只要向树中加节点,同时把 节点ID/K 对应 数据库ID/V 在ValueListEditor1 加一行.
       为什么用ValueListEditor1 作为节点ID与数据库ID对应???这就是显示汉字又能找到ID
       的原因:呵呵,再一个用这个东东好找KEY :)
    7, 如果有人点树,我加子节点:procedure TForm1.TreeView1Click(Sender: TObject);
       到ValueListEditor1中找到父ID: Function TForm1.UpTree(memberid: String):String;
       用父ID过滤数据源: function Tform1.SFilter:boolean;
       把过滤后的数据加到树啊:   procedure Tform1.AddChildTree();
       --加节点的同时记得存好节点id 和父ID的对应关系:AddValueList(k,v);
    8,思路就这样啦。。得到一个显示汉字的树哦。
    9,如果那个没有这个模块权限,我就删除他在这个表的那行啊(在权限分配里自己搞吧)
      这个下次把开树他看不到那个节点了。。看不到啦,当然打不开窗口啊。没权限啊。
      

  10.   

    注意:我把树ID存在不太常用的树的属性里:TreeChild.StateIndex,因为节点没有Tag值要不我会存在tag里。
    如果那个有好的方法,把ID存在树的某个地方请告诉我。
    中科软件集团:桂双林
    电子邮箱:
    [email protected]
      

  11.   

    这么多代码,有点昏啊id存在data里不行吗?
      

  12.   

    代码很长
    不容易看
    可以发个具体的文档吗?
    [email protected]
    谢谢了~~
      

  13.   

    =========================
    代码很长
    不容易看
    可以发个具体的文档吗?
    [email protected]
    谢谢了~~=======================================================
    源码已发送........
      

  14.   

    ----------------------------
    这么多代码,有点昏啊
    id存在data里不行吗
    ---------------------------
    我以前用java所以不喜欢用指针,你那个想法当然可以啊
      

  15.   

    数据说明
    表名:       dept_staff
    guid:       就是主键
    memberid:   岗位ID/人员ID/部门ID       是与memberkind三种类型对应的 
                omRole/omStaff/omDept
    parentguid: 是父ID,他一般是guid,就是上面的主键,
                只有一个不同(也可以是多个)就是最上层的公司名,他没有父ID
    se:         是在树中的顺号,有些人权力大他在排前面啊,实际也是没办法:)
    Expr2:      是岗位
    Expr3:      是人员
    Expr1:      是部门(包括公司)
      

  16.   

    是呀,代码很长,而且我现在在做毕业设计,急用到树型菜单
    可以发个具体的文档吗?
    [email protected]
    谢谢了~~
      

  17.   

    to ice9n(小馒头) 
      源程序和文档已发送