在上一个(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;
问:在这种情况下我可以使用类助手吗?与上面设计一个新类相比,这会是什么样的?
答案 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;