在Delphi中,我有一个基于TList的类。它是TPetList。 TPetList的每个实例都可以具有TPet类的某些项目。 TPetList的实例使用for循环显示在TListView组件中。

TPet基于TObject,具有以下字段:



年龄
品种


现在,我有了一个复选框列表,用户可以在其中勾选他想看到的品种。因此,如果他只想看XYZ品种的宠物,我只想显示“ breed”值设置为“ XYZ”的条目,而TPetList和TListView中的顺序必须保持不变。

我怎样才能做到这一点?

如果我删除TPetList中的项目并在TListView中显示其余项目,则一切正常,直到用户希望看到另一个品种为止。该品种之前已被删除,无法显示。

最佳答案

而不是删除,请尝试选择一个新列表。像这样:

function TPetList.Filter(criteria: TPetCriteria): TPetList;
var
  i: integer;
begin
  result := TPetList.Create;
  for i := 0 to self.Count - 1 do
    if criteria.matches(self[i]) then
      result.add(self[i]);
end;


如何执行标准取决于您,但这是总的想法。请记住,此返回的列表是一个子视图,并且不拥有其包含的项目,因此在释放过滤后的列表时不要释放它们。

10-08 12:09