शीर्षक यह सब कुछ कहता है। मैं ऑब्जेक्ट्स की एक सरणी को स्टोर करने के लिए एक TClientDataset का उपयोग कर रहा हूं, और ऑब्जेक्ट्स में से एक को के एक समेकित प्रकार के रूप में परिभाषित किया गया है। जैसा कि मैं इसे समझता हूं, डेल्फी सेट बिटफिल्ड हैं जिनके आकार में 1 से 32 बाइट्स भिन्न हो सकते हैं, इस पर निर्भर करता है कि उनके पास कितना डेटा है, और डेल्फी टीएसईटीफ़िल्ल्ड को परिभाषित नहीं करता है। इस मूल्य को लोड करने के लिए मुझे किस प्रकार का क्षेत्र उपयोग करना चाहिए?किसी डेटासेट में डेल्फी सेट को स्टोर करने का सबसे अच्छा तरीका क्या है?
उत्तर
आप एक 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;
यह मेरे से बेहतर है। और स्पष्ट ... कूल –
1) अपना नमूना भी स्पष्ट करने के लिए मैं "क्लाइंटडेटासेट 1 मैटसेट.एटडेटा (@ बाइट्स [0])" को "क्लाइंटडेटासेट 1 मैटसेट.एस्बाइट्स: = बाइट्स" 2 में बदलने का प्रस्ताव करता हूं) // पढ़ें ब्लॉक में (मूव लाइन पर), मुझे लगता है कि आपको "SizeOf (MySet)" को "ClientDataSet1MySet.DataSize" में लगातार होना चाहिए। – rvheddeg
आप उन्हें बाइट के लिए, इस तरह परिवर्तित कर सकते हैं:
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;
यह तब तक ठीक काम करता है जब तक कि आपको 32 बिट्स से अधिक की आवश्यकता न हो। सेट 256 बिट्स तक जाते हैं, और मैं ऐसी परिस्थिति में हूं जहां मुझे उस स्थान के अच्छे हिस्से की आवश्यकता हो सकती है। –
मैं इसे उस परिदृश्य में अनुकूलित करने की कोशिश करूंगा। –
एंड्रियास के उदाहरण के आधार पर, लेकिन कुछ सरल और स्पष्ट IMHO बनाया।
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. किसी छवि में आयत के सेट को मर्ज करने का सबसे अच्छा तरीका क्या है?
- 3. सॉर्ट ऑर्डर/प्राथमिकता को स्टोर करने का सबसे अच्छा तरीका?
- 4. उपयोगकर्ता अनुमतियों को स्टोर करने का सबसे अच्छा तरीका?
- 5. बैज मानदंडों को स्टोर करने का सबसे अच्छा तरीका?
- 6. MySQL: मैक पते को स्टोर करने का सबसे अच्छा तरीका?
- 7. डीबी में संदर्भित स्थिरांक स्टोर करने का सबसे अच्छा तरीका?
- 8. memcached में ActiveRecord ऑब्जेक्ट को स्टोर करने का सबसे अच्छा तरीका क्या है?
- 9. यूनिक्स टाइमस्टैम्प टाइमस्टैम्प स्टोर करने का सबसे अच्छा तरीका है?
- 10. डाटाबेस में एकाधिक ध्वज स्टोर करने का सबसे अच्छा तरीका
- 11. जन्मदिन को स्टोर करने का सबसे अच्छा क्षेत्र क्या है?
- 12. डीबी (पोस्टफिक्स) में मेल स्टोर करने का सबसे अच्छा तरीका
- 13. hbase में पदानुक्रमित डेटा स्टोर करने का सबसे अच्छा तरीका
- 14. रेल में, मॉडल में एकाधिक बूलियन विशेषताओं को स्टोर करने का सबसे अच्छा तरीका क्या है?
- 15. रेल में ऐप विशिष्ट कॉन्फ़िगरेशन को स्टोर करने का सबसे अच्छा तरीका क्या है?
- 16. डेल्फी में सी # के पृष्ठभूमिवर्कर को लागू करने का सबसे अच्छा तरीका क्या है?
- 17. डेटाबेस में उपयोगकर्ता ईमेल पते को स्टोर करने का सबसे अच्छा और सुरक्षित तरीका क्या है?
- 18. .NET DLL में कनेक्शन स्ट्रिंग को स्टोर करने का सबसे अच्छा तरीका क्या है?
- 19. प्लोन 3 में बड़ी फ़ाइलों को स्टोर करने का सबसे अच्छा तरीका क्या है?
- 20. डेटाबेस में अंतरराष्ट्रीय पते को स्टोर करने का "सबसे अच्छा" तरीका क्या है?
- 21. डेटाबेस में एकल गैर-दोहराने वाले डेटा को स्टोर करने का सबसे अच्छा तरीका क्या है?
- 22. सी # में, डेटासेट खाली होने पर परीक्षण करने का सबसे अच्छा तरीका क्या है?
- 23. पदानुक्रमित टैग स्टोर करने का सबसे अच्छा तरीका
- 24. तालिका को समर्पित करने का सबसे अच्छा तरीका क्या है?
- 25. SQL सर्वर तालिका में बड़ी मात्रा में टेक्स्ट स्टोर करने का सबसे अच्छा तरीका क्या है?
- 26. मार्कडाउन-दर्ज टेक्स्ट को स्टोर और प्रदर्शित करने का सबसे अच्छा तरीका क्या है?
- 27. वैश्विक चर स्टोर करने का सबसे अच्छा तरीका
- 28. "टाइमर" को लागू करने का सबसे अच्छा तरीका क्या है?
- 29. तारों को पार्स करने का सबसे अच्छा तरीका क्या है?
- 30. एनएसएमयूटेबलएरे को शफल करने का सबसे अच्छा तरीका क्या है?
यह भी देखें [प्रकारों को कैसे सेट/लोड करें?] (Http://stackoverflow.com/q/9553510/757830)। – NGLN