【问题标题】:Is correct the function of Delphi XE-8 below?下面的Delphi XE-8的功能是否正确?
【发布时间】:2015-12-23 21:06:35
【问题描述】:
function Trim_emo(SL: TStringList): TStringList;
var
  I:Integer;
  S:string;
begin
  Result := TStringList.Create;
  if (SL.Text='') then
  begin
    Exit;
  end;
  try
    Result.Clear;
    for I := 0 to SL.Count-1 do
    begin
      S := SL[I];
      S := Trim(S);
      if (S<>'') then
        Result.Add(ANSIUpperCase(S));
    end;
  except
    on E : exception do
      ShowMessage(E.Message);
  end;
end;

当 StringList 包含 UTF-8 字符时,这个函数能正常工作吗?

【问题讨论】:

  • 释放结果怎么样?
  • @RepeatUntil 这是调用者的责任
  • 当您使用 UTF-8 字符测试时它工作正常吗?
  • 这似乎是您可以在比您来这里发布您的问题更短的时间内测试自己的东西。你不这样做有什么原因吗?

标签: delphi utf-8


【解决方案1】:

您的代码将永远不必处理 UTF-8 字符,因为它永远不会遇到它们。 Delphi 字符串是 UTF-16 编码的。如果您想知道代码将如何与 Unicode 输入一起工作,那么没有问题。 UTF-16 是一种完整的 Unicode 编码。

您的代码有几个问题:

  • 如果引发异常,代码将泄漏字符串列表实例。
  • 您的异常处理已损坏。如果引发并处理了异常,则会显示错误消息。然而,执行继续进行,就好像什么都没发生一样。只需删除异常处理,让异常向上浮动。
  • 评估Text 只是为了检查输入是否为空是很浪费的。如果输入不为空,您可以创建一个很长的字符串,然后立即丢弃。这个测试根本没有必要,可以删除。

这样会更好:

function  Trim_emo(SL: TStringList): TStringList;
var  
  I: Integer; 
  S: string;
begin 
  Result := TStringList.Create; 
  try
    for I := 0 to SL.Count-1 do
    begin
      S := Trim(ANSIUpperCase(SL[I]));      
      if S<>'' then
        Result.Add(S);
    end;
  except
    Result.Free;
    raise;
  end;
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2011-12-05
    • 2011-09-16
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多