delphi helper类,删除空字符串

时间:2014-04-09 10:14:11

标签: delphi

在上一个(remove empty strings from list)问题中,我询问过从字符串列表中删除空字符串

....
// 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;

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

2 个答案:

答案 0 :(得分:9)

这里有一个好帮手。为了使其更广泛适用,您应该选择将帮助程序与帮助程序可以应用的派生类最少的类相关联。在这种情况下,这意味着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的{​​{1}}方法,为未来的代码读者提供了一种语义更有意义的方法。
  • 包含IndexOf(...)<>-1属性的Data[]属性,类型为NativeInt,且匹配AddData方法。这会隐藏Objects[]TObject之间的演员阵容。

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

答案 1 :(得分: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;