我有两个过程,一个ParseRecord,用来将sRecord解析为一个个字段,然后将其存入TStringList中
另一个过程GenerateSQL,接受TStringList类型的参数,即前面解析后的字段.
我现在的问题是,如果将ParseRecord过程的GenerateSQL注释掉,解析出来的字段是正确的,
但如果加上GenerateSQL过程,有些字段解析出来是乱码了..想问各位大虾,我在GenerateSQL过程中对TStringList的操作,会改变原来的实参吗?如果会,我应该怎么做?procedure ParseRecord(const sRecord: String);
var
  slFields: TStringList;
begin
  .....
  GenerateSQL(slFields);
end;procedure GenerateSQL(const slFields: TStringList);
var
  //iFileHandle:  Integer;
  //iBytesWrite:  Integer;
  buffer:       String;
  index:        Integer;
begin
  buffer := '';
  for index := 0 to slFields.Count-2 do
    buffer := buffer + sTemp + ',';
  buffer := buffer + slFields[slFields.Count-1];  buffer := Format(FmtString, [buffer]); 
end;

解决方案 »

  1.   

    嗯,我第一次用DELPHI,听您说了知道有COMMATEXT属性,便我的程序用了COMMATEXT后崩溃了
      

  2.   

    procedure GenerateSQL(const slFields: TStringList);
    var
      //iFileHandle:  Integer;
      //iBytesWrite:  Integer;
      buffer:       String;
      index:        Integer;
    begin
      buffer := slFields.commatext;  buffer := Format(FmtString, [buffer]); 
    end;
      

  3.   

    呵呵,不会改变,除非你用var你怎么看出是乱码的?就是说你的测试程序在哪里?
      

  4.   

    想问各位大虾,我在GenerateSQL过程中对TStringList的操作,会改变原来的实参吗?
    -------------------
    看你怎么操作了,读不会,写会。
      

  5.   

    我把我的代码贴出来吧procedure GenerateSQL(const slFields: TStringList);
    var
      //iFileHandle:  Integer;
      iBytesWrite:  Integer;
      buffer:       String;
      index:        Integer;
      sTemp :       String;
    begin
      {$ifdef _THE_DEBUG_SQL}
      Writeln('Generating SQL <' + SQLFileName + '>...');
      {$endif}  buffer := slFields.CommaText;  //slFields.CommaText = s
     (*
      buffer := '';
      for index := 0 to slFields.Count-2 do
      begin
        sTemp := slFields[index];
        buffer := buffer + sTemp + ',';
      end;
      buffer := buffer + slFields[slFields.Count-1]; *)  buffer := Format(FmtString, [buffer]);  // 格式化成insert语句  {$ifdef _THE_DEBUG_SQL}
      //for index := 0 to slFields.Count -1 do
       // Writeln(slFields[index]);
      Writeln(buffer);
      {$endif}  ...
    end;上面的
      {$ifdef _THE_DEBUG_SQL}
      //for index := 0 to slFields.Count -1 do
       // Writeln(slFields[index]);
      Writeln(buffer);
      {$endif}
    不管是打印slFields还是buffer都有乱码出现
    而在
    procedure ParseRecord(const sRecord: String);
    begin
      ...
      {$ifdef _THE_DEBUG_RECORD}
      for index := 0 to slFields.Count-1 do
        Writeln(slFields[index]);
          //Writeln(sField);
      {$endif}  GenerateSQL(slFields);
    end;
    如果没有GenerateSQL(slFields);打印出的字段是正确的,而加上GenerateSQL(slFields);打印出的字段也是有乱码的
      

  6.   

    procedure GenerateSQL(const slFields: TStringList);
    var
      //iFileHandle:  Integer;
      iBytesWrite:  Integer;
      buffer:       String;
      index:        Integer;
      sTemp :       String;
    begin
      {$ifdef _THE_DEBUG_SQL}
      Writeln('Generating SQL <' + SQLFileName + '>...');
      {$endif}  buffer := slFields.CommaText;  buffer := Format(FmtString, [buffer]);  // 格式化成insert语句  {$ifdef _THE_DEBUG_SQL}
      //for index := 0 to slFields.Count -1 do
       // Writeln(slFields[index]);
      Writeln(buffer);
      {$endif}  ...
    end;不必要的代码忘删了,对不起
      

  7.   

    能写进去,stringlist,本身传的是一个指针
      

  8.   

    楼上的意思是说我在GenerateSQL操作中,改变了TStringList的对象?
      

  9.   

    如果你是对TStringList里面的内容操作就会改变,但是你要是对TStringList本身操作就不会改变,当然了,你用了Const,改变TStringList的时候会报错。