有没有办法在知道字段名称和值的情况下更新记录中的字段
给定一条记录:
MyRecord = record
Company: string;
Address: string;
NumberOfEmplyees: integer;
您能否编写一个函数调用,
function UpdateField(var FieldName: string; FieldValue: variant): bool;
如下所示:
UpdateField('Company', 'ABC Co');
将 MyRecord.Company 更新为“ABC Co”?
我寻找了一个示例,但我找到的所有内容都是针对数据库的。任何为我指明正确方向的帮助都将受到赞赏。
谢谢, 查尔斯
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Delphi 7 RTTI 知道并且可以从
TypeInfo(aRecordType)
检索的是:最新信息对于在运行时释放记录内每个引用计数变量使用的内存或复制记录内容是必需的。记录的初始化也可以在编译器生成的代码中执行(如果记录是在堆栈上创建的),可以通过
_InitializeRecord()
方法执行,也可以在类或动态数组被实例化。在所有版本的 Delphi 中,
record
和object
类型都是相同的。您可以注意到,现代版本的 Delphi 中存在一个错误(包括 Delphi 2009)至少 2010 年),有时不会创建用于初始化堆栈上对象的代码。您必须使用 record 来代替,但这会破坏与以前版本的 Delphi 的兼容性。 :(
以下是用于存储此 RTTI 数据的结构:
使用此数据,您可以执行以下操作:
例如,以下是如何使用此 RTTI 比较相同类型的两个记录:
因此,出于您的目的,Delphi 7 RTTI 可以让您了解什么运行时,是记录中每个字符串的位置。使用上面的代码,您可以轻松地使用字段索引创建一个函数:
但是您根本没有实现请求所需的信息:
如果您确实需要此功能,Delphi 7 下唯一的解决方案是不使用记录,而是使用类。
在 Delphi 7 上,如果您创建一个包含已发布字段的类,您将拥有以下所有需要的信息:所有已发布的字段。然后您可以更新此类已发布的字段内容。这就是 VCL 运行时将 .dfm 内容反序列化到类实例中或使用 ORM 方法。
What Delphi 7 RTTI knows, and can be retrieved from
TypeInfo(aRecordType)
, is:The latest information is necessary to free the memory used by each reference-counted variables inside the record, or copy the record content, at run-time. The initialization of the record is also performed either in compiler-generated code (if the record is created on the stack), either via
_InitializeRecord()
method, either with a global fill to 0 when a class or a dynamic array is instanciated.It's the same for both
record
andobject
types, in all version of Delphi.You can note that there is a bug in modern version of Delphi (including Delphi 2009 and 2010 at least), which sometimes don't create the code for initializing objects on stack. You'll have to use record instead, but it will break compatibility with previous version of Delphi. :(
Here are the structure used for storing this RTTI data:
Using this data, here is for instance what you can do:
For instance, here is how two records of the same type can be compared, using this RTTI:
So for your purpose, what Delphi 7 RTTI could let you know at runtime, is the position of every string within a record. Using the code above, you could easily create a function using the field index:
But you simply don't have the needed information to implement your request:
If you really need this feature, the only solution under Delphi 7 is to use not records, but classes.
On Delphi 7, if you create a class with published fields, you'll have all needed information for all published fields. Then you can update such published field content. This is what the VCL runtime does when unserializing the .dfm content into class instances, or with an ORM approach.
您需要现代版本的 Delphi 来完成您所要求的操作,而无需手动编码查找,例如通过表格。
Delphi 2010 中引入的更新后的 RTTI 可以支持您正在寻找的内容,但 Delphi 7 中没有任何内容可以为记录执行此操作。
You need modern versions of Delphi to do what you ask for without resorting to manually coding the lookups, e.g. via a table.
The updated RTTI introduced in Delphi 2010 can support what you are looking for, but there's nothing in Delphi 7 that will do this for records.