- 浏览: 60493 次
- 性别:
- 来自: 杭州
-
最新评论
在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。将d st与刚才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
MS: 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 size541 do
begin
pData^:=Char(not integer(pData^));
pData:=pData+1;
end;
Result:=pMem;
end;
3. 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;
一、 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。将d st与刚才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
MS: 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 size541 do
begin
pData^:=Char(not integer(pData^));
pData:=pData+1;
end;
Result:=pMem;
end;
3. 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;
发表评论
-
脚本是在
2009-03-11 19:00 1112大家交 ... -
DELPHI常见事件、常用方法、属性使用范围说明
2008-06-19 22:24 2857属性使用范围说明 Action 一些组件标识与组件相连接的 ... -
DELPHI常见属性说明
2008-06-19 21:37 1571DELPHI常见属性说明: ALI ... -
Delphi中的时间操作技术
2008-06-19 13:45 2726在编写应用程序时,我 ... -
delphi用于时间操作的函数 (2)
2008-06-19 13:44 1742TDateTime类型与字符串型转换函数: DateTime ... -
delphi用于时间操作的函数(1)
2008-06-19 13:43 1383用于时间操作的函数 Date函数: 定义:Date: TDa ... -
数据库表TreeView树的快速生成
2008-06-18 21:57 1983根据数据表的内容生成TreeView树状结构,通常的做法就是从 ... -
Delphi中根据分类数据生成树形结构的最优方法
2008-06-18 21:52 3459新一篇: Delphi程序设计之--惯用法 一、 引言: ... -
我的DBTreeView--TreeView直接连接数据表
2008-06-04 17:34 1090unit Unit1; interface uses ... -
Delphi下Treeview控件基于节点编号的访问
2008-06-04 17:31 1516有时我们需要保存和重建treeview控件,本文提供一种方法, ... -
Delphi中根据分类数据生成树形结构的最优方法
2008-06-04 17:27 1343很多系统都有类似于如下的表结构(table1): ID ... -
TreeView添加子节点和动态生成控件
2008-06-04 14:06 3953有这样一个TreeView,动态分有类A,B,C...(不一定 ... -
一种较简易的树型控件节点构造法
2008-06-03 21:42 1029把数据库中的数据在树型控件(TreeView)中正确显示是较为 ... -
Delphi中树型控件的使用技巧
2008-06-03 13:40 1434我们都知道,开发者 ... -
TREEVIEW右键菜单示例
2008-06-03 13:31 3636在 Form1 上拖一个 TreeView 控件,然后参考一下 ... -
TreeView的使用
2008-06-03 13:09 1347TreeView 是一个显示树型结构的控件,每一个节点都是一个 ... -
Delphi环境下灵活的数据库树表实现
2008-06-02 13:27 12851 数据结构设计 在 ...
相关推荐
Delphi 中的流式对象 ...在 Delphi 中使用流式对象可以提高应用程序的性能和可靠性,同时也可以简化数据的管理和存储。因此,流式对象是 Delphi 中的重要组成部分,是 Delphi 应用程序开发的基础技术之一。
在Delphi中,TStream类是所有数据流对象的基础,它可以表示任何类型的字节序列,如内存缓冲区、文件或网络连接。TStream提供了一套通用的方法,如Read、Write、Seek等,用于对数据进行读写和定位。 1. **INSERT操作...
在Delphi编程环境中,文件读写是常见的操作,主要用于存储和检索数据。本文将深入探讨如何使用Delphi进行文本文件的读写操作,包括基本概念、常用函数和类,以及实际应用示例。 首先,了解文件系统的基本概念是至关...
例如,可以使用TFileStream对实际文件进行读写操作,使用TMemoryStream在内存中进行数据的缓存处理,TBlobField则用于操作数据库中的BLOB字段。 6. 实际的程序实现:根据论文内容,作者在实践中创建了一个Access...
Delphi中的流数据处理主要通过TStream类来实现,它是一个抽象类,提供了一套标准的方法来读写数据,如Read、Write、Seek等。开发者可以通过继承TStream或使用其子类(如TMemoryStream、TFileStream等)来处理内存中...
在Delphi中,我们可以创建一个TMemoryStream对象,用于在内存中读写二进制数据。首先,我们需要将图片加载到TMemoryStream中,这可以通过Image组件的SaveToStream方法完成。然后,将TMemoryStream的数据写入数据库的...
在本篇文章中,我们将深入探讨如何使用Delphi的流技术来读写格式化记录文件,这涉及到对文件的操作,数据序列化,以及如何有效地管理内存中的数据。 首先,我们需要了解什么是流。在计算机科学中,流是数据的有序...
在Delphi编程环境中,处理数据流是常见的任务,特别是在数据传输、序列化和存储时。本篇文章将深入探讨如何在`MemoryStream`, `TList<String>` 和 `stringstream`(即`TStringStream`)之间进行转换,以实现不同数据...
在Delphi中,可以使用TFile和TStream类来读写文件,但这里我们将重点讨论通过TMemo组件的方法。TMemo是一个可视组件,通常用于显示和编辑多行文本。 - **写入文本文件:** 首先,创建一个TMemo组件并将你想要...
`TStream`是Delphi中用于读写数据流的基本类,这里用于将数据写入Excel文件。通过设置不同的字段值,可以控制数据在Excel中的位置和格式。 #### 3. **Excel文件结构理解** 组件代码中出现了多个数组,例如`CXlsBof...
在Delphi中进行文件读写是非常常见的需求之一,特别是在需要处理大量数据或者进行数据持久化的情况下。下面将详细介绍如何使用Delphi进行文件的读写操作。 #### 三、TFileStream类介绍 `TFileStream`是Delphi中用于...
总结,Delphi中的文件流提供了强大的文件操作能力,无论是在磁盘上读写文件,还是在内存中处理数据,都可通过TStream及其子类实现。掌握文件流的使用,能极大提升Delphi程序的数据处理效率和灵活性。在实际编程中,...
在Delphi编程环境中,流(Stream)是一种非常重要的概念,它允许程序员处理各种类型的数据,如...通过阅读《Delphi中流的操作与应用》这篇资料,你将能深入了解`TStream`的使用技巧,并在实际项目中发挥其强大功能。
在提供的压缩包`DCoroutine-master`中,可能包含了更多关于如何在Delphi项目中集成和使用协程的实际代码示例,这些示例可以帮助进一步理解和掌握协程的应用技巧。 总之,Delphi中的协程为开发者提供了一种强大而...
通过这四个实例,我们可以清晰地了解如何在Delphi中使用TMemoryStream和TFileStream进行数据的读写操作。TMemoryStream适用于内存中的数据操作,而TFileStream则适合于磁盘文件的读写。结合两者,我们可以灵活地在...
Delphi支持在TThread的Execute方法中使用try-except语句块来捕获和处理异常。 8. 线程的终止与清理:合理地终止线程并释放资源是多线程编程中的重要环节。应当避免使用TThread.Terminate方法强制终止线程,因为这...
TStream类是Delphi和C++Builder中的核心类,它提供了一种通用的方式来处理各种数据流,包括内存、文件、网络、资源等。TStream类是所有其他具体流类(如THandleStream、TFileStream、TMemoryStream、TResourceStream...
在Delphi中,TStream类是处理内存中的数据流的基础类,它可以用于读写文件、网络数据或者内存缓冲区等。在使用Stream进行文件上传时,确保Stream的Position属性设置为0至关重要,因为这将使流的读取操作从起始位置...
在Delphi编程环境中,"流与文件读写"是一个核心概念,它涉及到如何高效地处理数据,特别是将数据从内存传输到磁盘或从磁盘加载到内存。流(Stream)是Delphi中用于处理数据的一种抽象概念,它可以是文件、内存块、...
当你需要在Delphi应用程序中处理Word文档、Excel电子表格以及图片等非结构化数据时,通常会利用Blob(Binary Large Object)字段来存储这些对象。Blob字段设计用于存储大块二进制数据,如图像、音频文件或文档。下面...