首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试
MPA考试 | 中科院
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT
新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
华为认证 | Java认证
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格
报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师
人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平
驾驶员 | 网络编辑
卫生资格 | 执业医师 | 执业药师 | 执业护士
会计从业资格考试会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师
注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师
质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师
设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师
城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏
您现在的位置: 考试吧(Exam8.com) > 计算机等级考试 > 计算机二级 > Delphi > 复习资料 > 正文

分享:计算机二级DELPHI技巧TMemoryStream操作

来源:考试吧Exam8.com) 2010-8-30 13:55:13 考试吧:中国教育培训第一门户 模拟考场
考试吧为您整理了“计算机二级DELPHI技巧TMemoryStream操作”,以供广大学员参考使用。更多关于计算机等级考试资料,请访问考试吧计算机等级考试频道。

  TMemoryStream的继承关系如下

  TObject

  |

  TStream

  |

  TCustomMemoryStream

  |

  TMemoryStream

  如何使用TMemoryStream?

  其实TmemoryStream使用就跟TStream 一样具体的属性,方法可看帮助。

  下举一例:

  如我想在内存中直接读写一个Bitmap,怎么办?

  TmemoryStream帮了你大忙

  var

  BitmapMemoryStream:TMemoryStream;

  Bitmap1:TBitmap;

  procedure TForm.Button1Click(Sender:TObject);

  begin

  BitmapmemroyStream:=TmemoryStream.Create; file://建立MemoryStream

  Bitmap1:=TBitmap.Create;

  try

  Bitmap1.LoadFromFile(\'d:\\Bitmap1.bmp\');

  except

  ShowMessage(\'Error On LoadFile bitmap1.bmp\');

  end;

  end;

  procedure TForm.Button2Click(Sneder:Tobject);

  begin

  if Assigned(Bitmap1) then

  Bitmap1.SaveToStream(BitmapmemoryStream);

  end;

  procedure TForm.Button3Click(Sender:TObject);

  begin

  if BitmapMemoryStream<>nil then

  begin

  try

  BitmapMemroyStream.SaveToFile(\'Bitmap1.str\'); file://内存流保存,大小与file://Bitmap1.bmp一样

  except

  showmessage(\'error on access memory!\');

  end;

  end;

  end;

  procedure TForm.Button4Click(Sender:TObject);

  var

  Buffer:Array[0..53] of char;

  begin

  if Assigned( BitmapMemroyStream) then

  try

  BitmapMemroyStream.Seek(0,soFromBeginning);

  BitmapMemoryStream.Read(Buffer,54);

  if Buffer[0]=\'B\' and Buffer[1]=\'M\' then file://改写内存内容

  begin

  BitmapMemoryStream.Seek(0,soFromBeginning);

  BitmapmemoryStream.Write(\'ICE\',3);

  Button3Click(Sender);//将改写的内容写入文件

  end;

  except

  ShowMessage(\'error On Access memroyStream\');

  end;

  end;

  大家可看到用TMemoryStream对与内存读写多么方便,当然其实用不着先建一Bitmap,可以用LoadFromFile直接引导文件,但是如果对于其它的内存流却是可以用上述方法

  上文只是抛转引玉,其它的一些功能大家可以看帮助,自己琢磨!

  还有很多其它的流式对象,大致都差不多,一通百通!

   如何将一个流的内容写入到剪贴板中,并处理这个技巧是参考Delphi的剪贴板类的实现来完成的。将一个流的内容放入剪贴板,首先要注册你自已的格式,使用RegisterClipboardFormat()函数,然后做下面三步:

  1.创建一个内容流,并将内容写进去

  2.创建一个全局的内容区,并将流的内容写入

  3.调用ClipBoard.SetAsHandle()将内容写入剪贴板,将内容写入剪贴板中

  var

  hbuf : THandle;

  bufptr : Pointer;

  mstream : TMemoryStream;

  begin

  mstream := TMemoryStream.Create;

  try

  {-- 处理流的代码 $-->

  hbuf := GlobalAlloc(GMEM_MOVEABLE, mstream.size);

  try

  bufptr := GlobalLock(hbuf);

  try

  Move(mstream.Memory^, bufptr^, mstream.size);

  Clipboard.SetAsHandle(CF_MYFORMAT, hbuf);

  finally

  GlobalUnlock(hbuf);

  end;

  except

  GlobalFree(hbuf);

  raise;

  end;

  finally

  mstream.Free;

  end;

  end;

  请注意不要将分配的全局缓冲区释放,这个工作由剪贴板来完成,在读出数据中你应该将它复制后处理。

  将剪贴板内容读出来

  var

  hbuf : THandle;

  bufptr : Pointer;

  mstream : TMemoryStream;

  begin

  hbuf := Clipboard.GetAsHandle(CF_MYFORMAT);

  if hbuf <> 0 then begin

  bufptr := GlobalLock(hbuf);

  if bufptr <> nil then begin

  try

  mstream := TMemoryStream.Create;

  try

  mstream.WriteBuffer(bufptr^, GlobalSize(hbuf));

  mstream.Position := 0;

  {-- 处理流的代码 $-->

  finally

  mstream.Free;

  end;

  finally

  GlobalUnlock(hbuf);

  end;

  end;

  end;

  end;

  在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 ); file://将类中的数据写到Stream的当前位置中

  ---- 2. LoadFromStream(Stream: TStream); file://从当前位置读入Stream里的数据

  ---- 实际使用时我们基本上只要使用上面两个函数就可以了。

  三、 例子

  ---- TStream的继承树图,实际使用时比较常用的是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。将dbTest与刚才Desktop创建的数据库相连,Table1的TableName属性设为test.db,DataSource1的DataSet属性设为Table1,DBNavigator1的DataSource属性设为DataSource1,VisibleButtons属性前四个设为TRUE。此外,将dbtest的Connected设为TRUE,Table1的Active属性设为TRUE,使得数据库一开始就处于打开状态。

  相关推荐:2010年9月计算机等级考试精华备考资料汇总
       2010年计算机等级考试二级公共基础知识教程
       考试吧:2010年计算机等考二级VB预测题汇总
       2010年全国计算机等级考试全攻略(一至四级)
文章搜索
版权声明:如果计算机等级考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本计算机等级考试网内容,请注明出处。