ftBytes in TBufDataset lazarus / 16-Databases ---------------------------------------------------------------------- ojz0r · 2024-06-26 12:59 I'm trying to use ftBytes as fieldtype in a BufDataset but it doesn't behave the way i expect it to do. When i set the Size attribute of the field to 1 i expect it to allocate 1 byte, so max value 255 (or $FF). However it seems that "Size" corresponds to number of digits, if i try to enter 123 it will only keep 1, if i set size to 2 it will keep 12, and if i set size to 3 it will keep 123. However that means that it will accept values up to 999. Is there something im doing wrong or is this a bug? I've tried to search for "ftBytes" and "ftByte" but i can't find anything relevant. ---------------------------------------------------------------------- Zvoni · 2024-06-26 13:53 https://www.freepascal.org/docs-html/fcl/db/tfieldtype.html The only thing coming close would be ftSmallInt, but that's signed ftBytes is an Array of Bytes Quote*snip* ftTime,  Time value ftDateTime, Date/Time (timestamp) value ftBytes,  Array of bytes value, fixed size (unytped) ftVarBytes, Array of bytes value, variable size (untyped) ftAutoInc, Auto-increment integer value (4 bytes) *snip* That said: Set the "size" to 0 ---------------------------------------------------------------------- ojz0r · 2024-06-26 18:22 Okay so no real byte type then. Smallint seems variable depending on CPU architecture. For 64-bit system a Smallint is 16-bit signed integer, so +/-32764. ---------------------------------------------------------------------- Richard Marriott · 2024-09-03 02:19 As already mentioned ftBytes represents an array of byte ( defined as TBytes), I manged to get it to work with this code:       FieldDefs.Add('XBYTES',ftBytes,1,false);  //1I byte in length Then to add/retreive data after CreateTable or CreateDataset do this      Setlength(tb,1);                                              // tb is type TBytes       tb[0] := b;                                                       // where b is a number of type byte (0..255)      FieldsByName('XBYTES').AsBytes := tb;     // Save the value to the buffer        tb2 := FieldsByName('XBYTES').AsBytes;  // Retrieve the value into tb2 which is type TBytes         b2 := tb2[0];                                                 // Same as original input   If you do this (as TDBGrid would do)     s := FieldsByName('XBYTES'].AsString;     // s is chr(b2)  ie the character equivalent Hope that helps. Else as already suggested use ftSmallInt (2 bytes) with external code to do range checking. I think that would be simpler. ftBytes is really best for binary arrays where you need to know exactly what is contained in each byte and process each byte separately. ---------------------------------------------------------------------- Richard Marriott · 2024-09-03 02:53 Just had a better idea that works and is simpler. Try this:       FieldDefs.Add('XBYTES',ftBytes,1,false);  //1 byte in length Then to add/retrieve data after CreateTable or CreateDataset do this      b1 := 123;                                                      // b1 is type byte. assign any valid number       FieldsByName('XBYTES').SetData(@b1);     // Save the value to the buffer       FieldsByName('XBYTES').GetData(@b2);  // Retrieve the value into b2 of type byte  result is 123