El título casi lo dice todo. Estoy usando un TClientDataset para almacenar una matriz de objetos, y uno de los objetos tiene un miembro definido como conjunto de un tipo enumerado. Tal como lo entiendo, los conjuntos de Delphi son bitfields cuyo tamaño puede variar de 1 a 32 bytes, según la cantidad de datos que contengan, y Delphi no define un TSetField. ¿Qué tipo de campo debo usar para cargar este valor?¿Cuál es la mejor manera de almacenar un conjunto de Delphi en un conjunto de datos?
Respuesta
Se puede usar un TBytesField o una TBlobField
ClientDataSet1MySet: TBytesField, Tamaño = 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;
Es mejor que el mío. Y más claro ... Cool –
1) Para que su muestra sea aún más clara, propongo cambiar "ClientDataSet1MySet.SetData (@Bytes [0])" en "ClientDataSet1MySet.AsBytes: = Bytes" 2) En el bloque // Read (en la línea Mover), creo que debe cambiar "SizeOf (MySet)" a "ClientDataSet1MySet.DataSize" para que sea coherente. – rvheddeg
Puede convertirlos en bytes, de esta manera:
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;
Para recuperarse de en cualquier lugar:
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;
Eso funciona bien hasta que necesite más de 32 bits. Los conjuntos alcanzan hasta 256 bits, y estoy en una situación en la que podría necesitar una buena fracción de ese espacio. –
Intentaré adaptar esto a ese escenario. –
Basado en el ejemplo de Andreas, pero en mi humilde opinión es algo más simple y claro.
probado en XE2
Se puede usar un TBytesField o una TBlobField
ClientDataSet1MySet: TBytesField, Tamaño = 32
1) Escritura
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) Leyendo
var
MyResultSet: set of Byte;
begin
Move(ClientDataSet1Test.AsBytes[0], MyResultSet, ClientDataSet1Test.DataSize);
end;
- 1. ¿Cuál es la mejor manera de extraer un valor único de un conjunto de groovy?
- 2. ¿Cuál es la mejor manera de almacenar datos de tendencia?
- 3. ¿Cuál es la mejor manera de combinar un conjunto de rectángulos en una imagen?
- 4. En C#, ¿cuál es la mejor forma de comprobar si un conjunto de datos está vacío?
- 5. ¿Cuál es la mejor manera de almacenar un valor monetario en la base de datos?
- 6. Delphi: utilizando TClientDataset como un conjunto de datos en memoria
- 7. La mejor manera de comprobar si un archivo DLL es un conjunto CLR en C#
- 8. ¿Cómo llene un conjunto de Delphi?
- 9. Cuál es la mejor manera de almacenar datos XML en un archivo de Excel
- 10. Cuál es la mejor manera de verificar el conjunto de resultados IQueryable es nulo
- 11. Char Array vs String: que es mejor para almacenar un conjunto de letras
- 12. Valores promedio de un conjunto de datos de punto a un conjunto de datos de cuadrícula
- 13. ¿Cuál es la mejor manera de probar un procedimiento almacenado?
- 14. Mejor manera de almacenar datos en caché
- 15. ¿Cuál es la mejor manera de almacenar información de zona horaria en mi base de datos?
- 16. Persistencia del objeto Delphi, ¿cuál es la mejor manera?
- 17. ¿Cuál es la mejor manera de almacenar un valor de URL usando MySQL?
- 18. ¿Cuál es la mejor manera de almacenar datos como 'Favoritos' en una aplicación de Android?
- 19. Delphi + conjunto de montaje acceso
- 20. ¿La mejor manera de almacenar datos de longitud variable en un R data.frame?
- 21. ¿Cuál es la mejor manera de almacenar cadena de conexión en DLL de .NET?
- 22. ¿Cuál es la mejor manera de almacenar una contraseña o clave privada en un host web?
- 23. ¿Cuál es la mejor manera de almacenar archivos multimedia en una base de datos?
- 24. ¿Cuál es la mejor manera de almacenar un objeto ActiveRecord en memcached?
- 25. ¿Cuál es la mejor manera de almacenar datos de área para una aventura de texto?
- 26. Convierta de manera eficiente un conjunto de datos SAS en un archivo CSV
- 27. ¿Cuál es la mejor manera de almacenar/recuperar datos para un escritorio sin usar una base de datos?
- 28. Git + un gran conjunto de datos?
- 29. ¿Cuál es una buena manera de encontrar espacios en un conjunto de fechas?
- 30. ¿Cuál es una manera eficiente y elegante de agregar un solo elemento a un conjunto inmutable?
Véase también [¿Cómo guardar/cargar un conjunto de tipos?] (Http://stackoverflow.com/q/9553510/757830). – NGLN