<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    沒話說了

    所學甚淺,所知甚少
    隨筆 - 15, 文章 - 2, 評論 - 15, 引用 - 0
    數據加載中……

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

    From: http://xuguohua.diy.myrice.com/skill/34.htm 
        在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 ); //將類中的數據寫到Stream的當前位置中

    ---- 2. LoadFromStream(Stream: TStream); //從當前位置讀入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); 
     //Memory屬性是指向實際內存塊的指針
      MS.Write(pImage^,MS.size);
      MS.Position:=0;         
     //上一行代碼使指針移到了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;   
     //在數據庫中添加一條記錄
      TBlobField(Table1.FieldbyName
    ('image')).LoadFromStream(MS);
      Table1.Post;	      
    //將所作的更新寫入數據庫
    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;
    
    ---- 現在你已經能夠在文件,數據庫,內存中任意讀寫數據流了。試試看吧!

    posted on 2005-07-15 20:41 howard 閱讀(457) 評論(0)  編輯  收藏 所屬分類: Delphi


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产一精品一AV一免费| 毛片免费观看的视频在线| 亚洲精品午夜视频| 天天看免费高清影视| 国产黄色片免费看| 亚洲一卡2卡4卡5卡6卡残暴在线| 爽爽日本在线视频免费| 中文字幕a∨在线乱码免费看| 亚洲国产成人91精品| 国产综合精品久久亚洲| 91网站免费观看| 国产精品hd免费观看| 亚洲AV成人无码天堂| 国产午夜亚洲不卡| 噼里啪啦电影在线观看免费高清| 国产精品免费在线播放| 亚洲综合色一区二区三区| 亚洲国产AV无码专区亚洲AV| 精品免费国产一区二区三区| 久久午夜夜伦鲁鲁片无码免费| 亚洲国产精品网站在线播放| 亚洲AV无码久久精品狠狠爱浪潮 | 99精品视频免费观看| 亚洲av无码专区在线观看下载| 亚洲国产另类久久久精品| 国产在线不卡免费播放| 精品女同一区二区三区免费站| 成av免费大片黄在线观看| 久久亚洲AV成人无码国产电影| 亚洲视频欧洲视频| 亚洲综合av永久无码精品一区二区| 精品免费国产一区二区三区| 免费观看美女用震蛋喷水的视频| a级男女仿爱免费视频| 免费中文字幕视频| 亚洲变态另类一区二区三区| 亚洲国产精品yw在线观看| 亚洲国产精品人久久| 亚洲男人的天堂www| 永久亚洲成a人片777777| 免费又黄又爽又猛的毛片|