Delphi 7:选择TList的某些项目
在Delphi中,我有一个基于TList的类。它是TPetList。TPetList的每个实例都可以有TPet类的一些项。TPetList的实例使用for循环显示在TListView组件中 TPet基于TObject,具有以下字段: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中的
- 城市
- 年龄
- 繁殖
如果我删除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'
- 过滤器-您可以使用任何运算符对任何字段执行任何可逆过滤。对于内存数据集,将
属性设置为Breed=“foo”和Filter
属性设置为“True”就足够了。对于RDBMSE,您可以通过相同的方式和/或使用标准SQL:Filtered
。您还可以使用“从宠物中选择*,其中BREED='foo'按名称排序
事件来进行此操作。当然,您可以清除过滤器,并反转操作:将OnFilterRecord
属性设置为“False”-或-发出类似以下SQL的命令:过滤器
(不带WHERE子句)等'SELECT*FROM PETS'
- 编辑-每个数据类型都有专用控件(包括用于多行输入的网格)。对于“年龄”字段,输入仅限于数字。当然,您还有
事件,如果“年龄”在0到33之间(例如),您可以在该事件中进行测试OnValidate
你有所有的机制。也许走这条路比重新发明轮子要好。哦,很简单:D非常感谢,这很好。谢谢,但是我的Delphi 7不知道TDataSet,我不知道为什么。@marco92w:TDataSet是一个“隐藏”类。他是所有人的祖父。你看不见它。这就是为什么我说TDataSet后裔。查找TClientDataSet(如果您有Architect(?IIRC…)版本)或Google查找“绝地JVCL”,安装它并查找TjvMemoryData(在Jv数据访问页面上)。此外,如果您想使用成熟的数据库引擎,请访问Delphi7的帮助并搜索“构建数据库应用程序”(或类似内容)。