知识大全 开发Delphi对象式数据管理功能(五)[3]

Posted 媒体

篇首语:曾无好事来相访,赖尔高文一起予。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 开发Delphi对象式数据管理功能(五)[3]相关的知识,希望对你有一定的参考价值。

DELPHI基础教程:开发Delphi对象式数据管理功能(五)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  procedure TMainForm FileOpen(Sender: TObject)

  begin

  if OpenDialog Execute then

  begin

  DesignWin := TMDIChild Create(Application)

  ReadComponentResFile(OpenDialog FileName DesignWin)

  DesignWin Init;

  FileName := OpenDialog FileName;

  DesignWin Caption := FFileName;

  end;

  end;

  DesignWin是在TMainForm中定义的TMDIChild类型的窗体部件 是卡片设计平台 FFileName是私有变量 用来保存当前编辑的卡片文件名 DesignWin的Init方法实现如下

  procedure TMDIChild Init;

  var

  I: Integer;

  Ctrl: TControl;

  begin

  BackGround BringToFront;

  with BackGround do

  for I:= to ControlCount do

  if Controls[I] Name <> then

  ObjectIns ObjectList Items AddObject(Controls[I] Name Controls[I])

  end;

  BackGround是TPanel类型的部件 所有的动态创建对象都插入到BackGround中 所以 后面调用BackGround InsertControl(Ctrl) ObjectIns是个仿Delphi 的媒体属性编辑器

  动态DFM文件的存储过程是这样的

  procedure TMainForm FileSave(Sender: TObject)

  begin

  if DesignWin CurControl <> nil then

  DesignWin CurControl Enabled := True;

  WriteComponentResFile(FFilename DesignWin)

  DesignWin Caption := FileName;

  end;

  end;

  因为在DesignWin的Init方法中调用了InsertControl方法 所以在关闭DesignWin窗口时要相应地调用RemoveControl 否则在关闭DesignWin窗口时会产生内存错误

  procedure TMDIChild FormCloseQuery(Sender: TObject; var CanClose: Boolean)

  var

  I: Integer;

  Ctrl: TControl;

  Removed: Boolean;

  begin

  if Modified = True then

  if MessageDlg( Close the form? mtConfirmation

  [mbOk mbCancel] ) = mrCancel then

  CanClose := False;

  if CanClose = True then

  begin

  repeat

  removed := False;

  I := ;

  repeat

  if BackGround Controls[I] Name <> then

  begin

  BackGround RemoveControl(BackGround Controls[I])

  Removed := True;

  end;

  I := I +

  until (I >= BackGround ControlCount) or (Removed = True)

  until (Removed = False)

  SendMessage(ObjectIns Handle WM_MDICHILDCLOSED )

  end;

  end;

   动态DFM文件应用之二 超媒体系统脚本语言设计

  超媒体脚本语言设计是超媒体系统设计的重要内容 脚本语言必须能够表达卡片中的多种媒体对象 必须是可编程 可理解的 必须是可执行的 应该可以由脚本语言生成超媒体系统中的卡片和链

  DFM文件可以看作是超媒体系统的卡片 DFM脚本能够表达DFM文件中的多种控制 也就是说能够表达卡片中的多种媒体对象 再加上DFM脚本的对象式表达 可编辑性 可转换为DFM文件 因此用作超媒体系统脚本语言较好的形式

  ObjectBinaryToText和ObjectTextToBinary过程提供了在部件和DFM脚本之间相互转化的功能 ObjectResourceToText和ObjectTextToResoure过程提供了DFM文件和DFM脚本之间相互转化的功能 这样就可以在应用程序中自如实现超媒体卡片和超媒体脚本语言相互转化

  下面是卡片和脚本语言相互转化的程序

  procedure TMDIChild CardToScript;

  var

  In Out: TStream;

  begin

  In := TMemoryStream Create;

  Out := TMemoryStream Create;

  try

  In WriteComponentRes(Self ClassName Self)

  ObjectResourceToText(In out)

  ScriptForm ScriptEdit Lines LoadFromStream(Out)

  finally

  In Free;

  Out Free;

  end;

  end;

  ScriptEdit是个文本编辑器 它的Lines属性是TStrings类型的对象

  procedure TScriptForm ScriptToCard;

  var

  In Out: TStream;

  begin

  In := TMemoryStream Create;

  Out := TMemoryStream Create;

  try

  ScriptForm ScriptEdit Lines SaveToFromStream(In)

  ObjectTextToResource(In out)

  In ReadComponentRes(DesignWin)

  finally

  In Free;

  Out Free;

  end;

  end;

  这两段程序是对整个卡片 即窗体级 进行转换的 ObjectBinaryToText和ObjectTextToBinary过程可以细化到部件级的转换 因此超媒体脚本语言的编辑可以细化到媒体对象级

   超媒体编辑和表现系统与动态DFM文件的扩展

  超媒体系统的媒体编辑与卡片管理有其特殊的需求 比如链接需求 这时采用已有的窗体部件和媒体部件并按常规的DFM文件处理就显得力不从心了 解决这个矛盾有两套方案

  ● 利用Delphi部件开发技术 继承和开发新的部件增加新的超媒体特有的属性和处理方法

  ● 扩展DFM文件结构 使之能按自己的需要任意地存取和转换部件和DFM文件

  前者是充分利用Delphi的面向对象部件开发技术 在存取和转换等处理上仍旧与常规DFM文件相同 而后者需要DFM的存取和转换上作比较大的改动 下文介绍扩展DFM文件的思路

  扩展动态DFM文件的总体思路是降低处理操作的数据的颗粒度 即从原先窗体级降低到部件级

  下面是存取操作的扩展示范

  var

  FileStream: TStream;

  I: Integer;

  begin

  FileStream := TFileStream Create( OverView Crd fmOpenWrite)

  With riter Create(FileStream ) do

  try

  for I := to DesignWin ControlCount do

  begin

  WriteInteger(MMID[i])

  WriteRootComponent(DesignWin Controls[i])

   写相应媒体扩展信息

  ……

  end;

  WriteListEnd;

  finally

  Free;

  end;

  FileStream Free;

  end;

  WriteInteger(MMID[i])语句是写入媒体标识

  下面是相应的读扩展DFM的程序

  var

  PropInfo: PPropInfo;

  Method : TMethod;

  FileStream: TStream;

  I: Integer;

  begin

  FileStream := TFileStream Create( OverView Crd fmOpenRead)

  With TReader Create(FileStream ) do

  try

  while not EndOfList do

  begin

  case ReadInteger of

  IDText: begin

  Ctrl := TControl(ReadRootComponent(nil))

  PropInfo := GetPropInfo(Ctrl ClassInfo OnClick )

  Method Code:= Self MethodAddress(MethodName)

  Method Data := Self;

  if Method Code <> nil then

  SetMethodProp(Ctrl PropInfo Method)

  DesignWin InsertControl(Ctrl)

  end;

  IDImage:

  ……

  end;

  ……

  WriteListEnd;

  end;

  finally

  Free;

  end;

  FileStream Free;

  end;

  SetMethodProp过程是用于重新联接控制和它的事件处理过程 类似的功能还可以用TReader对象的OnFindMethod事件的处理过程来实现

  实现脚本语言扩展的基本方法与存取扩展类似 但它还要加扩展媒体信息转换为文本 并插入到部件的脚本描述中

   数据库BLOB字段应用

  Delphi VCL提供了TBlobStream对象支持对数据库BLOB字段的存取 Delphi 的TBlobStream对象的作用在于一方面可以使Delphi应用程序充分利用多媒体数据库的数据管理能力 另一方面又能利用Delphi Object Pascal的程序设计能力给关系型多媒体数据库提供底层控制能力和全方位的功能扩展余地

   TBlobStream的使用

  TBlobStream对象用一个TBlobField类型的对象作为参数来创建与BLOB字段相联的BLOB流 接着就可用流的存取方法在BLOB字段中存取数据

  var

  BlobStream: TBlobStream;

  I: Integer;

  begin

  BlobStream := TBlobStream Create(TBlobField(CardTable Fields[ ] bmWrite)

  With riter Create(BlobStream ) do

  try

  for I := to DesignWin ControlCount do

  begin

  WriteInteger(MMID[i])

  WriteRootComponent(DesignWin Controls[i])

   写相应媒体扩展信息

  ……

  end;

  WriteListEnd;

  finally

  Free;

  end;

  BlobStream Free;

  CardTable Post;

  end;

  Fields变量是表示数据库记录的字段数组 Fields[ ]正是数据库的BLOB 字段 CardTable的Post方法将数据库的修改反馈到数据库的物理存储上

  上面这段程序是超媒体卡片存储的部分源程序 我们就是将卡片保存在数据库BLOB字段中 实现将超文本和关系数据库两种数据管理方式结合起来 读卡片的程序如下

  var

  PropInfo: PPropInfo;

  Method: TMethod;

  Blobtream: TStream;

  I: Integer;

  begin

  BlobStream := TBlobStream Create(TBlobField(CardTable Fields[ ]) bmRead)

  With TReader Create(BlobStream ) do

  try

  while not EndOfList do

  begin

  case ReadInteger of

  IDText: begin

  Ctrl := TControl(ReadRootComponent(nil))

  PropInfo := GetPropInfo(Ctrl ClassInfo OnClick )

  Method Code:= Self MethodAddress(MethodName)

  Method Data := Self;

  if Method Code <> nil then

  SetMethodProp(Ctrl PropInfo Method)

  DesignWin InsertControl(Ctrl)

  end;

  IDImage:

  ……

  end;

  ……

  WriteListEnd;

  end;

  finally

  Free;

  end;

  FileStream Free;

  end;

   BLOB字段与图形图像

  在多媒体数据库中处理得比较多的是图形图像 因此早期的多媒体数据库在扩展关系数据库时往往是增加一个图像字段 BLOB字段是以二进制数据存储方式 因此它完全可以表达图形图像数据

  在TBlobField对象中提供了LoadFromBitMap和SaveToBitMap方法存取位图数据 它们在实现上都是使用BlobStream对象

  procedure TBlobField LoadFromBitmap(Bitmap: TBitmap)

  var

  BlobStream: TBlobStream;

  Header: TGraphicHeader;

  begin

  BlobStream := TBlobStream Create(Self bmWrite)

  try

  if (DataType = ftGraphic) or (DataType = ftTypedBinary) then

  begin

  Header Count := ;

  Header HType := $ ;

  Header Size := ;

  BlobStream Write(Header SizeOf(Header))

  Bitmap SaveToStream(BlobStream)

  Header Size := BlobStream Position SizeOf(Header)

  BlobStream Position := ;

  BlobStream Write(Header SizeOf(Header))

  end else

  Bitmap SaveToStream(BlobStream)

  finally

  BlobStream Free;

  end;

  end;

  procedure TBlobField SaveToBitmap(Bitmap: TBitmap)

  var

  BlobStream: TBlobStream;

  Size: Longint;

  Header: TGraphicHeader;

  begin

  BlobStream := TBlobStream Create(Self bmRead)

  try

  Size := BlobStream Size;

  if Size >= SizeOf(TGraphicHeader) then

  begin

  BlobStream Read(Header SizeOf(Header))

  if (Header Count <> ) or (Header HType <> $ ) or

  (Header Size <> Size SizeOf(Header)) then

  BlobStream Position := ;

  end;

  Bitmap LoadFromStream(BlobStream)

  finally

  BlobStream Free;

  end;

  end;

  程序中按两种方式存取数据 对于位图数据 数据的起点是流的Potition为 处 对于图形或其它类型的Blob数据 则以流的Position为SizeOf(Header) + 处开始 即多了个头信息

cha138/Article/program/Delphi/201311/25090

相关参考

知识大全 开发Delphi对象式数据管理功能(五)[2]

DELPHI基础教程:开发Delphi对象式数据管理功能(五)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(五)[1]

DELPHI基础教程:开发Delphi对象式数据管理功能(五)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(五)

开发Delphi对象式数据管理功能(五)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 开发Delphi对象式数据管理功能(一)[3]

DELPHI基础教程:开发Delphi对象式数据管理功能(一)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(二)[3]

DELPHI基础教程:开发Delphi对象式数据管理功能(二)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(三)[3]

DELPHI基础教程:开发Delphi对象式数据管理功能(三)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(四)[3]

DELPHI基础教程:开发Delphi对象式数据管理功能(四)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(二)[4]

DELPHI基础教程:开发Delphi对象式数据管理功能(二)[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(一)[5]

DELPHI基础教程:开发Delphi对象式数据管理功能(一)[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 开发Delphi对象式数据管理功能(一)[4]

DELPHI基础教程:开发Delphi对象式数据管理功能(一)[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快