Delphi:一个程序可以更改记录的所有字段?

发布于 2024-11-07 07:22:59 字数 543 浏览 5 评论 0原文

我有这样的记录:

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()

I have a record like this:

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

And I have a TCustomers_Manager class that stores a list of all the customers. Is it possible to have a procedure like this:

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

That sets the value for that specific field. For example:

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

How can I implement this?

Update: To clarify, my question is basically in 2 parts:

1) How can I map the field name (in string) to the actual field in record?

2) Is it possible to pass a value that has different types? Or should I pass a single type and type cast it (like passing a string and then using strtoint())

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

零時差 2024-11-14 07:22:59

我会使用 TClientDataSet。

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

或者您可以采用任何 MemoryDataSet 组件并将其用于同样的方式。

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

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

I would use TClientDataSet.

  1. Create TClientDataSet with fields ID, Name, etc.
  2. Open Dataset, Fill with InsertRecord or Insert/Post
  3. Find Record with Locate
  4. Use FieldByName('FieldName').Value to access to or change data

Or you can take any MemoryDataSet component and use it in same way.

Second way is to convert record to class, declare Fields as published and use SetPropValue.

If you want to pass any Value you can use Variant. But you have to check types before assign.

卷耳 2024-11-14 07:22:59

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

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,所以将我的示例作为一个想法,而不是像 Delphi 应用程序!

You could, for example, do this (assuming lst: TList<TCustomer> as you said in a comment):

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;

You could use a type (or enum) in place of i: byte.
I dont't use Delphi from long time, so take my example as an idea, not like a Delphi app!!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文