微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

delphi – 如何为TEncoding类型的函数参数设置默认值?

从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.ANSI和TEncoding.UTF8之外,您似乎不支持任何其他内容.在这种情况下,TEncoding参数似乎有点过分,您可以使用UTF8:Boolean参数(或者重新编写代码以使用任意编码的CodePage).

注2:FileStream.WriteBuffer(AStr [1],Length(ALine));因为长度(ALine)和长度(AStr)不必相同,所以你应该使用长度(AStr).另外,当AStr是空字符串时,AStr [1]可能会导致异常,当AStr不为空时,您可以添加一个特殊情况来仅调用WriteBuffer.

原文地址:https://www.jb51.cc/delphi/101684.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐