【问题标题】:Delphi: One procedure to change all the fields of a record?Delphi:更改记录的所有字段的一种程序?
【发布时间】:2011-05-13 06:52:25
【问题描述】:

我有这样的记录:

Tcustomer=record
  Name: string;
  IDNumber: Integer;
  IsMarried: boolean;
end;

我有一个TCustomers_Manager 类,用于存储所有客户的列表。是否可以有这样的程序:

Procedure ChangeCustomer(CustomerIndex: integer; field: string; value);

设置该特定字段的值。例如:

ChangeCustomer(1, 'Name','John');

我该如何实现?

更新:澄清一下,我的问题基本上分为两部分:

1) 如何将字段名称(字符串)映射到记录中的实际字段?

2) 是否可以传递具有不同类型的值?或者我应该传递一个单一的类型并对其进行类型转换(比如传递一个字符串然后使用strtoint()

【问题讨论】:

  • 是的,您可以在最新版本的 Delphi 中使用运行时类型信息执行此操作。但是,放弃静态类型系统并不总是一个好主意。您确定需要这样做吗?
  • 你指的是哪个“特定领域”?您必须确定您的客户。你使用 IDNumber 吗?这个 IDNumber 是唯一的吗? ChangeCustomer 必须知道要更改哪个客户。您还需要一个“AddCustomer”。 “客户名单”是什么意思? TList 还是数组?我会使用一个小型数据库(可能在内存中)来完成您的任务。
  • @Andreas:请...这只是我有问题的代码的一部分,而不是整个项目!我的班上有一个 TList 。我将在 ChangeCustomer 中传递客户索引。我显然有 AddCustomer() 程序。不,这太简单了,无法使用数据库。

标签: delphi record procedure


【解决方案1】:

我会使用 TClientDataSet。

  1. 使用字段 ID、名称等创建 TClientDataSet。
  2. 打开数据集,用 InsertRecord 或 Insert/Post 填充
  3. 使用定位查找记录
  4. 使用 FieldByName('FieldName').Value 访问或更改数据

或者您可以使用任何 MemoryDataSet 组件并以相同的方式使用它。

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

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

【讨论】:

  • 第二种方式正是我想要的。 'Variant' 用于值,'SetPropValue' 用于使用它们的名称更改属性值。非常感谢。
  • 具有讽刺意味的是,这个问题的措辞是关于从记录到磁盘的 RTTI,而 OP 真正想要的是数据集。
【解决方案2】:

例如,您可以这样做(假设 lst: TList<TCustomer> 如您在评论中所说):

Procedure ChangeCustomer(index: integer; i: byte; value: variant)
begin
    case (i) of
        0: lst[index].Name := value;
        1: lst[index].IDNumber := value;
        2: lst[index].IsMarried := value;
    end;
end;

您可以使用类型(或枚举)代替i: byte。 我很久不使用Delphi了,所以把我的例子当成一个idea,不像一个Delphi应用程序!!

【讨论】:

  • 为什么要投反对票?发表评论解释,以便我理解和纠正,如有需要,请!!!
  • 思路还可以,但是ChangeCustomer怎么知道要更改哪条记录呢?整个概念是不完整的......
  • 这是个坏主意。有两个原因:1)它可能适用于具有 3 个字段的记录,但是 30 个字段呢?这将是一团糟。 2) 每个字段的值类型不同。您的过程定义(在参数中)中值的类型是什么?
  • @flom 你也必须处理值类型的问题。你的计划是什么?
  • @Flom, SetPropValue 仅适用于课程,不适用于记录。它使用 RTTI 完成它的工作。您可以编写自己的变体也适用于记录,因为 Delphi 2010+ RTTI 也为记录生成(您提到您使用的是 TList<>,所以您使用的是 Delphi 2010+)
猜你喜欢
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多