📄 使用tstream读写数据.htm
字号:
</tr>
</table>
</center>
</div>
<div align="center">
<center>
<table width="100%" border="0" cellspacing="2" cellpadding="2">
<tr>
<td>
<div align="center"> <font class="text2"></font> <font class="text2"><span class="m14">
<input style="WIDTH: 120px" maxlength="4" size="4" name="SearchKey" width="30">
<a onclick="JavaScript:SearchForm.submit();" style="CURSOR: hand"
><IMG align=absMiddle height=23 src="images/findtext2.gif" width=24></a></span></font>
</div>
</td>
</tr>
</table>
</form>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td background="images/bg.gif" height="25">
<div align="center"><font class="text2"><span class="fontshadow"><b class="unnamed6"><font color="#ffffff" class="titil">=
合作伙伴 =</font></b></span></font></div>
</td>
</tr>
</table>
<table border="0" width="98%">
<tbody>
<tr>
<td>
<div align="center"></div>
</td>
</tr>
<tr>
<td> </td>
</tr>
</tbody>
</table>
</center></DIV></CENTER></DIV></TD>
<td vAlign="top" height="225">
<table border="0" cellpadding="0" cellspacing="0" width="540" align="center"><!-- fwtable fwsrc="templates/BG.png" fwbase="Untitled-6.gif" fwstyle="Dreamweaver" fwdocid = "742308039" fwnested="0" -->
<tr>
<td><IMG border=0 height=1 src="images/spacer.gif" width=6></td>
<td><IMG border=0 height=1 src="images/spacer.gif" width=194></td>
<td><IMG border=0 height=1 src="images/spacer.gif" width=340></td>
<td><IMG border=0 height=1 src="images/spacer.gif" width=1></td>
</tr>
<tr>
<td colspan="3"><IMG border=0 height=6 name=Untitled6_r1_c1 src="images/Untitled-6_r1_c1.gif" width=540></td>
<td><IMG border=0 height=6 src="images/spacer.gif" width=1></td>
</tr>
<tr>
<td colspan="3" rowspan="3" valign="top" background="images/Untitled-6_r3_c1.gif" align="middle">
<table height="50" cellspacing="0" cellpadding="0" width="95%" background="images/ENDBG.gif" border="0">
<tbody>
<tr align="middle">
<td height="70">
<p align="center">
<b><span class="unnamed6">在Dephi中使用TStream读写数据的技巧</span></b>
<br>
2001-8-21 17:28:21 编程爱好者
</p>
</td>
</tr>
</tbody>
</table>
<br>
<table width="95%" border="0" cellspacing="1" cellpadding="1">
<tr>
<td colspan="2"><span class="unnamed6"><br>在Dephi中提供了一个抽象的数据类型TStream来支持对流式数据的操作。这些数据通常来自文件、数据库、内存对象、OLE对象等,TStream提供了统一、简洁的方法来进行数据的读写。在通常情况下,我们并不需要直接使用TStream类,对流式数据的读写封装在VCL控件的方法中。但是如果这些方法无法满足我们的要求,就需要自己手动控制数据的读写。 <br><br>一、 TStream的常用的方法和属性:<br>1. function Read(var Buffer; Count: Longint): Longint; virtual; abstract <br><br>2. function Write(const Buffer; Count: Longint): Longint; virtual; abstract; <br><br>3. function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract; <br><br>4. property Position: Longint; <br><br>5. property Size: Longint <br><br>Read,Write,Seek都是纯虚函数,提供了数据读写和定位的抽象的方法。Read方法将数据从Stream中读到Buffer缓冲区中,Write则实现相反的操作,返回值表示实际读写数据的大小。Seek提供了在Stream中移动数据指针的方法。参数Origin可以取soFromBeginning,soFromCurrent,soFromEnd 三个值,Offset是偏移量,返回值是当前Stream数据指针的位置。 <br><br>Position表示了数据指针在Stream中的位置。这个属性是可读写的,它实际上就是通过调用Seek方法实现的,所以实际使用时使用这个属性更为方便一些。Size属性表示当前Stream的大小,对于不同的Stream,有些时候是只读的。 <br><br>二、 Stream数据的读写。<br>1. SaveToStream(Stream: TStream ); file://将类中的数据写到Stream的当前位置中 <br><br>2. LoadFromStream(Stream: TStream); file://从当前位置读入Stream里的数据 <br><br>实际使用时我们基本上只要使用上面两个函数就可以了。 <br><br>三、 例子<br>TStream的继承树图如图1所示(略),实际使用时比较常用的是TFileStream,TMemoryStream,TblobStream,就以这三种流举一例说明具体用法。 <br><br>创建一个窗体Form1,放置三个按钮btnRead,btnInvert,btnSave和一个文件打开对话框OpenDialog1以及数据控件DataSource1,Table1,test. <br><br>使用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,使得数据库一开始就处于打开状态。 <br><br>事件代码编写如下: <br><br>1. btnRead的Click事件,这里演示了TFileStream的用法。 <br><br>var<br> MS: TFileStream;<br>begin<br> if OpenDialog1.Execute then<br> begin<br>MS:=TFileStream.Create<br>(OpenDialog1.FileName, fmOpenRead);<br> Image1.Picture.Bitmap.LoadFromStream(MS);<br> MS.Free;<br> end;<br>end;<br>2. btnInvert的Click事件,这里演示了TMemoryStream的用法。其中使用了Invert函数,这是一个简单的将图象反色的函数(仅对真彩图象有效),它返回一个指向处理过的图象数据块的指针。 <br><br>var<br> M<br>S: TMemoryStream;<br> pImage: pointer; <br>begin<br> MS:=TMemoryStream.create;<br> Image1.Picture.Bitmap.SaveToStream(MS);<br> MS.Position:=0;<br> pImage:=Invert(MS.Memory, MS.size); <br>file://Memory属性是指向实际内存块的指针<br> MS.Write(pImage^,MS.size);<br> MS.Position:=0; <br>file://上一行代码使指针移到了Stream末尾,所以要复位<br> Image1.Picture.Bitmap.LoadFromStream(MS);<br> FreeMem(pImage); <br> MS.Free;<br>end;<br><br>Invert函数如下:<br>function TForm1.Invert<br>(pImage: pointer; size: Integer): pointer;<br>var<br> pData, pMem: PChar;<br> i: Integer;<br>begin<br> pMem:=AllocMem(size);<br> CopyMemory(pMem,pImage,size);<br> pData:=pMem+54;<br> for i:=0 to size-54-1 do<br> begin<br> pData^:=Char(not integer(pData^));<br> pData:=pData+1;<br> end;<br> Result:=pMem;<br>end;<br>1. btnSave的Click事件,这里演示了TMemoryStream的另一种用法,将Stream中的数据写到数据库中去。 <br><br>var<br> MS: TMemoryStream;<br>begin<br> MS:=TMemoryStream.create;<br> Image1.Picture.Bitmap.SaveToStream(MS);<br> MS.Position:=0;<br> Table1.Append; <br>file://在数据库中添加一条记录<br> TBlobField(Table1.FieldbyName<br>('image')).LoadFromStream(MS);<br> Table1.Post; <br>file://将所作的更新写入数据库<br>end;<br>4. DBNavigator1的Click事件,这里演示了TBlobStream的用法,使用了和写入时不同的方法来读出数据库的图象数据。 <br><br>var<br> MS: TStream;<br>begin<br> with Table1 do<br> MS:=CreateBlobStream<br>(FieldbyName('image'),bmRead);<br> Image1.Picture.Bitmap.<br>LoadFromStream(MS);<br> MS.Free;<br>end; <br><br></span></td>
</tr>
</table>
<table width="100%" border="0" cellspacing="10" cellpadding="5" align="center">
<tr>
<td background="images/ENDBG.gif">
<div align="center">
<table width="100%" border="0" cellspacing="5" cellpadding="5" bgcolor="#00ccff">
<tr>
<td>
<div align="center"><b class="titil"><font color="#003399">相关文章</font></b></div>
</td>
</tr>
</table>
<table width="100%" border="1" cellspacing="0" cellpadding="2" bordercolor="#00ccff" bordercolorlight="#ffffff">
</table>
<br>
如果您有什么疑问或看法请到 <A href="../F">精彩论坛</a> 发表意见 <br>
<br>
<a onclick="JavaScript:history.back();" style="CURSOR: hand" onMouseOut="MM_swapImgRestore()"
onMouseOver="MM_swapImage('Image71','','../images/back2.gif',1)"
><IMG alt=返回前一页 border=0 height=21 name=Image71 src="images/back1.gif" width=21></a>
<!-- <IMG alt=管理 border=0 height=21 name=Image51 onmouseout=MM_swapImgRestore() onmouseover="MM_swapImage('Image51','','../images/manage2.gif',1)" src="images/manage.gif" width=21> -->
<A href="#" onmouseout=MM_swapImgRestore() onmouseover="MM_swapImage('Image72','','../images/end2.gif',1)"><IMG alt=返回上面 border=0 height=21 name=Image72 src="images/end1.gif" width=21></a>
<br>
</div>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td><IMG border=0 height=5 src="images/spacer.gif" width=1></td>
</tr>
<tr>
<td><IMG border=0 height=75 src="images/spacer.gif" width=1></td>
</tr>
<tr>
<td colspan="3"><IMG border=0 height=18 name=Untitled6_r5_c1 src="images/Untitled-6_r5_c1.gif" width=540></td>
<td><IMG border=0 height=18 src="images/spacer.gif" width=1></td>
</tr>
</table>
</td></TR></TBODY>
</table>
<table cellSpacing="0" cellPadding="0" width="760" align="center" border="0">
<tr align="middle" bgColor="#007cb9">
<td height="43" bgcolor="#007cb9"><span class="fontshadow"><font color="#ffffff"><br>
版权信息</font><font color="#ffffff">|</font> <font color="#ffffff">隐私保护</font>
<font color="#ffffff">|</font> <font color="#ffffff">合作事项</font> <font color="#ffffff">|</font>
<font color="#ffffff">广告刊登</font> <font color="#ffffff">|</font> <font color="#ffffff">留言薄</font>
<font color="#ffffff">|</font> <font color="#ffffff">联系方式 |</font> <font color="#ffffff">加入收藏</font>
<FONT color=white>
<br><br>
筹建办地址:广州市先烈中路100号大院60号10楼<br>
电话:(020)87611593 传真:(020)87611575</FONT>
<br>
<font class="unnamed2" color="#ffffff" size="2">Copyright @ GDSoftPark All rights reserved</font>
<br>
<br>
</span>
</td>
</tr>
</table>
</body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -