怎样实现TreeView读数据库循环显示:
如:顶级地区,上级地区,地区分枝.....
还有当点某一节点时候再按添加可以鼠标焦点处加入地区.
最好有事例,我刚学Delphi,现在项目太紧张了.

解决方案 »

  1.   

    我这里到写过
    不过对于节点的显示是采用递归来实现的
    至于加入地区,使用AddObject或AddChildObject来实现
      

  2.   

    unit SC_SBTJ;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, ExtCtrls, Grids, StdCtrls, ToolWin;type
      TSHeBeiLeiBie = class(TForm)
        Panel1: TPanel;
        SBTreeView: TTreeView;
        SBStringGrid1: TStringGrid;
        ToolBar1: TToolBar;
        ToolButton1: TToolButton;
        ToolButton4: TToolButton;
        ToolButton2: TToolButton;
        ToolButton3: TToolButton;
        ToolButton5: TToolButton;
        ToolButton6: TToolButton;
        procedure FormCreate(Sender: TObject);
        procedure SBTreeViewClick(Sender: TObject);
        procedure ToolButton1Click(Sender: TObject);
        procedure ToolButton2Click(Sender: TObject);
        procedure ToolButton3Click(Sender: TObject);
        procedure ToolButton5Click(Sender: TObject);
      private
        { Private declarations }
         procedure MySBdggc(Node:TTreeNode;id:integer);
      public
        { Public declarations }
      end;var
      SHeBeiLeiBie: TSHeBeiLeiBie;
      MyKZBL:boolean;
      MySBArray:Array of Array[0..3] of Variant;
      MySBCount:integer;
      //定义数据存储
      type
        PMySBPro=^TMySBPro;
        TMySBPro = record
          Fid:integer;
          FFuID:integer;
          FTaiZhangMoBan:String;
      end;
    implementationuses SC_SJMK, SC_SheBeiEdit;{$R *.dfm}
    //递归过程调用
    procedure TSHeBeiLeiBie.MySBdggc(Node:TTreeNode;id:integer);
    var
      i:integer;
      MyBoolean:boolean;
      MySBprodata: PMySBPro;
    begin
      for i:=0 to MySBCount-1 do
        begin
          if MySBarray[i,2]=id then
            begin
              new(MySBprodata);
              PMySBPro(MySBprodata)^.Fid:=MySBarray[i,0];
              PMySBPro(MySBprodata)^.FFuID:=MySBarray[i,2];
              PMySBPro(MySBprodata)^.FTaiZhangMoBan:=MySBarray[i,3];
              if MyBoolean=False then Node:=SBTreeView.Items.AddChildObject(Node,MySBarray[i,1],MySBprodata)
              else
                begin
                  Node:=SBTreeView.Items.AddObject(Node,MySBarray[i,1],MySBprodata);
                  MyBoolean:=False;
                end;
              MySBdggc(Node,MySBarray[i,0]);
              MyBoolean:=True;
            end;
        end;
    end;
    //init SHeBeileibie
    procedure TSHeBeiLeiBie.FormCreate(Sender: TObject);
    var
      i:integer;
    begin
      with sjmk do
        begin
          CX1.Close;
          CX1.SQL.Clear;
          CX1.SQL.Add('SELECT id, LeiXingName, FuID, TaiZhangMoBan FROM sb_LeiXing');
          CX1.Open;
          MySBCount:=DS1.DataSet.RecordCount;
          SetLength(MySBArray,MySBCount);
          for i:=0 to MySBCount-1 do
            begin
              MySBArray[i,0]:= DS1.DataSet.Fields[0].AsInteger;
              MySBArray[i,1]:= DS1.DataSet.Fields[1].AsString;
              MySBArray[i,2]:= DS1.DataSet.Fields[2].AsInteger;
              MySBArray[i,3]:= DS1.DataSet.Fields[3].AsString;
              DS1.DataSet.Next;
            end;
        end;
      SBTreeView.Items.Clear;
      MySBdggc(nil,0);
      SBStringGrid1.Cells[0,0]:='设备编号';
      SBStringGrid1.Cells[1,0]:='设备类别';
      SBStringGrid1.Cells[2,0]:='上级编号';
      SBStringGrid1.Cells[3,0]:='台帐路径';
    end;
    // show shebei
    procedure TSHeBeiLeiBie.SBTreeViewClick(Sender: TObject);
    begin
      if (SBTreeView.Items.Count<1) or (SBtreeView.Selected=nil) then exit;
      SBStringGrid1.Rows[1].Clear;
      SBStringGrid1.Cells[0,1]:=inttostr(PMySBPro(SBTreeView.Selected.Data)^.Fid);
      SBStringGrid1.Cells[1,1]:=SBTreeView.Selected.Text;
      SBStringGrid1.Cells[2,1]:=inttostr(PMySBPro(SBTreeView.Selected.Data)^.FFuID);
      SBStringGrid1.Cells[3,1]:=PMySBPro(SBTreeView.Selected.Data)^.FTaiZhangMoBan;
    end;
    //add shebei
    procedure TSHeBeiLeiBie.ToolButton1Click(Sender: TObject);
    begin
      if ((Sender as TToolButton).Name='ToolButton6') and (SBTreeView.Items.Count<1) and (SBTreeView.Selected=nil) then exit;
      SheBeiEdit:=TSheBeiEdit.Create(self);
      SheBeiEdit.Caption:='设备类别添加';
      with sjmk do
        begin
          CX1.Close;
          CX1.SQL.Clear;
          CX1.SQL.Add('SELECT MAX(id) AS id FROM sb_LeiXing');
          CX1.Open;
          SheBeiEdit.SBBH.Text:=inttostr(DS1.DataSet.Fields[0].AsInteger+1);
          if (Sender as TToolButton).Name='ToolButton1'  then  //add the same node
            begin
              MyKZBL:=True;
              if (SBTreeView.Items.Count>1) and (SBTreeView.Selected<>nil) and (SBTreeView.Selected.Parent<>nil) then
                //不是选择顶级节点
                begin
                  SheBeiEdit.SJSBBH.Text:=inttostr(PMySBPro(SBTreeView.Selected.Data)^.FFuID);
                  SheBeiEdit.SJBH.Text:=SBTreeView.Selected.Parent.Text;
                end
              else//没有数据或者选择顶级节点
                begin
                  SheBeiEdit.SJSBBH.Text:='0';
                  SheBeiEdit.SJBH.Text:='';
                end;
            end
          else//add the childen node
            begin
              MyKZBL:=False;
              SheBeiEdit.SJSBBH.Text:=inttostr(PMySBPro(SBTreeView.Selected.Data)^.Fid);
              SheBeiEdit.SJBH.Text:=SBTreeView.Selected.Text;
             end;
        end;
      Try
        SheBeiEdit.ShowModal;
      Finally
        SheBeiEdit.Free;
      end;
    end;
    //edit shebei
    procedure TSHeBeiLeiBie.ToolButton2Click(Sender: TObject);
    begin
      if SBTreeView.Selected=nil then  exit;
      SheBeiEdit:=TSheBeiEdit.Create(self);
      SheBeiEdit.Caption:='设备类别编辑';
      SheBeiEdit.SBBH.Text:=inttostr(PMySBPro(SBTreeView.Selected.Data)^.Fid);
      if SBTreeView.Selected.Parent=nil then //设置顶级节点
        begin
          SheBeiEdit.SJBH.Text:='';
          SheBeiEdit.SJSBBH.Text:='0';
        end
      else//不是顶级节点
        begin
          SheBeiEdit.SJBH.Text:=SBTreeView.Selected.Parent.Text;
          SheBeiEdit.SJSBBH.Text:=inttostr(PMySBPro(SBTreeView.Selected.Data)^.FFuID);
        end;
      SheBeiEdit.SBName.Text:=SBTreeView.Selected.Text;
      SheBeiEdit.TZLJ.Text:=PMySBPro(SBTreeView.Selected.Data)^.FTaiZhangMoBan;
      SheBeiEdit.oldFileName.Text:=SheBeiEdit.TZLJ.Text;
      Try
        SheBeiEdit.ShowModal;
      Finally
        SheBeiEdit.Free;
      end;
    end;
    //delete shebei
    procedure TSHeBeiLeiBie.ToolButton3Click(Sender: TObject);
    begin
      if SBTreeView.Selected=nil then exit;
      if SBTreeView.Selected.HasChildren=True then
        begin
          showmessage('设备类型下面还有数据,不能删除!');
          exit;
        end;
      if Application.MessageBox('你确实要删除这个设备吗?','删除窗口',MB_YESNO)=IDNo  then exit;
      with sjmk do
        begin
          CX1.Close;
          CX1.SQL.Clear;
          CX1.SQL.Add('Delete From sb_LeiXing where (id='+inttostr(PMySBPro(SBTreeView.Selected.Data)^.Fid)+')');
          try
            CX1.ExecSQL;
          except
            showmessage('删除出错!可能下面还有设备!');
            exit;
          end;
          SBTreeView.Deselect(SBTreeView.Selected);
          SBStringGrid1.RowCount:=2;
          SBStringGrid1.Rows[1].Clear;
          Dispose(SBTReeView.Selected.Data); //free the Selected Node Data
          SBTreeView.Items.Delete(SBTreeView.Selected);
        end;
    end;procedure TSHeBeiLeiBie.ToolButton5Click(Sender: TObject);
    var
      i:integer;
    begin
      for i:=0 to SBTreeView.Items.Count-1 do//free Pointer
        Dispose(SBTReeView.Items[i].Data);
      close;
    end;
                             
    end.