Delphi TStream 详细介绍

合集下载

Delphi多线程介绍,以及线程类TThread分析

Delphi多线程介绍,以及线程类TThread分析

Delphi 多线程介绍,以及线程类TThread 分析Delphi 中有一个线程类TThread 用来实现多线程编程TThread 类的几个成员作一简单介绍,再说明一下Execute 的实现和Synchronize 的用法就完了。

然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充。

线程 本质上是进程中一段 并发 运行的代码。

一个进程至少有一个线程,即所谓的主线程。

同时还可以有多个子线程。

当一个进程中用到超过一个线程时,就是所谓的“多线程”。

1、CreateThread 、long _beginthread 、BeginThread 介绍 用Windows API 来创建线程,API 函数 CreateThread 的定义原型:1 2 3 4 5 6 7 8 HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程属性(用于在NT 下进行线程的安全属性设置,在9X 下无效) DWORD dwStackSize, //堆栈大小 LPTHREAD_START_ROUTINE lpStartAddress, //起始地址,即线程函数的入口,直至线程函数结束,线程结束 LPVOID lpParameter, //参数 DWORD dwCreationFlags, //创建标志(用于设置线程创建时的状态) LPDWORD lpThreadId //线程ID ); //最后返回线程HandleCreateThread 参数很多,而且在C Runtime Library 里提供了一个通用的线程函数(理论上可以在任何支持线程的OS 中使用):1 unsigned long _beginthread(void (_USERENTRY *__start)(void *), unsigned __stksize, void *__arg);Delphi 也提供了一个相同功能的类似函数:1 f unction BeginThread(2 3 4 5 6 7 8 SecurityAttributes: Pointer;StackSize: LongWord;ThreadFunc: TThreadFunc;Parameter: Pointer;CreationFlags: LongWord;var ThreadId: LongWord): Integer;这三个函数的功能是基本相同的,它们都是将线程函数中的代码放到一个独立的线程中执行。

Delphi流类 TMemoryStream(内存流) 入门

Delphi流类 TMemoryStream(内存流) 入门
begin
mStream := TMemoryStream.Create;
{TStream 是抽象类, 只能通过其子类实例化; 这里我们用了内存流来生成实例}
Memo1.Lines.Text := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
{给 Memo1 个初始值}
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
所谓"流", 就是一段数据或是一块内存;
在进行流操作时, 我们不必关心流中的数据到底是什么; 只需要知道流的大小和当前的指针位置. 所以流只有两个属性:
Size、Position.
对流的操作, 不过就是读取和写入. 所以流最主要的方法就是 Read 和 Write.
在很多控件的使用中, 读取主要用 LoadFromStream; 写入主要用 SaveToStream.
end;
end.
ShowMessage(IntToStr(mStream.Position)); {26, 当前流的指针}
end; ຫໍສະໝຸດ procedure TForm1.Button2Click(Sender: TObject);
begin
mStream.Position := 4; {调整流的当前指针位置}
举个例子: (建立新工程, 添加两个 Memo、两个 Button)

(Stream)和(Filer)的介绍(Delphi组件读写机制)

(Stream)和(Filer)的介绍(Delphi组件读写机制)

(Stream)和(Filer)的介绍(Delphi组件读写机制)一、流式对象(Stream)和读写对象(Filer)的介绍在面向对象程序设计中,对象式数据管理占有很重要的地位。

在Delphi中,对对象式数据管理的支持方式是其一大特色。

Delphi是一个面向对象的可视化设计与面向对象的语言相结合的集成开发环境。

Delphi的核心是组件。

组件是对象的一种。

Delphi应用程序完全是由组件来构造的,因此开发高性能的Delphi应用程序必然会涉及对象式数据管理技术。

对象式数据管理包括两方面的内容:● 用对象来管理数据● 对各类数据对象(包括对象和组件)的管理Delphi将对象式数据管理类归结为Stream对象(Stream)和Filer 对象(Filer),并将它们应用于可视组件类库(VCL)的方方面面。

它们提供了丰富的在内存、外存和Windows资源中管理对象的功能,Stream对象,又称流式对象,是TStream、THandleStream、TFileStream、TMemoryStream、TResourceStream和TBlobStream等的统称。

它们分别代表了在各种媒介上存储数据的能力,它们将各种数据类型(包括对象和组件) 在内存、外存和数据库字段中的管理操作抽象为对象方法,并且充分利用了面向对象技术的优点,应用程序可以相当容易地在各种Stream对象中拷贝数据。

读写对象(Filer)包括TFiler对象、TReader对象和TWriter对象。

TFiler对象是文件读写的基础对象,在应用程序中使用的主要是TReader和TWriter。

TReader和TWriter对象都直接从TFiler对象继承。

TFiler对象定义了Filer对象的基本属性和方法。

Filer对象主要完成两大功能:● 存取窗体文件和窗体文件中的组件●提供数据缓冲,加快数据读写操作为了对流式对象和读写对象有一个感性的认识,先来看一个例子。

Delphi中文件流的使用方法

Delphi中文件流的使用方法
2、WriteBuffer:此方法的作用是在当前位置向流写入数据。函数原形为:
Procedure WriteBuffer(var Buffer;Count:Longint);
参数的定义跟上面的Write相同。注意:当写入的数据字节数与需要写入的字节数不相同时,将产生EWriteError异常。
另外,TStream类中还定义了几个静态方法:
1、ReadBuffer:此方法的作用是从流中当前位置读取数据。函数原形为:
Procedure ReadBuffer(var Buffer;Count:Longint);
参数的定义跟上面的Read相同。注意:当读取的数据字节数与需要读取的字节数不相同时,将产生EReadError异常。
3、Seek:此方法实现流中读取指针的移动。函数原形为:
Function Seek(Offset:Longint;Origint:Word):Longint;virtual;abstract;
参数Offset为偏移字节数,参数Origint指出Offset的实际意义,其可能的取值如下:
soFromBeginning:Offset为移动后指针距离数据开始的位置。此时Offset必须大于或者等于零。
mestr:=edit1.text;
pstr:=Pchar(mestr);//把字符串转成字符指针
FS.Writebuffer(pstr^,Length(pstr));//把字符串写入流中
读流
流的读取比写入要困难一些,下面谈读流的几个注意点:
1.如果是字符串的读取,最好也使用字符指针Pchar
打开模式:
fmCreate :用指定的文件名建立文件,如果文件已经存在则打开它。

Delphi流类 TFileStream(文件流) 读写

Delphi流类 TFileStream(文件流) 读写
TCustomMemoryStream: 是 TMemoryStream 和 TResourceStream 的父类、TStream 的子类
与流相关的常用类还有: TReader、TWriter、TCompressionStream、TDecompressionStream
来一个文件流的例子:
getPath,setPath: string;
begin
getPath := 'c:\temp\get.jpg'; {需要这个文件存在}
setPath := 'c:\temp\set.jpg'; {这个会自动建立}
if not FileExists(getPath) then
begin
ShowMessage('找不到我们要测试的图片文件: ' + getPath);
Exit;
end;
getStream := TFileStream.Create(getPath, fmOpenRead or fmShareExclusive);
setStream := TFileStream.Create(setPath, fmCreate);
--------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
getStream,setStream: TFileStream; {声明一个文件流}
{CopyFrom 返回实际拷贝的字节数}
{这时硬盘上就有 set.jpg 文件, 与 get.jpg 一么一样}

DelphiTStringList的用法

DelphiTStringList的用法

DelphiTStringList的用法2011-07-06 18:21Delphi TStringList的用法TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。

TStringList 常用方法与属性:varList: TStringList;i: Integer;beginList := TStringList.Create;List.Add('Strings1'); {添加}List.Add('Strings2');List.Exchange(0,1); {置换}List.Insert(0,'Strings3'); {插入}i := List.IndexOf('Strings1'); {第一次出现的位置}List.Sort; {排序}List.Sorted := True; {指定排序}List.Count; {总数}List.Text; {文本集合}List.Delete(0); {删除, 0是第一个数据}List.LoadFromFile('c:\tmp.txt');{打开}List.SaveToFile('c:\tmp.txt'); {保存}List.Clear; {清空}List.Free; {释放}end;//读入字符串varList: TStringList;beginList := TStringList.Create;maText := 'aaa,bbb,ccc,ddd';//相当于: List.Text := 'aaa' + #13#10 + 'bbb' + #13#10' + 'ccc' + '#13#10' + 'ddd';ShowMessage(IntT oStr(List.Count)); //4ShowMessage(List[0]); //aaaList.Free;end;相当于//置换分隔符varList: TStringList;beginList := TStringList.Create;List.Delimiter := '|';List.DelimitedText := 'aaa|bbb|ccc|ddd';ShowMessage(IntT oStr(List.Count)); //4ShowMessage(List[0]); //aaaList.Free;end;//类似的哈希表操作法varList: TStringList;beginList := TStringList.Create;List.Add('aaa=111');List.Add('bbb=222');List.Add('ccc=333');List.Add('ddd=444');ShowMessage(s[1]); //bbb ShowMessage(List.ValueFromIndex[1]); //222 ShowMessage(List.Values['bbb']); //222//ValueFromIndex 可以赋值:List.ValueFromIndex[1] := '2'; ShowMessage(List[1]); //bbb=2//可以通过 Values 赋值:List.Values['bbb'] := '22';ShowMessage(List[1]); //bbb=22List.Free;end;//避免重复值varList: TStringList;beginList := TStringList.Create;List.Add('aaa');List.Sorted := True; //需要先指定排序List.Duplicates := dupIgnore; //如有重复值则放弃List.Add('aaa');ShowMessage(List.Text); //aaa//Duplicates 有3个可选值://dupIgnore: 放弃;//dupAccept: 结束;//dupError: 提示错误.List.Free;end;//排序与倒排序{排序函数}function DescCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;beginResult := -AnsiCompareText(List[Index1], List[Index2]);end;procedure TForm1.Button1Click(Sender: TObject);varList: TStringList;beginList := TStringList.Create;List.Add('bbb');List.Add('ccc');List.Add('aaa');//未排序ShowMessage(List.Text); //bbb ccc aaa//排序List.Sort;ShowMessage(List.Text); //aaa bbb ccc//倒排序List.CustomSort(DescCompareStrings); //调用排序函数ShowMessage(List.Text); //ccc bbb aaa//假如List.Sorted := True;List.Add('999');List.Add('000');List.Add('zzz');ShowMessage(List.Text); //000 999 aaa bbb ccc zzzend;现在来讨论它的一些高级的用法。

delphi tencoding 用法

delphi tencoding 用法

delphi tencoding 用法Delphi TEncoding 用法在Delphi 中,TEncoding 是一个类,用于表示字符编码。

它提供了一系列的方法和属性,用于处理不同的字符编码和字符集。

本文将逐步介绍和回答关于Delphi TEncoding 的用法。

第一步:了解TEncoding在编写Delphi 程序时,我们常常需要处理不同的字符编码,例如ASCII、UTF-8、UTF-16 等。

TEncoding 类提供了一种通用的方法,用于处理和转换不同的字符编码。

TEncoding 位于`System.SysUtils` 单元中,因此在使用之前,我们需要在代码中引入该单元。

第二步:创建TEncoding 对象要使用TEncoding,首先需要创建一个TEncoding 对象。

通常,我们可以根据需要选择TEncoding 对象的类型。

例如,如果我们需要将一个字符串写入到文本文件中,我们需要创建一个TStreamWriter 对象,该对象接受一个字符编码的参数。

我们可以使用TEncoding 类来创建所需的字符编码。

例如,创建一个使用UTF-8 编码的TStreamWriter 对象,可以使用以下代码:delphivarFileStream: TFileStream;StreamWriter: TStreamWriter;beginFileStream := TFileStream.Create('file.txt', fmCreate); StreamWriter := TStreamWriter.Create(FileStream, TEncoding.UTF8);其他处理StreamWriter.Free;FileStream.Free;end;第三步:使用TEncoding 转换字符编码TEncoding 类提供了一系列的方法,用于在不同的字符编码之间进行转换。

其中最常用的方法是GetString 和GetBytes。

delphi使用流实现jpg文件的处理(转)

delphi使用流实现jpg文件的处理(转)

一、原理介绍--流式数据的类型及其应用在Dephi中提供了TStream来支持对流式数据的操作。

TStream是万流之源。

但由于它是一个抽象类,故不能被直接使用;而要使用其相应的子类,如:TFileStream 、TStringStream、TMemoryStream、TBlobStream、TWinSocketStream和TOleStream。

TStream提供了统一、简洁的方法来进行数据的读写。

1.)SaveToStream(Stream: TStream ); 作用:将类中的数据写到Stream的当前位置中2.)LoadFromStream(Stream: TStream); 作用:从当前位置读入Stream里的数据实际使用时我们基本上只要使用上面两个函数就可以了。

二、所遇到的问题及相应的解决方法为了节省图像的存储空间和使用更加方便,决定采用JPEG这种图像格式。

(一)所遇到的问题第一、在Delphi 5中进行画图所用到的组件是TImage,所生成的图像的格式为BMP格式,而为了节省图像的存储空间,图像在数据库里存储的格式须为JPEG格式,这样就产生了图像格式转化的需求;而TImage本身并不直接提供这两种图像格式之间的转化。

第二、怎样将存储在Microsoft Access数据库中的图像取出并且显示出来:在Delphi 5 中,能提供这种功能的组件是TDBImage,但该组件却存在着一个很大的缺陷:它所能显示的图像类型只能是一些图标文件,元文件和BMP文件,而不能支持JPEG格式的图像在该组件中的显示;但根据实际需要,在Microsoft Access数据库中所存储的图像数据却是以JPEG格式保存的。

(二)相应的解决方法为了解决上述两个问题,可以采用目前数据库中一种名为大二分对象(BLOB--Binary Large Object),它是用来处理某些特殊格式的数据的。

BLOB在数据库的表中实际上是以二进制数据的形式存放的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Stream对象,又称流式对象,是TStream、THandleStream、TFileStream、TMemoryStream、TResourceStream和TBlobStream等的统称。

它们分别代表了在各种媒介上存储数据的能力,它们将各种数据类型(包括对象和部件)在内存、外存和数据库字段中的管理操作抽象为对象方法,并且充分利用了面向对象技术的优点,应用程序可以相当容易地在各种Stream对象中拷贝数据。

下面介绍各种对象的数据和方法及使用方法。

TStream对象TStream对象是能在各种媒介中存储二进制数据的对象的抽象对象。

从TStream 对象继承的对象用于在内存、Windows资源文件、磁盘文件和数据库字段等媒介中存储数据。

Stream中定义了两个属性:Size和Position。

它们分别以字节为单位表示的流的大小和当前指针位置。

TStream中定义的方法用于在各种流中读、写和相互拷贝二进制数据。

因为所有的Stream对象都是从TStream中继承来的,所以在TStream中定义的域和方法都能被Stream对象调用和访问。

此外,又由于面向对象技术的动态联编功能,TStream为各种流的应用提供了统一的接口,简化了流的使用;不同Stream对象是抽象了对不同存储媒介的数据上的操作,因此,TStream的需方法为在不同媒介间的数据拷贝提供了最简捷的手段。

TStream的属性和方法1. Position属性声明:property Position: Longint;Position属性指明流中读写的当前偏移量。

2. Size属性声明:property Size: Longint;Size属性指明了以字节为单位的流的的大小,它是只读的。

3. CopyFrom方法声明:function CopyFrom(Source: TStream; Count: Longint): Longint;CopyFrom从Source所指定的流中拷贝Count个字节到当前流中,并将指针从当前位置移动Count个字节数,函数返回值是实际拷贝的字节数。

4. Read方法声明:function Read(var Buffer; Count: Longint): Longint; virtual; abstract;Read方法从当前流中的当前位置起将Count个字节的内容复制到Buffer中,并把当前指针向后移动Count个字节数,函数返回值是实际读的字节数。

如果返回值小于Count,这意味着读操作在读满所需字节数前指针已经到达了流的尾部。

Read方法是抽象方法。

每个后继Stream对象都要根据自己特有的有关特定存储媒介的读操作覆盖该方法。

而且流的所有其它的读数据的方法(如:ReadBuffer,ReadComponent 等)在完成实际的读操作时都调用了Read方法。

面向对象的动态联编的优点就体现在这儿。

因为后继Stream对象只需覆盖Read方法,而其它读操作(如ReadBuffer、ReadComponent等)都不需要重新定义,而且TStream还提供了统一的接口。

5. ReadBuffer方法声明:procedure ReadBuffer(var Buffer; Count: Longint);ReadBuffer方法从流中将Count个字节复制到Buffer 中,并将流的当前指针向后移动Count个字节。

如读操作超过流的尾部,ReadBuffer方法引起EReadError异常事件。

6. ReadComponent方法声明:function ReadComponent(Instance: TComponent): TComponent; ReadComponent方法从当前流中读取由Instance所指定的部件,函数返回所读的部件。

ReadComponent在读Instance及其拥有的所有对象时创建了一个Reader对象并调用它的ReadRootComponent方法。

如果Instance为nil,ReadComponent的方法基于流中描述的部件类型信息创建部件,并返回新创建的部件。

7. ReadComponentRes方法声明:function ReadComponentRes(Instance: TComponent): TComponent; ReadComponentRes方法从流中读取Instance指定的部件,但是流的当前位置必须是由WriteComponentRes方法所写入的部件的位置。

ReadComponentRes首先调用ReadResHeader方法从流中读取资源头,然后调用ReadComponent方法读取Instance。

如果流的当前位置不包含一个资源头。

ReadResHeader将引发一个EInvalidImage 异常事件。

在Classes库单元中也包含一个名为ReadComponentRes的函数,该函数执行相同的操作,只不过它基于应用程序包含的资源建立自己的流。

8. ReadResHeader方法声明:procedure ReadResHeader;ReadResHeader方法从流的当前位置读取Windows资源文件头,并将流的当前位置指针移到该文件头的尾部。

如果流不包含一个有效的资源文件头,ReadResHeader将引发一个EInvalidImage异常事件。

流的ReadComponentRes方法在从资源文件中读取部件之前,会自动调用ReadResHeader方法,因此,通常程序员通常不需要自己调用它。

9. Seek方法声明:function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract;Seek方法将流的当前指针移动Offset个字节,字节移动的起点由Origin指定。

如果Offset 是负数,Seek方法将从所描述的起点往流的头部移动。

下表中列出了Origin的不同取值和它们的含义:函数Seek的参数的取值━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━常量值Seek的起点Offset的取值─────────────────────────────────SoFromBeginning 0 流的开头正数SoFromCurrent 1 流的当前位置正数或负数SoFromEnd 2 流的结尾负数━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━10. Write方法在Delphi对象式管理的对象中有两类对象的方法都有称为Write的:Stream对象和Filer 对象。

Stream对象的Write方法将数据写进流中。

Filer对象通过相关的流传递数据,在后文中会介绍这类方法。

Stream对象的Write方法声明如下:function Write(const Buffer; Count: Longint): Longint; virtual; abstract;Write方法将Buffer中的Count个字节写入流中,并将当前位置指针向流的尾部移动Count 个字节,函数返回写入的字节数。

TStream的Write方法是抽象的,每个继承的Stream对象都要通过覆盖该方法来提供向特定存储媒介(内存、磁盘文件等)写数据的特定方法。

流的其它所有写数据的方法(如WriteBuffer、WriteComponent)都调用Write担当实际的写操作。

11. WriteBuffer方法声明:procedure WriteBuffer(const Buffer; Count: Longint);WriteBuffer的功能与Write相似。

WriteBuffer方法调用Write来执行实际的写操作,如果流没能写所有字节,WriteBuffer会触发一个EWriteError异常事件。

12. WriteComponent方法在Stream对象和Filer对象都有被称为WriteComponent的方法。

Stream对象的WriteComponent方法将Instance所指定的部件和它所包含的所有部件都写入流中;Writer对象的WriteComponent将指定部件的属性值写入Writer对象的流中。

Stream对象的WriteComponent方法声明是这样的:procedure WriteComponent(Instance: Tcomponent);WriteComponent创建一个Writer对象,并调用Writer的WriteRootComponent方法将Instance及其拥有的对象写入流。

13. WriteComponentRes方法声明:WriteComponentRes(const ResName: String; Instance: TComponent);WriteComponentRes方法首先往流中写入标准Windows 资源文件头,然后将Instance 指定的部件写入流中。

要读由WriteComponentRes写入的部件,必须调用ReadComponentRes 方法。

WriteComponentRes使用ResName传入的字符串作为资源文件头的资源名,然后调用WriteComponent方法将Instance和它拥有的部件写入流。

14. WriteDescendant方法声明:procedure WriteDescendant(Instance Ancestor: TComponent);Stream对象的WriteDescendant方法创建一个Writer对象,然后调入该对象的WriteDescendant方法将Instance部件写入流中。

Instance可以是从Ancestor部件继承的窗体,也可以是在从祖先窗体中继承的窗体中相应于祖先窗体中Ancestor部件的部件。

15. WriteDescendantRes方法声明:procedure WriteDescendantRes(const ResName: String;Instance, Ancestor: TComponent);WriteDescendantRes方法将Windows资源文件头写入流,并使用ResName作用资源名,然后调用WriteDescendant方法,将Instance写入流。

TStream的实现原理TStream对象是Stream对象的基础类,这是Stream对象的基础。

为了能在不同媒介上的存储数据对象,后继的Stream对象主要是在Read和Write方法上做了改进,。

相关文档
最新文档