Delphi 7:选择TList的某些项目

Delphi 7:选择TList的某些项目,delphi,class,list,listview,Delphi,Class,List,Listview,在Delphi中,我有一个基于TList的类。它是TPetList。TPetList的每个实例都可以有TPet类的一些项。TPetList的实例使用for循环显示在TListView组件中 TPet基于TObject,具有以下字段: 城市 年龄 繁殖 现在我有了一个复选框列表,用户可以在其中勾选他想看到的品种。因此,如果他只想看到XYZ品种的宠物,我只想显示“品种”值设置为“XYZ”的条目,而TPetList和TListView中的顺序必须保持不变 我该怎么做 如果我删除TPetList中的

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

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

  • 城市
  • 年龄
  • 繁殖
现在我有了一个复选框列表,用户可以在其中勾选他想看到的品种。因此,如果他只想看到XYZ品种的宠物,我只想显示“品种”值设置为“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;

如何实施这些标准取决于您,但这是总体思路。请记住,此返回的列表是一个子视图,不拥有它包含的项目,因此在释放筛选列表时不要释放它们。

您可以将对象存储在数据集中。(您可以使用内存数据集,如TClientDataSet、JVCL的TjvMemoryData或任何其他TDataSet子体,包括完整的RDBMS)

通过这种方式,您解决了以下问题:

  • 持久性(存储)-您的RDBMS将处理这个问题。对于内存数据集,可以使用Load/SaveToFile等方法
  • 排序-有一些简单的方法可以做到这一点,或者如果您选择SQL后端,一个简单的
    'SELECT*FROM PETS ORDER BY NAME'
    将完成您的工作
  • 过滤器-您可以使用任何运算符对任何字段执行任何可逆过滤。对于内存数据集,将
    Filter
    属性设置为Breed=“foo”和
    Filtered
    属性设置为“True”就足够了。对于RDBMSE,您可以通过相同的方式和/或使用标准SQL:
    “从宠物中选择*,其中BREED='foo'按名称排序
    。您还可以使用
    OnFilterRecord
    事件来进行此操作。当然,您可以清除过滤器,并反转操作:将
    过滤器
    属性设置为“False”-或-发出类似以下SQL的命令:
    'SELECT*FROM PETS'
    (不带WHERE子句)等
  • 编辑-每个数据类型都有专用控件(包括用于多行输入的网格)。对于“年龄”字段,输入仅限于数字。当然,您还有
    OnValidate
    事件,如果“年龄”在0到33之间(例如),您可以在该事件中进行测试

你有所有的机制。也许走这条路比重新发明轮子要好。

哦,很简单:D非常感谢,这很好。谢谢,但是我的Delphi 7不知道TDataSet,我不知道为什么。@marco92w:TDataSet是一个“隐藏”类。他是所有人的祖父。你看不见它。这就是为什么我说TDataSet后裔。查找TClientDataSet(如果您有Architect(?IIRC…)版本)或Google查找“绝地JVCL”,安装它并查找TjvMemoryData(在Jv数据访问页面上)。此外,如果您想使用成熟的数据库引擎,请访问Delphi7的帮助并搜索“构建数据库应用程序”(或类似内容)。