Delphi:一个更改记录所有字段的过程?
我有这样的记录:Delphi:一个更改记录所有字段的过程?,delphi,record,procedure,Delphi,Record,Procedure,我有这样的记录: Tcustomer=record Name: string; IDNumber: Integer; IsMarried: boolean; end; Procedure ChangeCustomer(CustomerIndex: integer; field: string; value); 我有一个tccustomers\u Manager类,它存储所有客户的列表。有没有可能有这样的程序: Tcustomer=record Name: string;
Tcustomer=record
Name: string;
IDNumber: Integer;
IsMarried: boolean;
end;
Procedure ChangeCustomer(CustomerIndex: integer; field: string; value);
我有一个tccustomers\u Manager
类,它存储所有客户的列表。有没有可能有这样的程序:
Tcustomer=record
Name: string;
IDNumber: Integer;
IsMarried: boolean;
end;
Procedure ChangeCustomer(CustomerIndex: integer; field: string; value);
设置该特定字段的值。例如:
ChangeCustomer(1, 'Name','John');
我如何实现这一点
更新:为了澄清,我的问题基本上分为两部分:
1) 如何将字段名(字符串)映射到记录中的实际字段
2) 是否可以传递具有不同类型的值?或者我应该传递一个类型并对其进行类型转换(比如传递一个字符串,然后使用
stroint()
)例如,您可以这样做(假设lst:TList
如您在评论中所说):
您可以使用类型(或枚举)代替i:byte
。
我很久没有使用Delphi了,所以以我的例子作为一个想法,不像Delphi应用程序 例如,您可以这样做(假设
lst:TList
如您在评论中所说):
您可以使用类型(或枚举)代替i:byte
。
我很久没有使用Delphi了,所以以我的例子作为一个想法,不像Delphi应用程序 我会使用TClientDataSet
如果要传递任何值,可以使用Variant。但在分配之前,您必须检查类型 我会使用TClientDataSet
如果要传递任何值,可以使用Variant。但在分配之前,您必须检查类型 是的,您可以在最新版本的Delphi中使用运行时类型信息执行此操作。然而,放弃静态类型系统并不总是一个好主意。您确定需要这样做吗?您指的是哪个“特定字段”?你必须确定你的客户。你用这个号码吗?这个号码是唯一的吗?更改客户必须知道要更改的客户。您还需要一个“AddCustomer”。“客户名单”是什么意思?TList还是数组?我会用一个小数据库(可能在内存中)来完成你的任务。@Andreas:请。。。这只是代码的一部分,我有一个问题,而不是整个项目!!我班上有一张名单。我将通过ChangeCustomer中的客户索引。我显然有一个AddCustomer()过程。不,这太简单了,无法使用DB。是的,您可以在最新版本的Delphi中使用运行时类型信息来实现这一点。然而,放弃静态类型系统并不总是一个好主意。您确定需要这样做吗?您指的是哪个“特定字段”?你必须确定你的客户。你用这个号码吗?这个号码是唯一的吗?更改客户必须知道要更改的客户。您还需要一个“AddCustomer”。“客户名单”是什么意思?TList还是数组?我会用一个小数据库(可能在内存中)来完成你的任务。@Andreas:请。。。这只是代码的一部分,我有一个问题,而不是整个项目!!我班上有一张名单。我将通过ChangeCustomer中的客户索引。我显然有一个AddCustomer()过程。不,这太简单了,无法使用DB。为什么要进行向下投票?请留下评论解释,以便我能理解和纠正,如果必要的话,请!!!想法是可以的,但是ChangeCustomer如何知道要更改哪个记录?整个概念是不完整的…这是个坏主意。有两个原因:1)它可能适用于包含3个字段的记录,但30个字段如何?这将是一片混乱。2) 每个字段的值类型都不同。您的过程定义(在参数中)中的值的类型是什么?@flom您还必须处理值的类型问题。你的计划是什么?@Flom,
SetPropValue
只对类有效,对记录无效。它使用RTTI来实现它的功能。您可以编写自己的变体,该变体也可用于记录,因为Delphi 2010+RTTI也是为记录生成的(您提到您使用的是TList
,所以您使用的是Delphi 2010+),为什么不投票?请留下评论解释,以便我能理解和纠正,如果必要的话,请!!!想法是可以的,但是ChangeCustomer如何知道要更改哪个记录?整个概念是不完整的…这是个坏主意。有两个原因:1)它可能适用于包含3个字段的记录,但30个字段如何?这将是一片混乱。2) 每个字段的值类型都不同。您的过程定义(在参数中)中的值的类型是什么?@flom您还必须处理值的类型问题。你的计划是什么?@Flom,SetPropValue
只对类有效,对记录无效。它使用RTTI来实现它的功能。您可以编写自己的变体,该变体也适用于记录,因为Delphi 2010+RTTI也是为记录生成的(您提到您使用的是TList
,所以您使用的是Delphi 2010+),第二种方法正是我要找的。”变量“用于值”和“SetPropValue”用于使用其名称更改属性值。非常感谢。讽刺的是,这个问题的措辞是关于从记录到磁盘的RTTI,OP真正想要的是一个数据集。第二种方法正是我想要的。”变量“用于值”和“SetPropValue”用于使用其名称更改属性值。非常感谢,讽刺