【问题标题】:Delphi 7: Select certain items of a TListDelphi 7:选择 TList 的某些项目
【发布时间】:2010-02-19 19:39:58
【问题描述】:

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

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

  • 城市
  • 年龄
  • 品种

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

我该怎么做?

如果我删除 TPetList 中的项目并在 TListView 中显示其余项目,那么一切都很好,直到用户想要查看另一个品种。该品种之前已被删除,无法显示。

【问题讨论】:

    标签: delphi class list listview


    【解决方案1】:

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

    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;
    

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

    【讨论】:

    • 哦,原来如此简单 :D 非常感谢,这很好用。
    【解决方案2】:

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

    这样你就解决了以下问题:

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

    您已准备好所有机制。也许走这条路比重新发明轮子更好。

    【讨论】:

    • 谢谢,但我的 Delphi 7 不知道 TDataSet,我不知道为什么。
    • @marco92w:TDataSet 是一个“隐藏”类。所有人的祖父。你看不到它。这就是为什么我说 TDataSet descendant。查找 TClientDataSet(如果您有 Architect(?IIRC...)版本)或 Google 查找“JEDI JVCL”,安装它并查找 TjvMemoryData(位于 Jv 数据访问页面上)。此外,如果您想使用成熟的数据库引擎,请转到 Delphi 7 的帮助并搜索“构建数据库应用程序”(或类似的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2014-08-24
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多