?? “流”的利用--基本概念.htm
字號:
<HTML><HEAD><TITLE>談Delphi編程中“流”的利用</TITLE>
<META content=en-us http-equiv=Content-Language>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE>
BODY {BACKGROUND-COLOR: #ffffff; COLOR: #336633; FONT-SIZE: 12px; FONT-WEIGHT: normal; LINE-HEIGHT: 16px; link: #339966; vlink: #339966}
P {FONT-SIZE: 12px; FONT-WEIGHT: normal; LINE-HEIGHT: 150%}
BR {FONT-SIZE: 12px; FONT-WEIGHT: normal; LINE-HEIGHT: 150%}
SELECT {FONT-SIZE: 12px}
FORM {FONT-SIZE: 12px; MARGIN-BOTTOM: 0px}
TD {FONT-SIZE: 12px; LINE-HEIGHT: 150%}
B {FONT-WEIGHT: bold}
A:link {COLOR: #336633}
A:visited {COLOR: #336633}
A:hover {TEXT-DECORATION: underline}
.font12px {FONT-SIZE: 12px; LINE-HEIGHT: 16pt}
</STYLE>
</HEAD>
<BODY>
<DIV align=center>
<CENTER>
<TABLE bgColor=#c8ffc8 border=1 borderColor=#c8ccc8 height="80%" width="93%">
<TBODY>
<TR>
<TD bgColor=#d0ffd0 borderColor=#00ff00 height=16 vAlign=top
width=593><FONT color=#306830> 建議分辨率:800X600</FONT></TD></TR>
<TR>
<TD bgColor=#f0fff0 borderColor=#f0fff0 height=366 vAlign=top width=593>
<p align=center>談Delphi編程中“流”的利用--基本概念</p>
<p align=center>陳經韜</p>
什么是流?流,簡單來說就是建立在面向對象基礎上的一種抽象的處理數據的工具。在流中,定義了一些處理數據的基本操作,如讀取數據,寫入數據等,程序員是對流進行所有操作的,而不用關心流的另一頭數據的真正流向。流不但可以處理文件,還可以處理動態內存、網絡數據等多種數據形式。如果你對流的操作非常熟練,在程序中利用流的方便性,寫起程序會大大提高效率的。<BR>
下面,筆者通過四個實例:EXE文件加密器、電子賀卡、自制OICQ和網絡屏幕傳輸來說明Delphi編程中“流”的利用。這些例子中的一些技巧曾經是很多軟件的秘密而不公開的,現在大家可以無償的直接引用其中的代碼了。<BR>
“萬丈高樓平地起”,在分析實例之前,我們先來了解一下流的基本概念和函數,只有在理解了這些基本的東西后我們才能進行下一步。請務必認真領會這些基本方法。當然,如果你對它們已經很熟悉了,則可以跳過這一步。<BR><BR>一、Delphi中流的基本概念及函數聲明<BR>在Delphi中,所有流對象的基類為TStream類,其中定義了所有流的共同屬性和方法。<BR>TStream類中定義的屬性介紹如下:<BR>1、Size:此屬性以字節返回流中數據大小。<BR>2、Position:此屬性控制流中存取指針的位置。<BR>Tstream中定義的虛方法有四個:<BR>1、Read:此方法實現將數據從流中讀出。函數原形為:<BR>Function
Read(var
Buffer;Count:Longint):Longint;virtual;abstract;<BR>參數Buffer為數據讀出時放置的緩沖區,Count為需要讀出的數據的字節數,該方法返回值為實際讀出的字節數,它可以小于或等于Count中指定的值。<BR>2、Write:此方法實現將數據寫入流中。函數原形為:<BR>Function
Write(var
Buffer;Count:Longint):Longint;virtual;abstract;<BR>參數Buffer為將要寫入流中的數據的緩沖區,Count為數據的長度字節數,該方法返回值為實際寫入流中的字節數。<BR>3、Seek:此方法實現流中讀取指針的移動。函數原形為:<BR>Function
Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;<BR>參數Offset為偏移字節數,參數Origint指出Offset的實際意義,其可能的取值如下:<BR>soFromBeginning:Offset為移動后指針距離數據開始的位置。此時Offset必須大于或者等于零。<BR>soFromCurrent:Offset為移動后指針與當前指針的相對位置。<BR>soFromEnd:Offset為移動后指針距離數據結束的位置。此時Offset必須小于或者等于零。<BR>該方法返回值為移動后指針的位置。<BR>4、Setsize:此方法實現改變數據的大小。函數原形為:<BR>Function
Setsize(NewSize:Longint);virtual;<BR>另外,TStream類中還定義了幾個靜態方法:<BR>1、ReadBuffer:此方法的作用是從流中當前位置讀取數據。函數原形為:<BR>Procedure
ReadBuffer(var
Buffer;Count:Longint);<BR>參數的定義跟上面的Read相同。注意:當讀取的數據字節數與需要讀取的字節數不相同時,將產生EReadError異常。<BR>2、WriteBuffer:此方法的作用是在當前位置向流寫入數據。函數原形為:<BR>Procedure
WriteBuffer(var
Buffer;Count:Longint);<BR>參數的定義跟上面的Write相同。注意:當寫入的數據字節數與需要寫入的字節數不相同時,將產生EWriteError異常。<BR>3、CopyFrom:此方法的作用是從其它流中拷貝數據流。函數原形為:<BR>Function
CopyFrom(Source:TStream;Count:Longint):Longint;<BR>參數Source為提供數據的流,Count為拷貝的數據字節數。當Count大于0時,CopyFrom從Source參數的當前位置拷貝Count個字節的數據;當Count等于0時,CopyFrom設置Source參數的Position屬性為0,然后拷貝Source的所有數據;<BR>TStream還有其它派生類,其中最常用的是TFileStream類。使用TFileStream類來存取文件,首先要建立一個實例。聲明如下:<BR>constructor
Create(const
Filename:string;Mode:Word);<BR>Filename為文件名(包括路徑),參數Mode為打開文件的方式,它包括文件的打開模式和共享模式,其可能的取值和意義如下:<BR><BR>打開模式:<BR>fmCreate
:用指定的文件名建立文件,如果文件已經存在則打開它。<BR>fmOpenRead :以只讀方式打開指定文件<BR>fmOpenWrite
:以只寫方式打開指定文件<BR>fmOpenReadWrite:以寫寫方式打開指定文件<BR>共享模式:<BR>fmShareCompat
:共享模式與FCBs兼容<BR>fmShareExclusive:不允許別的程序以任何方式打開該文件<BR>fmShareDenyWrite:不允許別的程序以寫方式打開該文件<BR>fmShareDenyRead
:不允許別的程序以讀方式打開該文件<BR>fmShareDenyNone
:別的程序可以以任何方式打開該文件<BR><BR>TStream還有一個派生類TMemoryStream,實際應用中用的次數也非常頻繁。它叫內存流,就是說在內存中建立一個流對象。它的基本方法和函數跟上面是一樣的。<BR>好了,有了上面的基礎后,我們就可以開始我們的編程之行了。<BR>
-----------------------------------------------------------------------
</TD>
</TR>
<TR>
<TD bgColor=#d0ffd0 borderColor=#f0fff0 height=1 vAlign=top
width=593>
©CopyRight
2000</TD></TR></TBODY></TABLE></CENTER></DIV></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -