谢谢

解决方案 »

  1.   

    //BDE{$R *.dfm}procedure TfrmDemoTree.ConnectDB;
    begin
       //判定数据模块是否已经存在,
      sbDemo.SimpleText := '    正在连接数据库,请稍候...... ';
      if not Assigned(dmDemoTree) then
        dmDemoTree := TdmDemoTree.create(Application);
    //  showmessage(BoolToStr(dmDemoTree.dbDBETree.Connected));
      if dmDemoTree.dbDBETree.connected = false then
      begin
        //连接数据库
        try
          with dmDemoTree.dbDBETree do
          begin
            DatabaseName := name;
            Params.Clear;
            Params.Add('USER NAME=Test');
            Params.Add('PASSWORD=');
            AliasName := 'MyTest';
            LoginPrompt := false;
            Connected := true;           //连接
            mem_strDBName := AliasName;
            toolbtnBuildTree.Enabled := true;
            toolbtnDiscnDB.Enabled := true;
            mmOperate_BuildTree.Enabled := true;
            mmOperate_DiscnDB.Enabled := true;
          end;
        Except
          on Exception do                      //错误处理
          begin
            ShowMessage('连接数据库失败,请检查网络是否通路!');
          end;
        end;
      end;
      sbDemo.SimpleText := '    ';
    end;procedure TfrmDemoTree.DisConnectDb;
    begin
      mem_strDBName := '';                 //清空数据库名及一些环境设置
      toolbtnBuildTree.Enabled := false;
      toolbtnDiscnDB.Enabled := false;
      mmOperate_BuildTree.Enabled := false;
      mmOperate_DiscnDB.Enabled := false;
      dmDemoTree.dbDBETree.Connected := false;
    end;procedure TfrmDemoTree.ExecQry(mSQL: string; mQry: tquery; mIsSelect: Boolean);
    begin
      //执行SQL语句
      mQry.Close;
      mQry.SQL.Clear;
      mQry.SQL.Add(mSQL);
      mQry.DatabaseName := mem_strDBName;
      if mIsSelect then
        mQry.Open
      else
        mQry.ExecSQL;
    end;procedure TfrmDemoTree.FormShow(Sender: TObject);
    //初始化环境设置
    begin
      toolbtnBuildTree.Enabled := False;
      mmOperate_BuildTree.Enabled := False;
      toolbtnDiscnDB.Enabled := false;
      mmOperate_DiscnDB.Enabled := false;
    end;procedure TfrmDemoTree.toolbtnCnDBClick(Sender: TObject);
    begin
      ConnectDB;
    end;procedure TfrmDemoTree.toolbtnDiscnDBClick(Sender: TObject);
    begin
      DisConnectDb;
      //清空树、ListViwe
      if tvDemoTree.Items.Count <> 0 then
        tvDemoTree.Items.Clear;
      if lvDemoTree.Items.Count <> 0 then
        lvDemoTree.Items.Clear;
    end;procedure TfrmDemoTree.mmOperate_DiscnDBClick(Sender: TObject);
    begin
      DisConnectDb;
      //清空树、ListViwe
      if tvDemoTree.Items.Count <> 0 then
        tvDemoTree.Items.Clear;
      if lvDemoTree.Items.Count <> 0 then
        lvDemoTree.Items.Clear;
    end;procedure TfrmDemoTree.mmOperate_CnDBClick(Sender: TObject);
    begin
      ConnectDB;
    end;procedure TfrmDemoTree.BuildTree(mP_TreeNode: TTreeNode; mPid: integer);
    //用递归一次性生成所有树节点
    var
      idTemp:integer;
      strSQL:string;
      qryTemp:TQuery;
      TrNodeTemp:TTreeNode;
    begin
      TrNodeTemp := mP_TreeNode;
      qryTemp := TQuery.Create(self);
      try
        strSQL := ' select id,name '
                + ' from Tcity '
                + ' where Parentid='+inttostr(mpid);
        ExecQry(strSQL,qryTemp,true);
        while not qryTemp.Eof do
        begin
          idTemp := qryTemp.fieldbyname('id').AsInteger;
          tvDemoTree.Selected := tvDemoTree.Items.AddChild(TrNodeTemp,qryTemp.fieldbyname('name').AsString);
          BuildTree(tvDemoTree.Selected,idTemp);
          qryTemp.Next;
        end;
      finally
        qryTemp.Free;         //释放资源
      end;
    end;procedure TfrmDemoTree.InitListView;
    //初始化ListView
    var
      name,strSQL:string;
      lvItem:TListItem;
      Tempqry:TQuery;
    begin
      Tempqry := TQuery.Create(self);
      try
        lvDemoTree.Items.Clear;       //清空
        name := tvDemoTree.Selected.Text;
        strSQL := ' select id '
                + ' from Tcity '
                + ' where name='''+name+'''';
        ExecQry(strSQL,dmDemoTree.qryLV,true);
        if not dmDemoTree.qryLV.Eof then
        begin
          strSQL := ' select * '
                  + ' from Tcity where parentid='
                  + inttostr(dmDemoTree.qryLV.fieldbyname('id').asinteger);
          ExecQry(strSQL,dmDemoTree.qryLV,true);
          while not dmDemoTree.qryLV.Eof do
          begin
            lvItem := lvDemoTree.Items.Add;
            lvItem.Caption := inttostr(dmDemoTree.qryLV.fieldbyname('id').AsInteger);
            lvItem.SubItems.Add(dmDemoTree.qryLV.fieldbyname('name').AsString);
            strSQL := ' select name '
                    + ' from Tcity '
                    + ' where id='
                    + inttostr(dmDemoTree.qryLV.fieldbyname('parentid').AsInteger);
            ExecQry(strSQL,Tempqry,true);
            lvItem.SubItems.Add(Tempqry.fieldbyname('name').AsString);
            dmDemoTree.qryLV.Next;
          end;
        end;
      finally
        Tempqry.Free;
      end;
    end;procedure TfrmDemoTree.InitTree;
    begin
      tvDemoTree.Items.BeginUpdate;
      tvDemoTree.Items.Clear;
      BuildTree(nil,0);
      tvDemoTree.Items.EndUpdate;
    end;procedure TfrmDemoTree.mmFile_ExitClick(Sender: TObject);
    begin
      close;
    end;procedure TfrmDemoTree.toolbtnExitClick(Sender: TObject);
    begin
      close;
    end;procedure TfrmDemoTree.tvDemoTreeClick(Sender: TObject);
    begin
      if tvDemoTree.Items.Count <> 0 then   //对数为空进行特殊处理
      begin
        lvDemoTree.Items.BeginUpdate;
        InitListView;
        lvDemoTree.Items.EndUpdate;
      end;
    end;procedure TfrmDemoTree.toolbtnBuildTreeClick(Sender: TObject);
    begin
      InitTree;
    end;procedure TfrmDemoTree.mmOperate_BuildTreeClick(Sender: TObject);
    begin
      InitTree;
    end;procedure TfrmDemoTree.tvDemoTreeMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    This is a TreeView!';
    end;procedure TfrmDemoTree.lvDemoTreeMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    This is a ListView!';
    end;procedure TfrmDemoTree.toolbtnExitMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    关闭按钮,退出请点击!';
    end;procedure TfrmDemoTree.toolbtnCnDBMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    连接数据库按钮,需要连接数据库请点击!';
    end;procedure TfrmDemoTree.toolbtnDiscnDBMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    断开数据连接按钮,需要断开数据库请点击!';
    end;procedure TfrmDemoTree.toolbtnBuildTreeMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '    树生成按钮,需要生成树节点请点击!';
    end;procedure TfrmDemoTree.toolbDemoTreeMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      sbDemo.SimpleText := '';
    end;procedure TfrmDemoTree.sbDemoMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
      sbDemo.SimpleText := '';
    end;end.
      

  2.   

    //ADO{$R *.dfm}{ TfrmTreeTest }procedure TfrmTreeTest.ExecADOQry(strSQL: String; adoqry: TADOQuery;
      IsSelect: Boolean);
    begin
      adoqry.Close;
      if adocnTreeTest.Connected = False then
        adocnTreeTest.Connected := True;
      adoqry.Connection := adocnTreeTest;
      adoqry.SQL.Clear;
      adoqry.SQL.Add(strSQL);
      if IsSelect then
        adoqry.Open
      else
        adoqry.ExecSQL;
    end;procedure TfrmTreeTest.BuildTree(P_TreeNode: TTreeNode; Pid: integer);
    var
      idTemp:integer;
      strSQL:string;
      adoqryTemp:TADOQuery;
      TrNodeTemp:TTreeNode;
    begin
      TrNodeTemp := P_TreeNode;
      adoqryTemp := TADOQuery.Create(self);
      try
    {    if P_TreeNode = nil then
        begin }
        strSQL := ' select id,name '
                + ' from Tcity '
                + ' where Parentid='+inttostr(pid);
        ExecADOQry(strSQL,adoqryTemp,true);
        while not adoqryTemp.Eof do
        begin
          idTemp := adoqryTemp.fieldbyname('id').AsInteger;
          tvTest.Selected := tvTest.Items.AddChild(TrNodeTemp,adoqryTemp.fieldbyname('name').AsString);
          BuildTree(tvTest.Selected,idTemp);
          adoqryTemp.Next;
        end;
      finally
        adoqryTemp.Free;
      end;
    end;