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