Delphi助手类,删除空字符串。

5
在之前的问题中(删除Delphi中字符串列表中的空字符串)我提到了如何从字符串列表中删除空字符串。
....
// Clear out the items that are empty
for I := mylist.count - 1 downto 0 do
begin
  if Trim(mylist[I]) = '' then
    mylist.Delete(I);
end;
....

从代码设计和重用的角度考虑,我现在更喜欢一种更灵活的解决方案:

 MyExtendedStringlist = Class(TStringlist)

 procedure RemoveEmptyStrings;

 end;

问:在这种情况下我可以使用一个类助手吗?相比上面设计新类,它会是什么样子?


最简单的解决方案实际上是 procedure RemoveEmptyStrings(s: TStrings);。将其作为类助手只是语法糖。 - Stefan Glienke
@stefan,问题的核心是如何应用这个语法糖。 - David Heffernan
我知道,但是如果您看一下链接的问题(以及其答案),就会发现从未显示出您实际上可以通过独立的例程来解决此问题,这将是最简单的方法。它不需要子类或帮助程序来完成这个任务。我的前一个评论的目的就是要指出这一点。 - Stefan Glienke
2个回答

10

在这里使用类助手是一个好主意。为了使其更加普适,您应该选择将辅助程序与可以应用该辅助程序的最不派生的类相关联。在这种情况下,这意味着选择 TStrings

与派生新类相比,巨大的优势是您的辅助方法可用于您未创建的 TStrings 实例。明显的例子包括公开备忘录、列表框等内容的TStrings 属性。

我个人会编写一个提供更一般的删除功能的助手,使用谓词。例如:

type
  TStringsHelper = class helper for TStrings
  public
    procedure RemoveIf(const Predicate: TPredicate<string>);
    procedure RemoveEmptyStrings;
  end;

procedure TStringsHelper.RemoveIf(const Predicate: TPredicate<string>);
var
  Index: Integer;
begin
  for Index := Count-1 downto 0 do
    if Predicate(Self[Index]) then
      Delete(Index);
end;

procedure TStringsHelper.RemoveEmptyStrings;
begin
  RemoveIf(
    function(Item: string): Boolean
    begin
      Result := Item.IsEmpty;
    end;
  );
end;

更普遍地说,TStrings 是一个非常适合作为类助手的候选对象。它缺少相当多的有用功能。我的助手包括:

  • AddFmt 方法可以一次进行格式化并添加。
  • AddStrings 方法可在一次调用中添加多个项。
  • Contains 方法包装了 IndexOf(...)<>-1 并向代码未来的读者呈现出一种更有语义意义的方法。
  • Data[] 属性是 NativeInt 类型的,并匹配 AddData 方法,将 Objects[] 属性进行了封装。这隐藏了 TObjectNativeInt 之间的转换。

我确信还可以添加更多有用的功能。


class helper和Predicate: TPredicate是我新学的两个项目;还在学习中... - Franz

7
您可以使用 HelperClass,但应该基于 TStrings,这将提供更多的灵活性。
例如:
type
TMyStringsClassHelper = class helper for TStrings
       Procedure RemoveEmptyItems;
    end;

{ TMyStringsClassHelper }

procedure TMyStringsClassHelper.RemoveEmptyItems;
var
 i:Integer;
begin
  for i := Count - 1 downto 0 do
    if Self[i]='' then Delete(i);

end;

procedure TForm5.Button1Click(Sender: TObject);
var
 sl:TStringList;
begin
  sl:=TStringList.Create;
  sl.Add('AAA');
  sl.Add('');
  sl.Add('BBB');
  sl.RemoveEmptyItems;
  Showmessage(sl.Text);
  Listbox1.Items.RemoveEmptyItems;
  Memo1.Lines.RemoveEmptyItems;
  sl.Free;
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接