从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;
理由:
我想定义类似以下内容的东西:
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) );
是错误的,因为Length(ALine)
和Length(AStr)
不必相同,您应该改用Length(AStr)
。此外,当AStr[1]
为空字符串时,AStr
可能会导致异常,您可以添加一种特殊情况,即仅当WriteBuffer
不为空时才调用AStr
。