|
|
1
14
套
|
|
|
2
12
通过这种方式,您可以继续以通用方式使用控件,并且仍然可以通过以下方式获得值:
这种方法也可以用于其他对象的列表。例如,包含TPerson对象实例的TObjectList:
一个更好的方法(不依赖于值是整数)是预处理列表,将值包装在一个简单的类中,并将其实例添加到列表的对象中。 简单-扩展的基于RTTI的-包装类:
如果您使用的是Delphi的D2010之前版本,只需使用
将列表加载到组合框现在是一个简单的赋值:
从列表中获取名称和值:
或从组合框:
在我的博客上可以找到同样的信息和更全面的解释: TL;DR version of Name Value Pairs in ComboBoxes and Kinfolk |
|
3
1
让我们考虑一下将来某人将如何维护您的应用程序。你可能会自己回到这个代码,然后想,“我在想什么?”。记住“最小惊奇原则”。用他们本该用的方式来使用东西,让你自己和你的同事免于痛苦。 |
|
|
4
1
我同意Marjan Venema的解决方案,因为它使用已经内置的支持在TStringList中存储对象。 我也处理过这个问题,我首先使用上面发布的带有“csOwnerDrawFixed”的解决方案的调整版本派生出了自己的组合框组件。我实际上需要存储一个ID(通常来自数据库)和一个文本。ID将对用户隐藏。我认为这是一种常见的情况。ItemIndex只用于从列表中检索数据,它实际上不是一个有意义的变量,如上面发布的示例所示。
所以,我制作的第二个版本使用了AddObject方法。它用CPU来换取更多的内存消耗,但这是一个公平的交易,因为事情要快得多。 用户看到的文本通常存储在combo.Items中,所有其他数据存储在与每个元素相关联的TStringList中。无需重写DrawItem,因此可以从例如TmxFlatComboBox派生并保持其平面外观。
在这两个版本中,所有数据(甚至ID)都表示为字符串,因为它使事情更一般,所以在使用它们时,需要进行大量stroint转换,反之亦然。
还有,一个
使用相同的原理,还可以派生自定义列表框或复选框。 |