国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在Dephi中使用TStream讀寫數據的技巧

2019-11-18 18:53:05
字體:
來源:轉載
供稿:網友

在Dephi中使用TStream讀寫數據的技巧 
  在Dephi中提供了一個抽象的數據類型TStream來支持對流式數據的操作。這些數據通常來自文件、數據庫、內存對象、OLE對象等,TStream提供了統一、簡潔的方法來進行數據的讀寫。在通常情況下,我們并不需要直接使用TStream類,對流式數據的讀寫封裝在VCL控件的方法中。但是如果這些方法無法滿足我們的要求,就需要自己手動控制數據的讀寫。

一、 TStream的常用的方法和屬性:
1. function Read(var Buffer; Count: Longint): Longint; virtual; abstract

2. function Write(const Buffer; Count: Longint): Longint; virtual; abstract;

3. function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract;

4. PRoperty Position: Longint;

5. property Size: Longint

Read,Write,Seek都是純虛函數,提供了數據讀寫和定位的抽象的方法。Read方法將數據從Stream中讀到Buffer緩沖區中,Write則實現相反的操作,返回值表示實際讀寫數據的大小。Seek提供了在Stream中移動數據指針的方法。參數Origin可以取soFromBeginning,soFromCurrent,soFromEnd 三個值,Offset是偏移量,返回值是當前Stream數據指針的位置。

Position表示了數據指針在Stream中的位置。這個屬性是可讀寫的,它實際上就是通過調用Seek方法實現的,所以實際使用時使用這個屬性更為方便一些。Size屬性表示當前Stream的大小,對于不同的Stream,有些時候是只讀的。

二、 Stream數據的讀寫。
1. SaveToStream(Stream: TStream ); file://將類中的數據寫到Stream的當前位置中

2. LoadFromStream(Stream: TStream); file://從當前位置讀入Stream里的數據

實際使用時我們基本上只要使用上面兩個函數就可以了。

三、 例子
TStream的繼承樹圖如圖1所示(略),實際使用時比較常用的是TFileStream,TMemoryStream,TblobStream,就以這三種流舉一例說明具體用法。

創建一個窗體Form1,放置三個按鈕btnRead,btnInvert,btnSave和一個文件打開對話框OpenDialog1以及數據控件DataSource1,Table1,test.

使用Dephi提供的Database Desktop創建一個表test,表里有一個字段域Image,數據庫文件名存為test.db。在窗體上放置一個TDatabase控件dbTest,一個TTable控件Table1,一個DataSource控件DataSource1,一個TDBNavigator控件DBNavigator1。將dbTest與剛才Desktop創建的數據庫相連,Table1的TableName屬性設為test.db,DataSource1的DataSet屬性設為Table1,DBNavigator1的DataSource屬性設為DataSource1,VisibleButtons屬性前四個設為TRUE。此外,將dbtest的Connected設為TRUE,Table1的Active屬性設為TRUE,使得數據庫一開始就處于打開狀態。

事件代碼編寫如下:

1. btnRead的Click事件,這里演示了TFileStream的用法。

var
 MS: TFileStream;
begin
 if OpenDialog1.Execute then
 begin
MS:=TFileStream.Create
(OpenDialog1.FileName, fmOpenRead);
  Image1.Picture.Bitmap.LoadFromStream(MS);
  MS.Free;
 end;
end;
2. btnInvert的Click事件,這里演示了TMemoryStream的用法。其中使用了Invert函數,這是一個簡單的將圖象反色的函數(僅對真彩圖象有效),它返回一個指向處理過的圖象數據塊的指針。

var
 M
S: TMemoryStream;
 pImage: pointer;
begin
 MS:=TMemoryStream.create;
 Image1.Picture.Bitmap.SaveToStream(MS);
 MS.Position:=0;
 pImage:=Invert(MS.Memory, MS.size);
file://Memory屬性是指向實際內存塊的指針
 MS.Write(pImage^,MS.size);
 MS.Position:=0;    
file://上一行代碼使指針移到了Stream末尾,所以要復位
 Image1.Picture.Bitmap.LoadFromStream(MS);
 FreeMem(pImage);
 MS.Free;
end;

Invert函數如下:
function TForm1.Invert
(pImage: pointer; size: Integer): pointer;
var
 pData, pMem: PChar;
 i: Integer;
begin
 pMem:=AllocMem(size);
 CopyMemory(pMem,pImage,size);
 pData:=pMem+54;
 for i:=0 to size-54-1 do
 begin
  pData^:=Char(not integer(pData^));
  pData:=pData+1;
 end;
 Result:=pMem;
end;
1. btnSave的Click事件,這里演示了TMemoryStream的另一種用法,將Stream中的數據寫到數據庫中去。

var
 MS: TMemoryStream;
begin
 MS:=TMemoryStream.create;
 Image1.Picture.Bitmap.SaveToStream(MS);
 MS.Position:=0;
 Table1.Append; 
file://在數據庫中添加一條記錄
 TBlobField(Table1.FieldbyName
('image')).LoadFromStream(MS);
 Table1.Post;    
file://將所作的更新寫入數據庫
end;
4. DBNavigator1的Click事件,這里演示了TBlobStream的用法,使用了和寫入時不同的方法來讀出數據庫的圖象數據。

var
 MS: TStream;
begin
 with Table1 do
 MS:=CreateBlobStream
(FieldbyName('image'),bmRead);
 Image1.Picture.Bitmap.
LoadFromStream(MS);
 MS.Free;
end;
現在你已經能夠在文件,數據庫,內存中任意讀寫數據流了。試試看吧!


上一篇:數據庫應用程序開發中圖像數據的存取技術

下一篇:我常去的幾個站點,希望對同志們有幫助

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 迁安市| 海安县| 宣武区| 华容县| 舞阳县| 卓资县| 都兰县| 乐清市| 高雄市| 武川县| 武隆县| 东安县| 平乐县| 汾西县| 福鼎市| 黎城县| 丰原市| 曲阜市| 惠州市| 丰台区| 久治县| 开封县| 乌鲁木齐县| 扎兰屯市| 岳普湖县| 濉溪县| 綦江县| 通渭县| 陇川县| 梨树县| 达拉特旗| 平利县| 贵阳市| 长春市| 连平县| 古交市| 图木舒克市| 临清市| 建德市| 仙游县| 无锡市|