TBlobStream 讓 Delphi 應用充分發揮多媒體資料庫管理能力,同時保留 Object Pascal 底層控制與擴展彈性。
以 TBlobField 建立 BLOB 串流,搭配 TWriter/TReader 實現超媒體卡片儲存與讀取:
{ 儲存 }
BlobStream := TBlobStream.Create(TBlobField(CardTable.Fields[10]), bmWrite);
with TWriter.Create(BlobStream, 4096) do
try
for I := 0 to DesignWin.ControlCount - 1 do
begin
WriteInteger(MMID[I]);
WriteRootComponent(DesignWin.Controls[I]);
end;
WriteListEnd;
finally Free; end;
BlobStream.Free; CardTable.Post;
{ 讀取 }
BlobStream := TBlobStream.Create(TBlobField(CardTable.Fields[10]), bmRead);
with TReader.Create(BlobStream, 4096) do
try
while not EndOfList do
case ReadInteger of
IDText: begin
Ctrl := TControl(ReadRootComponent(nil));
{ 重新連接 OnClick 事件 }
PropInfo := GetPropInfo(Ctrl.ClassInfo, 'OnClick');
Method.Code := Self.MethodAddress(MethodName);
Method.Data := Self;
if Method.Code <> nil then SetMethodProp(Ctrl, PropInfo, Method);
DesignWin.InsertControl(Ctrl);
end;
IDImage: ...;
end;
finally Free; end;
Fields[10] 為 BLOB 欄位,Post 回寫資料庫。讀取時需重新連接事件處理程序(SetMethodProp 或 TReader.OnFindMethod)。
TBlobField 提供 LoadFromBitmap/SaveToBitmap,內部使用 TBlobStream。兩種儲存格式:
SizeOf(TGraphicHeader)+1 開始,含標頭資訊procedure TBlobField.LoadFromBitmap(Bitmap: TBitmap);
var BlobStream: TBlobStream; Header: TGraphicHeader;
begin
BlobStream := TBlobStream.Create(Self, bmWrite);
try
if (DataType = ftGraphic) or (DataType = ftTypedBinary) then
begin
Header.Count := 1; Header.HType := $0100; Header.Size := 0;
BlobStream.Write(Header, SizeOf(Header));
Bitmap.SaveToStream(BlobStream);
Header.Size := BlobStream.Position - SizeOf(Header);
BlobStream.Position := 0;
BlobStream.Write(Header, SizeOf(Header));
end else Bitmap.SaveToStream(BlobStream);
finally BlobStream.Free; end;
end;
LoadFromStrings/SaveToStrings 實現 TBlobField 與 TStrings 自由轉換,核心同樣委派給 TBlobStream:
procedure TBlobField.LoadFromStrings(Strings: TStrings);
var BlobStream: TBlobStream;
begin
BlobStream := TBlobStream.Create(Self, bmWrite);
try Strings.SaveToStream(BlobStream); finally BlobStream.Free; end;
end;