procedure Tdtmdl1.DataMod(Sender:TObject);
begin
  if con1.Connected then
  con1.Close;
  con1.ConnectionString:='Provider=SQLOLEDB.1;Password=kji@jiaj;'+
                         'Persist Security Info=True;User ID=kji;'+
                         'Initial Catalog=HC_kji;Data Source=192.168.1.6\MAC_INSTANCE;'+
                         'Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;'+
                         'Workstation ID=PC2013061008WRV;Use Encryption for Data=False;'+
                         'Tag with column collation when possible=False';
  con1.Open;
end;
TMD代码procedure TMainForm.FillTreeView(TreeView:TTreeView);
  procedure CreateSubTree(FNodeName: string; Node: TTreeNode = nil);
  var
    mLocalName: string;
    TreeNode: TTreeNode;
    Ads_Tmp: TADODataSet;
  begin
    Ads_Tmp:=dtmdl1.ds1.Create(nil);//到这里运行就会报错,是什么原因?
    Ads_Tmp.Connection := dtmdl1.con1;
    with ADS_Tmp do
    try
      Close;
      CommandText := 'Select * from Dir Where PID =' + FNodeName;
      Open;
      First;
      while not Eof do
      begin
        mLocalName := FieldbyName('ID').Asstring;
        TreeNode := TreeView.Items.AddChild(Node, FieldByName('Caption').AsString);
        CreateSubTree(mLocalName, TreeNode); // 此处循环递归
        Next;
      end;
    finally
      ADS_Tmp.Free;
    end;
  end;
begin
  TreeView.Items.BeginUpdate;
  TreeView.Items.Clear;
  with TreeView.Items.Add(nil, '所有目录') do
  begin
    ImageIndex := 1;
    SelectedIndex := 1;
  end;
  CreateSubTree('0', TreeView.Items[0]);
  TreeView.Items.EndUpdate;
  //TreeView.Items[1].Selected := True; //展开部门end;使用代码

解决方案 »

  1.   

    错误代码
    检测到错误类EAccessViolation错误信息:‘Access violation at address 004dff73 in module’
      

  2.   

    已经自动那里错了。
    上面代码
     Ads_Tmp:=dtmdl1.ds1.Create(nil);//<SPAN style="COLOR: #ff0000">到这里运行就会报错,是什么原因?</SPAN>     
    Ads_Tmp.Connection := dtmdl1.con1; 
    这里错误,第一次使用TMD是不是我那里设置或者写错了?
      

  3.   

    下面那个使用错了吗?
    Ads_Tmp.Connection := dtmdl1.con1; 
    dtmdl1.con1;是TMD的
      

  4.   

    Ads_Tmp.Connection := dtmdl1.con1; 这个是没问题的。
      

  5.   


    但是它就是报错了。
    Access violation at address 004e004f is module
      

  6.   

    我记得 Ads_Tmp:=TADODataSet.Create(nil);  这里不能传nil要传一个 对象吧!
      

  7.   


    放一个conl在窗体上又可以。 Ads_Tmp.Connection:=dtmdl1.con1;
    这样可以
     Ads_Tmp.Connection:=con1;
    这样又不行了
      

  8.   

    CreateSubTree(mLocalName, TreeNode); // 此处循环递归问题出在这里。
      

  9.   

    加载树有其他更快的方法。查询一次就够了。
    procedure TForm1.btn1Click(Sender: TObject);
    const
      ID_DEPT = 2;
    var
      nLevel: Integer;
      pNodes: array[0..1023] of TTreeNode;
      lpID, lpName: string;
    begin
      try
        qryFuncTree.Close;
        qryFuncTree.SQL.Clear;
        qryFuncTree.SQL.Add('select TreeNo, FuncID, Caption from PubFunc where ' +
          ' TreeNo like ''99%''  order by TreeNo');
        qryFuncTree.Open;
        pNodes[0] := nil;
        tvFuncTree.DoubleBuffered := True;
        tvFuncTree.Parent.DoubleBuffered := True;
        tvFuncTree.Items.BeginUpdate;
        tvFuncTree.Perform(TVM_SETITEMHEIGHT, 18, 0); // 调整行高
        tvFuncTree.Images := ilFuncTree;
        tvFuncTree.Items.Clear;
        if qryFuncTree.RecordCount > 0 then
        begin
          while not qryFuncTree.Eof do
          begin
            lpID := qryFuncTree.FieldByName('TreeNo').AsString;
            lpName := qryFuncTree.FieldByName('Caption').AsString;
            nLevel := Length(lpID) div ID_DEPT;
            pNodes[nLevel] := tvFuncTree.Items.AddChild(pNodes[nLevel - 1], lpName);
            lstFuncTree.AddObject(lpID, pNodes[nLevel]); //保存功能ID到对应变量列表
            qryFuncTree.Next;
          end;
        end;
        tvFuncTree.FullExpand;
        if tvFuncTree.Items.Count > 0 then
          tvFuncTree.Selected := tvFuncTree.Items[0];
      finally
        tvFuncTree.Items.EndUpdate;
      end;
    end;