TAdostring := Tstringlist.Create;
    TFieldstring := Tstringlist.Create;
  try
     
     调用一个公共模块同样含两个Tstringlist
     ExporttoExcel(TAdostring,TFieldstring);
  finally
    TAdostring.Free;  //开始报错
    TFieldstring.Free;

解决方案 »

  1.   

    var
        TADOString,
        TFieldString: TStringList;
        procedure ExportToExcel(fSDOString,fFieldString: TStringList);
        begin
        end;
    begin
        TAdostring := Tstringlist.Create;
        TFieldstring := Tstringlist.Create;
      try
         //调用一个公共模块同样含两个Tstringlist
         ExporttoExcel(TAdostring,TFieldstring);
      finally
        TAdostring.Free;  //开始报错
        TFieldstring.Free;
      end;
    end;
    我按上面写,没出错呀!是不是你的‘ExporttoExcel’有误?
      

  2.   

    如果不含ExporttoExcel的话,这本身就是stringlist的标准写法
    我的Exporttoexcel的写法也不复杂
        Tempform := TForm_CM_EXLEXPORT.Create(Application);
        Tempform.Adostring := TAdostring;
        Tempform.Fieldstring := TFieldstring;
        if Tempform.ShowModal = mrOK then
        begin
           
        end;
        Result := True;
      finally
        Tempform.Free;
      end;
    Tempform在Create时创建这两个Stringlist,close时释放
      

  3.   

    你可能在TForm_CM_EXLEXPORT.Destroy中将Adostring 和Fieldstring 销毁(Free)了,也就等于销毁了TAdostring 和TFieldstring 。————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  4.   

    你可能在TForm_CM_EXLEXPORT.Destroy中将Adostring 和Fieldstring 销毁(Free)了,也就等于销毁了TAdostring 和TFieldstring 。————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  5.   

    Tempform.Adostring := TAdostring;
    Tempform.Fieldstring := TFieldstring;
    ========================================
    你引用指针了,应该这样子:
    Tempform.Adostring.Assign(TAdostring);
    Tempform.Fieldstring.Assign(TFieldstring);
    这样子在Tempform.free时就不会把TAdostring,TFieldstring也释放了.
      

  6.   

    何必Assign呢?关键的是你首先要确定是调用者还是执行者(TForm_CM_EXLEXPORT)Free它们。你这里最好是调用者Free,因此在TForm_CM_EXLEXPORT.Destroy中不要Free这两个字符串列表。————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  7.   

    用ASSIGN是可以的
    我不明白的是:
    Tempform.Adostring := TAdostring;
    Tempform.Fieldstring := TFieldstring;
    为什么Tempform的Stringlist释放也会把原赋值的释放而已
      

  8.   

    也许你在调用中已经Free掉了?检查一下吧。
      

  9.   

    Tempform.Adostring := TAdostring;
    Tempform.Fieldstring := TFieldstring;
    改成Assign后则可,这说明是连带的
      

  10.   

    调用后,将Tempform.Adostring := nil;
             ...
    就可,不用 free
      

  11.   

    用ASSIGN是可以的
    我不明白的是:
    Tempform.Adostring := TAdostring;
    Tempform.Fieldstring := TFieldstring;
    为什么Tempform的Stringlist释放也会把原赋值的释放而已
    delphi中的对象都是指针,TempForm.AdoString和TAdostring都是指向同一个对象,其中一个
    释放对象,另外一个就成了无效指标,没有有效对象了。
      

  12.   

    同意lxpbuaa(桂枝香在故国晚秋)
      

  13.   

    揭帖了我还是要说一句:
    TO: lxpbuaa(桂枝香在故国晚秋) 
    >>何必Assign呢?关键的是你首先要确定是调用者还是执行者(TForm_CM_EXLEXPORT)Free它们。>>你这里最好是调用者Free,因此在TForm_CM_EXLEXPORT.Destroy中不要Free这两个字符串列表。
    这是个程序的设计思想问题,模块间的接口就要最大的透明化,如果那个ExporttoExcel是别人提供
    的话,这样如果不注意保护接口变量的话,出了问题都无法调试.