TStream 是 VCL 統一抽象的串流基類,封裝了檔案、記憶體、資料庫 Blob、OLE 物件等各種資料來源的讀寫與定位操作。掌握 TStream 及其常用子類(TFileStream、TMemoryStream、TBlobStream),即可在檔案系統、記憶體、資料庫間自由搬移二進位資料(圖片、文件、序列化物件),是進階 Delphi 開發必備技能。
| 成員 | 說明 |
|---|---|
Read(var Buffer; Count): Longint | 從串流讀 Count 位元組到 Buffer,回傳實際讀取位元組數 |
Write(const Buffer; Count): Longint | 從 Buffer 寫 Count 位元組到串流,回傳實際寫入位元組數 |
Seek(Offset, Origin): Longint | 移動指標:Origin = soFromBeginning/soFromCurrent/soFromEnd |
Position | 目前指標位置(可讀寫,內部呼叫 Seek) |
Size | 串流總大小(部分串流唯讀) |
SaveToStream(Stream) / LoadFromStream(Stream) | VCL 物件(Bitmap、StringList 等)通用的序列化/反序列化方法 |
// 讀檔案到 Image1
var FS: TFileStream;
begin
if OpenDialog1.Execute then begin
FS := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
try
Image1.Picture.Bitmap.LoadFromStream(FS);
finally
FS.Free;
end;
end;
end;
var MS: TMemoryStream; P: Pointer;
begin
MS := TMemoryStream.Create;
try
Image1.Picture.Bitmap.SaveToStream(MS); // 存入記憶體
MS.Position := 0;
P := Invert(MS.Memory, MS.Size); // 自定義像素處理函數
MS.Write(P^, MS.Size); // 寫回串流
MS.Position := 0;
Image1.Picture.Bitmap.LoadFromStream(MS); // 顯示結果
FreeMem(P);
finally
MS.Free;
end;
end;
// 存入資料庫
var MS: TMemoryStream;
begin
MS := TMemoryStream.Create;
try
Image1.Picture.Bitmap.SaveToStream(MS);
MS.Position := 0;
Table1.Append;
TBlobField(Table1.FieldByName('Image')).LoadFromStream(MS);
Table1.Post;
finally
MS.Free;
end;
end;
// 從資料庫讀出
var BS: TStream;
begin
BS := Table1.CreateBlobStream(Table1.FieldByName('Image'), bmRead);
try
Image1.Picture.Bitmap.LoadFromStream(BS);
finally
BS.Free;
end;
end;
try...finally Free 模式防止洩漏。掌握 TStream 體系,你就擁有了在任何二進位資料源之間「任意門」般的搬運能力。