在数据集中存储Delphi集合的最佳方式是什么? [英] What's the best way to store a Delphi set in a dataset?

查看:246
本文介绍了在数据集中存储Delphi集合的最佳方式是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

标题几乎说明了一切。我正在使用TClientDataset存储一个对象数组,其中一个对象有一个成员被定义为枚举类型的集合。据我所知,Delphi集是位域,它的大小可以从1到32个字节不等,取决于它们包含多少数据,Delphi没有定义一个TSetField。我应该使用什么类型的字段来加载这个值?

解决方案

您可以使用TBytesField或TBlobField



ClientDataSet1MySet:TBytesField,Size = 32

  var 
MySet:set的字节
字节:字节数组;
begin
MySet:= [1,2,4,8,16];

//写
Assert(ClientDataSet1MySet.DataSize> = SizeOf(MySet),'数据字段太小');

SetLength(Bytes,ClientDataSet1MySet.DataSize);
Move(MySet,Bytes [0],SizeOf(MySet));
ClientDataSet1.Edit;
ClientDataSet1MySet.SetData(@Bytes [0]);
ClientDataSet1.Post;

//读取
SetLength(Bytes,ClientDataSet1MySet.DataSize);
如果ClientDataSet1MySet.GetData(@Bytes [0])then
Move(Bytes [0],MySet,SizeOf(MySet))
else
MySet:= []; // NULL
end;


The title pretty much says it all. I'm using a TClientDataset to store an array of objects, and one of the objects has a member defined as a set of an enumerated type. As I understand it, Delphi sets are bitfields whose size can vary from 1 to 32 bytes depending on how much data they contain, and Delphi doesn't define a TSetField. What sort of field should I use to load this value into?

解决方案

You could use a TBytesField or a TBlobField

ClientDataSet1MySet: TBytesField, Size=32

var
  MySet: set of Byte;
  Bytes: array of Byte;
begin
  MySet := [1, 2, 4, 8, 16];

  // Write
  Assert(ClientDataSet1MySet.DataSize >= SizeOf(MySet), 'Data field is too small');

  SetLength(Bytes, ClientDataSet1MySet.DataSize);
  Move(MySet, Bytes[0], SizeOf(MySet));
  ClientDataSet1.Edit;
  ClientDataSet1MySet.SetData(@Bytes[0]);
  ClientDataSet1.Post;

  // Read
  SetLength(Bytes, ClientDataSet1MySet.DataSize);
  if ClientDataSet1MySet.GetData(@Bytes[0]) then
    Move(Bytes[0], MySet, SizeOf(MySet))
  else
    MySet := []; // NULL
end;

这篇关于在数据集中存储Delphi集合的最佳方式是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆