destructor TResourceStream.Destroy; begin UnlockResource(HGlobal); FreeResource(HResInfo); inherited Destroy; end;
回顧 Initialize 方法可知:
TResourceStream 不額外配置記憶體,直接使用 HGlobal 指向的記憶體區塊。Classes 單元提供 InternalReadComponentRes 函數,利用 TResourceStream 從 Delphi 應用程式讀取元件。Delphi 將表單與元件資訊存放於模組資源的 RCDATA 區段。
從 Delphi 資料庫開發平台角度看,TBlobStream 是極重要的物件,提供修改 TBlobField、TBytesField 或 TVarBytesField 資料的技術,讓開發者像操作檔案或串流一樣在資料庫欄位中讀寫資料。
傳統資料庫發展趨向多媒體資料庫,主流資料庫皆支援多媒體功能。多媒體資料結構不規則、量大,各大資料庫採用 BLOB 技術 解決儲存難題。TBlobStream 的意義在於:
使用 TBlobStream 可在 BLOB 欄位儲存任意程式定義的資料格式,不受限於圖像、語音或 OLE 伺服器支援的格式,且無需輔助工具。
Create:建立資料庫欄位與 BLOB 流的連結。Read/Write:存取與修改欄位內容。Seek:在欄位中定位。Truncate:刪除目前位置起的所有資料。TBlobStream 直接繼承 TStream,無新增屬性。覆寫 Read、Write、Seek 實作 BLOB 存取,新增 Truncate 實作刪除操作。
function Read(var Buffer; Count: Longint): Longint;
從資料庫欄位目前位置複製 Count 位元組到 Buffer(需預先配置至少 Count 位元組)。回傳實際傳輸位元組數,可能小於 Count,需檢查邊界。
function Write(const Buffer; Count: Longint): Longint; override;
從 Buffer 複製 Count 位元組到資料庫欄位目前位置(Buffer 需配置足夠記憶體)。回傳實際傳輸位元組數,亦需邊界檢查。
function Seek(Offset: Longint; Origin: Word): Longint;
重設 BLOB 流指標位置:
Origin = soFromBeginning (0):新位置 = Offset(≥ 0)。Origin = soFromCurrent (1):新位置 = Position + Offset。Origin = soFromEnd (2):新位置 = Size + Offset(≤ 0)。回傳新指標位置。
procedure Truncate;
刪除 TBlobField、TBytesField 或 TVarBytesField 中從目前位置起的所有資料。
constructor Create(Field: TBlobField; Mode: TBlobStreamMode);
以 Field 參數建立 BLOB 流與欄位連結。Mode 可為 bmRead、bmWrite、bmReadWrite。