亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi流操作技巧總結

2019-11-18 18:47:52
字體:
來源:轉載
供稿:網友

TMemoryStream的繼承關系如下
     TObject
       |
     TStream
       |
     TCustomMemoryStream
       |
     TMemoryStream

  如何使用TMemoryStream?
      其實TmemoryStream使用就跟TStream 一樣
     具體的屬性,方法可看幫助。
    下舉一例:
      如我想在內存中直接讀寫一個Bitmap,怎么辦?
      TmemoryStream幫了你大忙
     
     var
       BitmapMemoryStream:TMemoryStream;
       Bitmap1:TBitmap;

     PRocedure TForm.Button1Click(Sender:TObject);
      begin
         BitmapmemroyStream:=TmemoryStream.Create; file://建立MemoryStream
         Bitmap1:=TBitmap.Create;
        try
          Bitmap1.LoadFromFile('d:Bitmap1.bmp');
        except
          ShowMessage('Error On LoadFile bitmap1.bmp');
        end;
      end;   
   
    procedure TForm.Button2Click(Sneder:Tobject);
     begin
      if Assigned(Bitmap1) then
          Bitmap1.SaveToStream(BitmapmemoryStream);
     end;
  
   procedure  TForm.Button3Click(Sender:TObject);
     begin
       if BitmapMemoryStream<>nil then
        begin
         try
           BitmapMemroyStream.SaveToFile('Bitmap1.str');  file://內存流保存,大小與
                                                          file://Bitmap1.bmp一樣
         except
           showmessage('error on access memory!');
         end;
        end;
     end;
 
  procedure TForm.Button4Click(Sender:TObject);
     var
       Buffer:Array[0..53] of char;
     begin
      if Assigned( BitmapMemroyStream) then
        try
           BitmapMemroyStream.Seek(0,soFromBeginning);
           BitmapMemoryStream.Read(Buffer,54);
          if Buffer[0]='B' and Buffer[1]='M' then  file://改寫內存內容
            begin
              BitmapMemoryStream.Seek(0,soFromBeginning);
              BitmapmemoryStream.Write('ICE',3); 
              Button3Click(Sender);//將改寫的內容寫入文件
            end;
        except
           ShowMessage('error On Access memroyStream');
        end;
     end;

  大家可看到用TMemoryStream對與內存讀寫多么方便,當然其實用不著先建一Bitmap
   可以用LoadFromFile直接引導文件,但是如果對于其它的內存流卻是可以用上述方法
   上文只是拋轉引玉,其它的一些功能大家可以看幫助,自己琢磨!
   還有很多其它的流式對象,大致都差不多,一通百通!

如何將一個流的內容寫入到剪貼板中,并處理

這個技巧是參考Delphi的剪貼板類的實現來完成的。將一個流的內容放入剪貼板,
首先要注冊你自已的格式,使用RegisterClipboardFormat()函數
然后做下面三步:
    1.創建一個內容流,并將內容寫進去
    2.創建一個全局的內容區,并將流的內容寫入
    3.調用ClipBoard.SetAsHandle()將內容寫入剪貼板


將內容寫入剪貼板中
var
  hbuf    : THandle;
  bufptr  : Pointer;
  mstream : TMemoryStream;
begin
  mstream := TMemoryStream.Create;
  try
    {-- 處理流的代碼 --}
    hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);
    try
      bufptr := GlobalLock(hbuf);
      try
        Move(mstream.Memory^, bufptr^, mstream.size);
        Clipboard.SetAsHandle(CF_MYFORMAT, hbuf);
      finally
        GlobalUnlock(hbuf);
      end;
    except
      GlobalFree(hbuf);
      raise;
    end;
  finally
    mstream.Free;
  end;
end;
請注意不要將分配的全局緩沖區釋放,這個工作由剪貼板來完成,在讀出數據中
你應該將它復制后處理。

將剪貼板內容讀出來
var
  hbuf    : THandle;
  bufptr  : Pointer;
  mstream : TMemoryStream;
begin
  hbuf := Clipboard.GetAsHandle(CF_MYFORMAT);
  if hbuf <> 0 then begin
    bufptr := GlobalLock(hbuf);
    if bufptr <> nil then begin
      try
        mstream := TMemoryStream.Create;
        try
          mstream.WriteBuffer(bufptr^, GlobalSize(hbuf));
          mstream.Position := 0;
          {-- 處理流的代碼 --}
        finally
          mstream.Free;
        end;
      finally
        GlobalUnlock(hbuf);
      end;
    end;
  end;
end;

 

在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;

       全文完,感謝你閱讀了這篇文章。本人缺乏可用分了,只好來掙點參與分好兌換。如感覺此文對你有幫助的朋友請投我一票,謝謝。


上一篇:Delphi常見圖象格式轉換技術

下一篇:用Delphi編寫點對點傳文件程序

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

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲美女精品久久久| www.欧美三级电影.com| 97香蕉超级碰碰久久免费软件| 91欧美精品成人综合在线观看| 欧美激情久久久| 91精品视频在线看| 久久精品青青大伊人av| 欧美激情精品久久久久久| 久久香蕉精品香蕉| 91久久久久久久久久| 久久久噜噜噜久久中文字免| 国产精品黄色av| 成人信息集中地欧美| 欧美性极品少妇精品网站| 黄色精品在线看| 日韩精品在线影院| 欧美一区第一页| 久久九九国产精品怡红院| 九九热r在线视频精品| 亚洲a在线观看| 欧美亚洲第一区| 中文字幕精品网| 久久久久中文字幕2018| 91精品91久久久久久| 日韩久久免费视频| 亚洲欧美在线播放| 亚洲色图综合久久| 色噜噜国产精品视频一区二区| 欧美精品18videos性欧美| 国产精品偷伦视频免费观看国产| 亚洲第一级黄色片| 欧美国产精品人人做人人爱| 91成人精品网站| 国内成人精品视频| 色综合伊人色综合网站| 久久精品一本久久99精品| 91麻豆国产语对白在线观看| 精品国产拍在线观看| 黑人巨大精品欧美一区二区| 91亚洲一区精品| 久久久久久久久久久久av| 国产一区二区成人| 久久视频中文字幕| 国产精品久久久久久亚洲调教| 欧美成人午夜影院| 在线观看国产成人av片| 亚洲成人国产精品| 一区二区三区视频观看| 成人高h视频在线| 精品久久久久久| 亚洲在线免费观看| 国产精品美女主播在线观看纯欲| 自拍偷拍亚洲一区| 中文字幕日韩电影| 在线视频亚洲欧美| 午夜精品久久久久久久白皮肤| 韩国日本不卡在线| 国产精品电影一区| 国产欧美日韩精品丝袜高跟鞋| 亚洲国产精品久久91精品| 欧美二区在线播放| 亚洲视频777| 欧美性猛交xxxxx水多| 国产精品美女免费| 久久成人综合视频| 成人黄色片网站| 欧洲亚洲免费在线| 一本大道香蕉久在线播放29| 国产成人精品一区二区在线| 久久久久久国产精品三级玉女聊斋| 欧美精品在线观看91| 亚洲国产精品久久91精品| 久久精品国产免费观看| 51精品国产黑色丝袜高跟鞋| 久久久久久免费精品| 久久久www成人免费精品| 亚洲a级在线播放观看| 在线精品91av| 伊人久久久久久久久久久久久| 日韩欧美国产黄色| 亚洲人成毛片在线播放| 91精品视频播放| 亚洲欧洲中文天堂| 国产日韩在线精品av| 国产精品成人免费视频| 精品偷拍一区二区三区在线看| 中文字幕精品一区久久久久| 亚洲综合精品一区二区| 亚洲aⅴ日韩av电影在线观看| 日韩成人av在线| 日韩美女免费线视频| 久久国产加勒比精品无码| 91探花福利精品国产自产在线| 欧美激情综合色综合啪啪五月| 91精品国产777在线观看| 国产91在线播放精品91| 欧美中文字幕在线视频| 欧美日韩亚洲国产一区| 国产视频在线一区二区| 日韩有码片在线观看| 2019国产精品自在线拍国产不卡| 国产精品露脸自拍| 91av在线播放视频| 亚洲欧美日韩图片| 中文字幕精品www乱入免费视频| 国产精品亚洲片夜色在线| 国产一区二区激情| 欧美三级欧美成人高清www| 国内免费久久久久久久久久久| 国模视频一区二区| 欧美日韩另类视频| www国产精品com| 九九精品视频在线| 美日韩精品视频免费看| 欧美一区二三区| 5566成人精品视频免费| 成人av.网址在线网站| 成人免费视频a| 久久亚洲一区二区三区四区五区高| 欧美在线视频一区二区| 亚洲aⅴ男人的天堂在线观看| 久久免费精品日本久久中文字幕| 欧美日韩国产影院| 亚洲欧洲美洲在线综合| 中文字幕国产精品久久| 色综合老司机第九色激情| 欧美性色19p| 成人国产精品久久久久久亚洲| 亚洲欧美国产日韩中文字幕| 精品国产91乱高清在线观看| 庆余年2免费日韩剧观看大牛| 日韩av色在线| 国产精品欧美一区二区三区奶水| 日韩欧美在线第一页| 欧美日韩999| 狠狠色狠狠色综合日日小说| 亚洲伦理中文字幕| 欧美激情网站在线观看| 亚洲国产精品久久久| 国产精品青青在线观看爽香蕉| 日韩av一区在线| 国产精品av在线播放| 亚洲男人天堂古典| 成人观看高清在线观看免费| 国产一区视频在线播放| 国产精品v日韩精品| 亚洲精品电影在线观看| 韩曰欧美视频免费观看| 91精品国产精品| 91免费视频网站| 国产精品成人免费电影| 国产精品网红直播| 北条麻妃一区二区在线观看| 精品网站999www| 国产亚洲人成a一在线v站| 国产+成+人+亚洲欧洲| 欧美剧在线观看| 欧美大尺度在线观看| 国产精品白丝jk喷水视频一区| 亚洲欧美国产精品| 97色在线视频观看| 久热国产精品视频| 亚洲精品黄网在线观看| 欧美亚洲一区在线|