標題幾乎說明了一切。我正在使用TClientDataset存儲對象數組,其中一個對象的成員定義爲集合枚舉類型。據我瞭解,Delphi集是位字段,其大小可以從1到32個字節不等,取決於它們包含的數據量,Delphi不定義TSetField。我應該用什麼樣的字段來加載這個值?在數據集中存儲Delphi集合的最佳方式是什麼?
回答
你可以使用一個TBytesField或TBlobField
ClientDataSet1MySet:TBytesField,大小= 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;
這比我的好。和更清晰的...酷 – 2009-07-22 19:17:50
1)爲了使您的示例更清晰,我建議將「ClientDataSet1MySet.SetData(@Bytes [0])」更改爲「ClientDataSet1MySet.AsBytes:= Bytes」 2)// Read塊(在移動線上),我認爲你必須將「SizeOf(MySet)」更改爲「ClientDataSet1MySet.DataSize」以保持一致。 – rvheddeg 2013-12-04 16:55:33
你可以將它們轉換成字節,這樣的:
var
States : TUpdateStatusSet; // Can be any set, I took this one from DB.pas unit
SetAsAInteger: Integer;
dbs: Pointer; // Here's the trick
begin
States := [usModified, usInserted]; // Putting some content in that set
dbs := @States;
SetAsAInteger := PByte(dbs)^;
//Once you got it, SetAsAInteger is just another ordinary integer variable.
//Use it the way you like.
end;
歇着任何地方:
var
MSG: string;
Inserted, Modified: string;
States: TUpdateStatusSet;
MySet: Byte;
begin
while not ClientDataSet.Eof do
begin
//That's the part that interest us
//Convert that integer you stored in the database or whatever
//place to a Byte and, in the sequence, to your set type.
iSet := Byte(ClientDatasetMyIntegerField);// Sets are one byte, so they
// fit on a byte variable
States := TUpdateStatusSet(iSet);
//Conversion finished, below is just interface stuff
if usInserted in States then
Inserted := 'Yes';
if usModified in States then
Modified := 'Yes';
MSG := Format('Register Num: %d. Inserted: %s. Modified:%s',
[ClientDataSet.RecNo, Inserted, Alterted]);
ShowMessage(MSG);
ClientDataset.Next;
end;
end;
基於安德烈亞斯的例子,但做了一些簡單和清晰的恕我直言。
測試在XE2
你可以使用一個TBytesField或TBlobField
ClientDataSet1MySet:TBytesField,大小= 32
1)書寫
var
MySet: set of Byte;
Bytes: TBytes;
begin
MySet := [0];
// Write
Assert(ClientDataSet1Test.DataSize >= SizeOf(MySet), 'Data field is too small');
SetLength(Bytes, ClientDataSet1Test.DataSize);
Move(MySet, Bytes[0], SizeOf(MySet));
ClientDataSet1.Edit;
ClientDataSet1Test.AsBytes := Bytes;
ClientDataSet1.Post;
end;
2)閱讀
var
MyResultSet: set of Byte;
begin
Move(ClientDataSet1Test.AsBytes[0], MyResultSet, ClientDataSet1Test.DataSize);
end;
- 1. 爲(從)翻譯存儲集中數據的最佳方式是什麼?
- 2. 在Docker中存儲數據的最佳方式是什麼?
- 3. 存儲數據集的最佳方式(在一張表中)
- 4. Java:迭代集合的最佳方式是什麼?
- 5. 存儲此數據結構的最佳方式是什麼?
- 6. 存儲傳入流數據的最佳方式是什麼?
- 7. 什麼是存儲站點配置數據的最佳方式?
- 8. 存儲增量下載數據的最佳方式是什麼?
- 9. 什麼是存儲此類數據的最佳方式?
- 10. 什麼是存儲臨時數據的最佳方式?
- 11. 什麼是存儲這些數據的最佳方式?
- 12. 什麼是存儲思維導圖數據的最佳方式?
- 13. 存儲遊戲數據的最佳方式是什麼?
- 14. 什麼是存儲趨勢數據的最佳方式?
- 15. 在mysql數據庫中存儲html數據的最佳方式是什麼?
- 16. 在數據庫中存儲IP的最佳方法是什麼?
- 17. 什麼是使用Delphi的Web數據庫的最佳方式?
- 18. 在SQL Server中存儲大型數據集的最佳方法?
- 19. 在Elasticsearch中創建我的數據子集的最佳方式是什麼?
- 20. 什麼是在Opengl中旋轉多維數據集的最佳方式
- 21. 在QT中可視化大數據集的最佳方式是什麼
- 22. 在Delphi中將枚舉存儲在數據庫中的最佳方式是什麼?
- 23. 在Python中存儲快速變化的數據的最佳方式是什麼?
- 24. 在Firebase中存儲信息應用的數據的最佳方式是什麼?
- 25. 在mysql中存儲html代碼的最佳方式是什麼?
- 26. 在PHP中存儲類變量的最佳方式是什麼?
- 27. 在Memcached中存儲ActiveRecord對象的最佳方式是什麼?
- 28. 什麼是在博客中存儲帖子的最佳方式
- 29. 在Mongo中存儲/查詢`last_read`的最佳方式是什麼?
- 30. 什麼是在android中存儲圖像的最佳方式?
請參閱[如何保存/加載一組類型?](http://stackoverflow.com/q/9553510/757830)。 – NGLN 2015-12-25 20:27:34