关于超想
本站导航
邮件列表
  首页 | 本站产品 | Delphi资料 | 免费资源 | 程序人生 | 软件工程 | 网站设计 | 推荐网站
你所在的位置 -> 主页 -> 超想软件 -> 编程资料 -> delphi -> 开发技巧 -> 系统开发 ->详细
相关内容  
 
 
在Delphi程序中应用IE浏览器控件
 
【新品推荐】

  详细内容
 

如何对数据流 INSERT、APPEND
作者: 评价: 上站日期: 2001-09-04
内容说明:
来源:

  对于无确定格式的数据流,我们一般是在引到 Stream 上后,再加以字、节、段落为单位的文本操作,象拷贝、删除、查找、替换、筛选、排序等等。我们用 LoadFromFile和 LoadFromStream 进行加载工作时,会覆盖原本的数据,如果不是第一次初始化的话。因此,有必要对多段数据流的整合操作做一些有利的约束。如增加 INSERT(插入)、 APPEND(追加)之类的方法。从TStream 的定义及其派生子类我们得知,CopyFrom 是唯一可以加以利用的公用函数,它从指定的流上拷贝指定数量的字节后返回一长整型值,该值代表最后成功传送的实际字节数。其后,我们用 Seek 函数来避免数据流之间的相互覆盖,并以此来界定后来者加入的位置。在 SEEK 函数的定义中,第一个参数为偏移量,第二个参数是个定位标识 
其定义如下: 
soFromBeginning 表示在流的顶头开始位移,第一个参数必须 > = 0. 
soFromCurrent 表示从当前位置开始位移。 
soFromEnd 表示从流的最后开始位移,第一个参数必须 < = 0. 
SEEK 操作成功后,由 Position 属性存放流当前的位置值。Size 属性是该流到目前 
为止的长度。 
具体操作见以下范例: 

unit DemoUnit; 
... 

type 
TForm1 = class(TForm) 
... 
Memo1: TMemo; 
procedure FormCreate(Sender: TObject); 
procedure Button1Click(Sender: TObject); 
procedure FormDestroy(Sender: TObject); 
procedure Button2Click(Sender: TObject); 
procedure Button3Click(Sender: TObject); 
private 
{ Private declarations } 
// 建立一个演示内存流 
STO : TMemoryStream; 
public 
{ Public declarations } 
end; 

var 
Form1: TForm1; 

implementation 

{$R *.DFM} 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
... 
Try 
//创建内存流的对象 
STO := TMemoryStream.Create; 
Finally 
... 
end; 
... 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
... 
//初始化内存流对象,并移动指针到头部 
STO.LoadFromFile( OpenDialog1.FileName ); 
STO.Seek( 0, soFromBeginning ); 
//把调入的东西显示出来 
Memo1.Lines.LoadFromStream( STO ); 
... 
end; 

//以下的工作必须在内存流初始化后方能进行 
//插入演示 
procedure TForm1.Button2Click(Sender: TObject); 
Var 
SWA : TMemoryStream; //定义一个临时内存流 
begin 
... 

//创建临时工作的对象 
SWA := TMemoryStream.Create; 
//加载要插入的目标 
SWA.LoadFromFile( OpenDialog1.FileName ); 
//移动演示流的指针到头部,准备交换 
STO.Seek( 0, soFromBeginning ); 
//移动临时流的指针到尾部,接收演示流 
SWA.Seek( 0, soFromEnd ); 
SWA.CopyFrom( STO, STO.Size ); 
//把演示流换成新的内容 
STO.LoadFromStream( SWA ); 
STO.Seek( 0, soFromBeginning ); 
//把插入后的内容显示出来 
Memo1.Lines.LoadFromStream( STO ); 
... 
end; 

//追加演示 
procedure TForm1.Button3Click(Sender: TObject); 
Var 
SWA : TMemoryStream;//定义一个临时内存流 
begin 
... 
//创建临时工作的对象并加载要追加的目标 
SWA := TMemoryStream.Create; 
SWA.LoadFromFile( OpenDialog1.FileName ); 
//移动演示流的指针到尾部,接收临时流 
STO.Seek( 0, soFromEnd ); 
SWA.Seek( 0, soFromBeginning ); 
//拷贝,移动指针后显示 
STO.CopyFrom( SWA, SWA.Size ); 
STO.Seek( 0, soFromBeginning ); 
Memo1.Lines.LoadFromStream( STO ); 
... 
end; 

.... 
在 Insert 过程当中,仅仅只是把新来的流加到最前面,而没有考虑在任何位置的插入问题,如果要对任何条件都满足的话,就要考虑一个复杂的前提:流的分解。由于篇幅有限,本文不再叙述,有兴趣的朋友可试一试。 

 
你所在的位置 -> 主页 -> 超想软件 -> 编程资料 -> delphi -> 开发技巧 -> 系统开发 ->详细
  首页 | 本站产品 | Delphi资料 | 免费资源 | 程序人生 | 软件工程 | 网站设计 | 推荐网站
声明:本站内容除注明原创以外均从网上摘抄,如有侵权请指明。
  如果您对我们的网站有什么意见或者建议,请与我们联系
powered by 建站易上手- V2.0