`
ivfh
  • 浏览: 60493 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

在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 ); //将类中的数据写到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;
分享到:
评论

相关推荐

    Delphi中的流式对象

    Delphi 中的流式对象 ...在 Delphi 中使用流式对象可以提高应用程序的性能和可靠性,同时也可以简化数据的管理和存储。因此,流式对象是 Delphi 中的重要组成部分,是 Delphi 应用程序开发的基础技术之一。

    Delphi中数据流的操作及实例

    在Delphi中,TStream类是所有数据流对象的基础,它可以表示任何类型的字节序列,如内存缓冲区、文件或网络连接。TStream提供了一套通用的方法,如Read、Write、Seek等,用于对数据进行读写和定位。 1. **INSERT操作...

    delphi 文件读写

    在Delphi编程环境中,文件读写是常见的操作,主要用于存储和检索数据。本文将深入探讨如何使用Delphi进行文本文件的读写操作,包括基本概念、常用函数和类,以及实际应用示例。 首先,了解文件系统的基本概念是至关...

    Delphi环境下Access数据库中OLE对象的读写操作(论文)

    例如,可以使用TFileStream对实际文件进行读写操作,使用TMemoryStream在内存中进行数据的缓存处理,TBlobField则用于操作数据库中的BLOB字段。 6. 实际的程序实现:根据论文内容,作者在实践中创建了一个Access...

    Delphi 流数据的压缩与解压

    Delphi中的流数据处理主要通过TStream类来实现,它是一个抽象类,提供了一套标准的方法来读写数据,如Read、Write、Seek等。开发者可以通过继承TStream或使用其子类(如TMemoryStream、TFileStream等)来处理内存中...

    Delphi将图片以二进制方式存储在数据库BLOB字段中.rar

    在Delphi中,我们可以创建一个TMemoryStream对象,用于在内存中读写二进制数据。首先,我们需要将图片加载到TMemoryStream中,这可以通过Image组件的SaveToStream方法完成。然后,将TMemoryStream的数据写入数据库的...

    delphi 流读写格式化记录文件

    在本篇文章中,我们将深入探讨如何使用Delphi的流技术来读写格式化记录文件,这涉及到对文件的操作,数据序列化,以及如何有效地管理内存中的数据。 首先,我们需要了解什么是流。在计算机科学中,流是数据的有序...

    delphi流相互转换

    在Delphi编程环境中,处理数据流是常见的任务,特别是在数据传输、序列化和存储时。本篇文章将深入探讨如何在`MemoryStream`, `TList<String>` 和 `stringstream`(即`TStringStream`)之间进行转换,以实现不同数据...

    Delphi读写文本文件(通过Memo)和ini文件

    在Delphi中,可以使用TFile和TStream类来读写文件,但这里我们将重点讨论通过TMemo组件的方法。TMemo是一个可视组件,通常用于显示和编辑多行文本。 - **写入文本文件:** 首先,创建一个TMemo组件并将你想要...

    delphi 导出数据到EXCEL 方法大全

    `TStream`是Delphi中用于读写数据流的基本类,这里用于将数据写入Excel文件。通过设置不同的字段值,可以控制数据在Excel中的位置和格式。 #### 3. **Excel文件结构理解** 组件代码中出现了多个数组,例如`CXlsBof...

    delphi读写文件

    在Delphi中进行文件读写是非常常见的需求之一,特别是在需要处理大量数据或者进行数据持久化的情况下。下面将详细介绍如何使用Delphi进行文件的读写操作。 #### 三、TFileStream类介绍 `TFileStream`是Delphi中用于...

    Delphi中文件流的基础使用方法

    总结,Delphi中的文件流提供了强大的文件操作能力,无论是在磁盘上读写文件,还是在内存中处理数据,都可通过TStream及其子类实现。掌握文件流的使用,能极大提升Delphi程序的数据处理效率和灵活性。在实际编程中,...

    Delphi_Stream.rar_Stream XML DELphi_delphi 流操作

    在Delphi编程环境中,流(Stream)是一种非常重要的概念,它允许程序员处理各种类型的数据,如...通过阅读《Delphi中流的操作与应用》这篇资料,你将能深入了解`TStream`的使用技巧,并在实际项目中发挥其强大功能。

    Delphi中协程Coroutines的使用实例

    在提供的压缩包`DCoroutine-master`中,可能包含了更多关于如何在Delphi项目中集成和使用协程的实际代码示例,这些示例可以帮助进一步理解和掌握协程的应用技巧。 总之,Delphi中的协程为开发者提供了一种强大而...

    Delphi中文件流的基础使用方法四个实例

    通过这四个实例,我们可以清晰地了解如何在Delphi中使用TMemoryStream和TFileStream进行数据的读写操作。TMemoryStream适用于内存中的数据操作,而TFileStream则适合于磁盘文件的读写。结合两者,我们可以灵活地在...

    基于Delphi多线程技术的数据下载.pdf

    Delphi支持在TThread的Execute方法中使用try-except语句块来捕获和处理异常。 8. 线程的终止与清理:合理地终止线程并释放资源是多线程编程中的重要环节。应当避免使用TThread.Terminate方法强制终止线程,因为这...

    TStream类说明文档

    TStream类是Delphi和C++Builder中的核心类,它提供了一种通用的方式来处理各种数据流,包括内存、文件、网络、资源等。TStream类是所有其他具体流类(如THandleStream、TFileStream、TMemoryStream、TResourceStream...

    Delphi 三层RTC文件流上传程序演示.rar

    在Delphi中,TStream类是处理内存中的数据流的基础类,它可以用于读写文件、网络数据或者内存缓冲区等。在使用Stream进行文件上传时,确保Stream的Position属性设置为0至关重要,因为这将使流的读取操作从起始位置...

    流与文件读写

    在Delphi编程环境中,"流与文件读写"是一个核心概念,它涉及到如何高效地处理数据,特别是将数据从内存传输到磁盘或从磁盘加载到内存。流(Stream)是Delphi中用于处理数据的一种抽象概念,它可以是文件、内存块、...

    如何用DELPHI实现把WORD、EXCEL和图片等存储到数据库

    当你需要在Delphi应用程序中处理Word文档、Excel电子表格以及图片等非结构化数据时,通常会利用Blob(Binary Large Object)字段来存储这些对象。Blob字段设计用于存储大块二进制数据,如图像、音频文件或文档。下面...

Global site tag (gtag.js) - Google Analytics