从D2007转换为XE2,我转换了此功能

function Add_Line( FileStream : TFileStream; ALine : string) : boolean;


function Add_Line( FileStream : TFileStream; ALine : string; Enc: TEncoding = nil) : boolean;
var
  AStr: ANSISTring;
begin
  Result := True;
  if Enc = nil then Enc := TEncoding.ANSI;
  try
//Old    FileStream.WriteBuffer( Pointer(ALine)^, Length(ALine) );
    if Enc = TEncoding.UTF8 then
      AStr := UTF8Encode(ALine)
    else
      AStr := ANSIString(ALine);
    FileStream.WriteBuffer( AStr[1], Length(ALine) );
    end;
  except
    Result := False;
  end;
end;

理由:
  • 尽可能少地使用Add_Line更改代码
  • 接受自动更改为Unicode的操作,仅在最后一刻写入8位文本文件(在XML和CSV中使用)。将来,如果需要,我们仍然可以移至UTF-16文件。

  • 我想定义类似以下内容的东西:
    function Add_Line( FileStream : TFileStream; ALine : string; Enc: TEncoding = TEncoding.ANSI) : boolean;
    

    但是编译器提示;-)

    这样有可能吗?

    最佳答案

    默认参数必须是编译时常量,但是如果您需要更高级的设置,则可以创建重载:

    function Add_Line( FileStream : TFileStream; ALine : string) : boolean; overload;
    function Add_Line( FileStream : TFileStream; ALine : string; Enc: TEncoding) : boolean; overload;
    
    
    function Add_Line( FileStream : TFileStream; ALine : string) : boolean;
    begin
      Result := Add_Line(FileStream, ALine, TEncoding.ANSI);
    end;
    

    您甚至可以添加inline关键字,以获取与默认参数有效的生成代码完全相同的生成代码。

    注意:除了TEncoding.ANSITEncoding.UTF8,您似乎不支持任何其他功能。在这种情况下,TEncoding参数似乎过大了,您可以改用UTF8: Boolean参数(或重新编写代码以使用任意编码的CodePage)。

    注意2:FileStream.WriteBuffer( AStr[1], Length(ALine) );是错误的,因为Length(ALine)Length(AStr)不必相同,您应该改用Length(AStr)。此外,当AStr[1]为空字符串时,AStr可能会导致异常,您可以添加一种特殊情况,即仅当WriteBuffer不为空时才调用AStr

    10-05 22:40