Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Запись и чтение чисел в BLOB-поле

01.01.2007

Мне нужно записать серию чисел в файл Paradox в blob-поле. Числа получаются из значений компонент, размещенных на форме. Затем мне нужно будет считывать числа из blob-поля и устанавливать согласно им значения компонент. Как мне сделать это?

Вы можете начать свое исследование со следующего модуля:

unit BlobFld;
 
interface
 
uses
 
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
 
Forms, Dialogs, StdCtrls, Buttons, DBTables, DB, ExtCtrls, DBCtrls,
 
Grids, DBGrids;
 
type
 
TFrmBlobFld = class(TForm)
   
BtnWrite: TBitBtn;
    Table1
: TTable;
    DataSource1
: TDataSource;
    DBNavigator1
: TDBNavigator;
   
LbxDisplayBlob: TListBox;
    Table1pubid
: TIntegerField;
    Table1comments
: TMemoField;
    Table1UpdateTime
: TTimeField;
    Table1Real1
: TFloatField;
    Table1Real2
: TFloatField;
    Table1Real3
: TFloatField;
    Table1Curr1
: TCurrencyField;
    Table1Blobs
: TBlobField;
    Table1Bytes
: TBytesField;
   
CbxRead: TCheckBox;
    procedure
BtnWriteClick(Sender: TObject);
    procedure DataSource1DataChange
(Sender: TObject; Field: TField);
    procedure
FormShow(Sender: TObject);
    procedure
FormClose(Sender: TObject; var Action: TCloseAction);
 
private
   
{ Private-Deklarationen }
 
public
   
{ Public-Deklarationen }
 
end;
 
var
 
FrmBlobFld: TFrmBlobFld;
 
implementation
 
{$R *.DFM}
 
type
 
ADouble = array[1..12] of double;
 
PADouble = ^ADouble;
 
procedure
TFrmBlobFld.BtnWriteClick(Sender: TObject);
var
  i
: integer;
  myBlob
: TBlobStream;
  v
: longint;
begin
  Table1
.Edit;
 
  myBlob
:= TBlobStream.Create(Table1Blobs, bmReadWrite);
 
try
    v
:= ComponentCount;
    myBlob
.Write(v, sizeof(longint));
 
   
for i := 0 to ComponentCount - 1 do
   
begin
      v
:= Components[i].ComponentIndex;
      myBlob
.Write(v, sizeof(longint));
   
end;
 
finally
    Table1
.Post;
    myBlob
.Free;
 
end;
end;
 
procedure
TFrmBlobFld.DataSource1DataChange(Sender: TObject; Field: TField);
var
  i
: integer;
  myBlob
: TBlobStream;
  t
: longint;
  v
: longint;
begin
 
if CbxRead.Checked then
 
begin
   
LbxDisplayBlob.Clear;
 
    myBlob
:= TBlobStream.Create(Table1Blobs, bmRead);
   
try
      myBlob
.Read(t, sizeof(longint));
     
LbxDisplayBlob.Items.Add(IntToStr(t));
 
     
for i := 0 to t - 1 do
     
begin
        myBlob
.Read(v, sizeof(longint));
       
LbxDisplayBlob.Items.Add(IntToStr(v));
     
end;
   
finally
      myBlob
.Free;
   
end;
 
end;
end;
 
procedure
TFrmBlobFld.FormShow(Sender: TObject);
begin
  Table1
.Open;
end;
 
procedure
TFrmBlobFld.FormClose(Sender: TObject;
 
var Action: TCloseAction);
begin
  Table1
.Close;
end;
 
end.

Взято с https://delphiworld.narod.ru


Как мне в таблице Paradox скопировать массив целочисленных чисел в TBlobField и наоборот? Элементы массива являются точками графика данных, который я хочу выводить, если запись доступна.

Запишите массив в поток памяти и затем используйте метод TBlob LoadFromStream. Для извлечения данных используйте метод TBlob SaveToStream (сохранение и извлечение массива из потока памяти).

Взято с https://delphiworld.narod.ru