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

  • 使用字段ID、名称等创建TClientDataSet
  • 打开数据集,填充InsertRecord或Insert/Post
  • 使用Locate查找记录
  • 使用FieldByName('FieldName')。值来访问或更改数据
  • 或者您可以使用任何MemoryDataSet组件,并以相同的方式使用它

    第二种方法是将记录转换为类,将字段声明为已发布,并使用SetPropValue


    如果要传递任何值,可以使用Variant。但在分配之前,您必须检查类型

    我会使用TClientDataSet

  • 使用字段ID、名称等创建TClientDataSet
  • 打开数据集,填充InsertRecord或Insert/Post
  • 使用Locate查找记录
  • 使用FieldByName('FieldName')。值来访问或更改数据
  • 或者您可以使用任何MemoryDataSet组件,并以相同的方式使用它

    第二种方法是将记录转换为类,将字段声明为已发布,并使用SetPropValue



    如果要传递任何值,可以使用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”用于使用其名称更改属性值。非常感谢,讽刺