Delphi TStream 详细介绍
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(内存流) 入门
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中,对对象式数据管理的支持方式是其一大特色。
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中文件流的使用方法
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(文件流) 读写
与流相关的常用类还有: 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的用法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 的用法。
第一步:了解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文件的处理(转)
一、原理介绍--流式数据的类型及其应用在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在数据库的表中实际上是以二进制数据的形式存放的。
delphiTstrings类
delphiTstrings类根据下标存取列表中的字符串是最常见的一种操作,用法示意如下:StringList1.Strings[0] := '字符串1';注意在Delphi中,几乎所有的列表的下标都是以0为底的,也就是说Strings[0]是列表中的第一个字符串。
另外,由于Strings属性是字符串列表类的默认属性,因此可以省略Strings,直接用下面的简便方法存取字符串:StringList1[0] := '字符串1';定位一个列表中特定的字符串的位置,可以使用IndexOf方法,IndexOf方法将会返回在字符串列表中的第一个匹配的字符串的索引值,如果没有匹配的字符串则返回-1。
比如我们可以使用IndexOf方法来察看特定文件是否存在于文件列表框中,代码示意如下:if FileListBox1.Items.IndexOf('TargetFileName') > -1 ...有一点不方便的是TStrings类没有提供一个方法可以查找除了第一个匹配字符串外其他同样匹配的字符串的索引,只能是自己遍历字符串列表来实现,这点不如C++中的模版容器类以及相关的模版算法强大和方便。
下面是一个遍历字符串列表的示意,代码遍历列表框中的所有字符串,并将其全部转化为大写的字符串:procedure TForm1.Button1Click(Sender: TObject);var Index: Integer;beginfor Index := 0 to ListBox1.Items.Count - 1 doListBox1.Items[Index] := UpperCase(ListBox1.Items[Index]);end;前面我们看到了,要想向字符串列表中添加字符串,直接使用Add方法就可以了,但是Add方法只能将字符串加入到列表的末尾,要想在列表的指定位置添加字符串,需要使用Insert方法,下面代码在列表的索引为2的位置添加了字符串:StringList1.Insert(2, 'Three');如果要想将一个字符串列表中的所有字符串都添加到另一个字符串列表中,可以使用AddStrings方法,用法如下:StringList1.AddStrings(StringList2);要想克隆一个字符串列表的所有内容,可以使用Assign方法,例如下面的方法将Combox1中的字符串列表复制到了Memo1中:Memo1.Lines.Assign(ComboBox1.Items);要注意的是使用了Assign方法后,目标字符串列表中原有的字符串会全部丢失。
DelphiTClientDataSet的全面剖析转
DelphiTClientDataSet的全面剖析转Delphi TClientDataSet的全面剖析转1. 与TTable、TQuery一样,TClientDataSet也是从TDataSet 继承下来的,它通常用于多层体系结构的客户端。
很多数据库应用程序都用了BDE,BDE往往给发布带来很大的不便,因而TClientDataSet最大的特点是它不依赖于BDE(Borland Database Engine),但它需要一个动态链接库的支持,这个动态链接库叫DBCLIENT.DLL。
在客户端,也不需要用TDatabase构件,因为客户端并不直接连接数据库。
由于TClientDataSet是从TDataSet继承下来的,所以,它支持诸如编辑、搜索、浏览、纠错、过滤等功能。
由于TClientDataSet在内存中建立了数据的本地副本,上述操作的执行速度很快。
也正是由于TClientDataSet并不直接连接数据库,因此,客户程序必须提供获取数据的机制。
在Delphi 4中,TClientDataSet有三种途径获取数据:1、从文件中存取数据。
2、从本地的另一个数据集中获取数据。
3、通过IProvider接口从远程数据库服务器获取数据。
在一个客户程序中,可以同时运用上述三种机制获取数据。
和其他数据集构件一样,可以用标准的数据控件显示由TClientDataSet引入的数据集,当然,这需要借助于TDataSource构件。
由于TClientDataSet是从TDataSet继承下来的,所以,凡是其他数据集构件支持的功能,TClientDataSet构件也大致具备。
不同的是,TClientDataSet能够在内存中建立数据的副本,因此,TClientDataSet比其他数据集构件增加了一些特殊的功能。
在运行期,可以调用诸如First、GotoKey、Last、Next和Prior 等函数来浏览数据。
TClientDataSet也支持书签(BookMark)功能,可以用书签来标记某条记录,以后就可以方便地找到这条记录。
DelphiTStream详细介绍
DelphiTStream详细介绍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个字节数,函数返回值是实际拷贝的字节数。
delphi 二进制流转化成双字节
在Delphi 中,你可以使用TBytesStream 类来处理二进制流,并将其转化为双字节。
下面是一个简单的示例:```delphiuses..., System.SysUtils, System.Classes, Encoding;procedure ConvertBytesToDoubleByte(const Input: TBytes; var Result: Word);varEncoding: TEncoding;beginEncoding := TEncoding.GetEncoding(65001); // Use the appropriate code pageSetLength(Result, Length(Input) div 2);Encoding.GetBytes(Input[0], Result[0], Length(Input) div 2);end;```在这个示例中,我们首先导入必要的单元,然后定义一个名为`ConvertBytesToDoubleByte` 的过程,该过程接受一个字节数组`Input` 和一个`Word` 类型的变量`Result`。
在过程中,我们创建一个`TEncoding` 对象,指定代码页为65001(UTF-16),然后设置`Result` 的长度为`Input` 长度的一半。
最后,我们使用`GetBytes` 方法将`Input` 的前一半转换为`Result`。
请注意,这个示例假设`Input` 的长度是偶数,并且每一对连续的字节可以转换为一个双字节值。
如果`Input` 的长度是奇数,或者其内容不能被转换为双字节值,那么这个示例可能需要进行修改以适应你的具体需求。
Delphi TStrings 用法
Delphi TStrings用法对于TStrings类型变量,需要使用TStringList.Create;创建[luther.gliethttp],否则提示abstract error错误TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。
常规的用法大家都知道,现在来讨论它的一些高级的用法。
先把要讨论的几个属性列出来:1、CommaText2、Delimiter&DelimitedText3、Names&Values&ValueFromIndex先看第一个:CommaText。
怎么用呢?用代码说话:constconstr:String='aaa,bbb,ccc,ddd';varstrs:TStrings;i:Integer;beginstrs:=TStringList.Create;maText:=constr;for i:=0to Strs.Count-1doShowMessage(Strs[i]);end;执行了这段代码后,可以看到ShowMessage显示出来的分别是:aaa bbb ccc ddd。
也就是说,maText:=constr这一句的作用,就是把一个字符串以','为分割符,分段添加到TStrings中。
那么如果不是以','来分割,又该怎么做呢?现在看第二个例子。
使用Delimiter和DelimitedText。
constconstr:String='aaa\bbb\ccc\ddd';varstrs:TStrings;i:Integer;beginstrs:=TStringList.Create;strs.Delimiter:='\';strs.DelimitedText:=constr;for i:=0to Strs.Count-1doShowMessage(Strs[i]);end;可以看到,显示的效果和第一个例子是一模一样的。
delphi tstringstream用法
delphi tstringstream用法Delphi是一种编程语言,TStringStream是Delphi中的一个类,用于将字符串数据读取到流中,或将流中的数据写入字符串中。
它是TMemoryStream的一个派生类,因此它可以读取和写入二进制数据。
使用TStringStream可以方便地进行字符串操作,特别是在需要处理文本数据时非常有用。
下面是一些使用TStringStream的常见用法:1. 将字符串写入TStringStream:TStringStream有一个WriteString方法,可以将字符串写入到TStringStream中,如下所示:```varStream: TStringStream;Text: string;beginText := 'Hello, World!';Stream := TStringStream.Create;Stream.WriteString(Text);// 在此处对TStringStream对象进行操作Stream.Free;end;```2. 从TStringStream读取字符串:TStringStream具有ReadString方法,可以从其中读取字符串,如下所示:```varStream: TStringStream;Text: string;beginStream := TStringStream.Create('Hello, World!');Text := Stream.ReadString(Stream.Size);// 在此处对读取到的字符串进行操作Stream.Free;end;```3. 以二进制方式读取和写入数据:除了读写字符串,TStringStream还可以读写二进制数据。
例如,你可以使用Write和Read操作来处理二进制数据:```varStream: TStringStream;Data: array [0..9] of Byte;beginStream := TStringStream.Create;Stream.Write(Data, Sizeof(Data)); // 将二进制数据写入流Stream.Position := 0; // 将流位置设置为开头Stream.Read(Data, SizeOf(Data)); // 从流中读取二进制数据// 在此处对读取到的二进制数据进行操作Stream.Free;end;```通过使用TStringStream,你可以方便地在Delphi中处理字符串和二进制数据。
delphi-TMemoryStream对象用法
delphi TMemoryStream对象用法TMemoryStream对象TMemoryStream对象是一个管理动态内存中的数据的Stream对象,它是从TCustomMemoryStream中继承下来的,除了从 TCustomMemoryStream中继承的属性和方法外,它还增加和覆盖了一些用于从磁盘文件和其它注台读数据的方法。
它还提供了写入、消除内存内容的动态内存管理方法。
下面介绍它的这些属性和方法。
TMemoryStream的属性和方法1. Capacity属性声明:property Copacity: Longint;Capacity属性决定了分配给内存流的内存池的大小。
这与Size属性有些不同。
Size属性是描述流中数据的大小。
在程序中可以将Capacity的值设置的比数据所需最大内存大一些,这样可以避免频繁地重新分配。
2. Realloc方法声明:function Realloc(var NewCapacity: Longint): Pointer; virtual; Realloc方法,以8K为单位分配动态内存,内存的大小由NewCapacity指定,函数返回指向所分配内存的指针。
3. SetSize方法SetSize方法消除内存流中包含的数据,并将内存流中内存池的大小设为Size字节。
如果Size为零,是SetSize方法将释放已有的内存池,并将Memory 属性置为nil;否则,SetSize方法将内存池大小调整为Size。
4. Clear方法声明:procedure Clear;Clear方法释放内存中的内存池,并将Memory属性置为nil。
在调用Clear方法后,Size和Position属性都为0。
5. LoadFromStream方法声明:procedure LoadFromStream(Stream: TStream); LoadFromStream方法将Stream指定的流中的全部内容复制到MemoryStream中,复制过程将取代已有内容,使MemoryStream成为Stream的一份拷贝。
Delphi的应用
Delphi的应用Ini文件的应用(IniFiles)1、在Interface的Uses节引用单元文件IniFiles;2、在V ar变量定义部分增加一行: myinifile:Tinifile; 然后,就可以对变量myinifile进行创建、打开、读取、写入等操作了。
3、打开INI文件:myinifile:=Tinifile.create( 'program.ini ');上面这一行语句将会为变量myinifile与具体的文件program.ini建立联系,然后,就可以通过变量myinifile,来读写program.ini文件中的关键字的值了。
值得注意的是,如果括号中的文件名没有指明路径的话,那么这个Program.ini文件会存储在Windows目录中,把Program.ini文件存储在应用程序当前目录中的方法是:为其指定完整的路径及文件名。
下面的两条语句可以完成这个功能:Filename:=ExtractFilePath(Paramstr(0))+ 'program.ini ';myinifile:=Tinifile.Create(filename);4、读取关键字的值:针对INI文件支持的字符串、整型数值、布尔值三种数据类型,TINIfiles类提供了三种同的对象方法来读取INI文件中关键字的值。
假设已定义变量vs、vi、vb分别为string、integer、boolean类型。
vs:=myinifile.Readstring( '小节名', '关键字',缺省值);vi:=myinifile.Readinteger( '小节名', '关键字',缺省值);vb:=myinifile.Readbool( '小节名', '关键字',缺省值);其中缺省值为该INI文件不存在该关键字时返回的缺省值。
delphi文件的读取和写入
delphi文件的读取和写入概述:Delphi是一种高级编程语言,用于开发Windows应用程序。
在Delphi中,文件的读取和写入是常见的操作,可以通过使用内置的文件处理函数和过程来实现。
本文将详细介绍如何在Delphi中进行文件的读取和写入操作。
一、文件的读取在Delphi中,可以使用TFileStream类来读取文件的内容。
以下是读取文件的步骤:1. 创建TFileStream对象:使用TFileStream类的构造函数创建一个TFileStream对象。
构造函数需要两个参数,第一个参数是文件名,第二个参数是打开文件的模式。
模式可以是fmOpenRead(只读模式)或fmShareDenyNone(允许其他进程访问)。
2. 读取文件内容:调用TFileStream对象的Read方法来读取文件的内容。
Read方法需要两个参数,第一个参数是读取到的数据存放的缓冲区,第二个参数是要读取的字节数。
3. 关闭文件:使用TFileStream对象的Free方法来关闭文件。
示例代码如下:```delphivarFileStream: TFileStream;Buffer: array of Byte;ReadBytes: Integer;beginFileStream := TFileStream.Create('file.txt', fmOpenRead);SetLength(Buffer, FileStream.Size);ReadBytes := FileStream.Read(Buffer[0], FileStream.Size);FileStream.Free;// 处理读取到的文件内容// ...end;```二、文件的写入在Delphi中,可以使用TFileStream类来写入文件的内容。
以下是写入文件的步骤:1. 创建TFileStream对象:使用TFileStream类的构造函数创建一个TFileStream对象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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方法上做了改进,。