代码如下:
procedure TFrmkd0013.CreateTVList;
var
  TVNode :TTreenode;
  qry_trans :TADOQuery;
  str_sql :string;
begin
  qry_trans :=TADOQuery.Create(self);
  qry_trans.Connection :=dm.adoconn;
  str_sql :='select FItemID,FNumber,FParentid,FName,FShortNumber into #t_item_temp1 from t_item (nolock) where fitemclassid=4  create  index ix_temp1 on #t_item_temp1(fnumber asc,fitemid,fparentid)';
  qry_trans.SQL.Add(str_sql);
  qry_trans.ExecSQL;  TVNode :=TV1.Items.AddChildFirst(TV1.Items.GetFirstNode,'物料');  AddChildNode(TVNode);
  qry_trans.Close;
  qry_trans.SQL.Clear;
  str_sql :='drop table #t_item_temp1';
  qry_trans.SQL.Add(str_sql);
  qry_trans.ExecSQL;
  qry_trans.Free;
end;
procedure TFrmkd0013.AddChildNode(node :TTreeNode);
var
  qry_child :TADOQuery;
  CData :^TCNODE;
  TVNode :TTreenode;
  str_sql :string;
begin
  qry_child :=TADOQuery.Create(self);
  with qry_child do
  begin
    Connection :=dm.adoconn;
    close;
    str_sql :=' select * from #t_item_temp1 (nolock) where  fparentid='+QuotedStr(Data_Str)+' order by FNumber';
    sql.Add(str_sql);
    open;
    first;
    while not eof do
    begin
      new(CData);
      Data_Str :=  fieldbyname('Fitemid').asstring;
      CData^.FNumber := fieldbyname('FNumber').AsString;
      CData^.FName := fieldbyname('FName').AsString;
      CData^.FParentid := fieldbyname('FParentid').AsString;
      TVNode := TV1.Items.AddChildObject(node,fieldbyname('FShortNumber').AsString+'('+fieldbyname('FName').AsString+')',CData);
      TVNode.ImageIndex :=1;
      TVNode.StateIndex :=2;
      AddChildNode(TVNode);
      next;
    end;
  end;
  qry_child.Free;
end;出错如图:

解决方案 »

  1.   

    你可以调试一下看看哪一行报错的。
    我估计是你的字段有为空的,当你做asstring的时候就会报错。你检查一下你的数据。
      

  2.   

    读取的无效地址,跟为空不为空,没有关系。
    procedure TFrmkd0013.CreateTVList;
    var
      TVNode :TTreenode;
      qry_trans :TADOQuery;
      str_sql :string;
    begin
      qry_trans :=TADOQuery.Create(self);
      qry_trans.Connection :=dm.adoconn;
      str_sql :='select FItemID,FNumber,FParentid,FName,FShortNumber into #t_item_temp1 from t_item (nolock) where fitemclassid=4  create  index ix_temp1 on #t_item_temp1(fnumber asc,fitemid,fparentid)';
      qry_trans.SQL.Add(str_sql);
      qry_trans.ExecSQL; //这里如果返回要用qry_trans.Open;  TVNode :=TV1.Items.AddChildFirst(TV1.Items.GetFirstNode,'物料');  AddChildNode(TVNode); //检查这里是否有问题
      qry_trans.Close;
      qry_trans.SQL.Clear;
      str_sql :='drop table #t_item_temp1';
      qry_trans.SQL.Add(str_sql);
      qry_trans.ExecSQL;
      qry_trans.Free;
    end;
    procedure TFrmkd0013.AddChildNode(node :TTreeNode);
    var
      qry_child :TADOQuery;
      CData :^TCNODE;
      TVNode :TTreenode;
      str_sql :string;
    begin
      qry_child :=TADOQuery.Create(self);
      with qry_child do
      begin
        Connection :=dm.adoconn;
        close;
        str_sql :=' select * from #t_item_temp1 (nolock) where  fparentid='+QuotedStr(Data_Str)+' order by FNumber';
        sql.Add(str_sql);
        open;
        first;
        while not eof do
        begin
          new(CData);
          Data_Str :=  fieldbyname('Fitemid').asstring;
          CData^.FNumber := fieldbyname('FNumber').AsString;
          CData^.FName := fieldbyname('FName').AsString;
          CData^.FParentid := fieldbyname('FParentid').AsString;
          TVNode := TV1.Items.AddChildObject(node,fieldbyname('FShortNumber').AsString+'('+fieldbyname('FName').AsString+')',CData);
          TVNode.ImageIndex :=1;
          TVNode.StateIndex :=2;
          AddChildNode(TVNode);//递归调用?
          next;
        end;
      end;
      qry_child.Free;
    end;注意你的CData,你在哪里释放,可能会引起内存泄露。