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

Posted 部件

篇首语:生命是不能被略过的,一定有人敢选最难的那条路,一定有人把生命排在利益前面。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 开发Delphi对象式数据管理功能(四)[4]相关的知识,希望对你有一定的参考价值。

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

  ReadComponent方法主要是调用ReadComponent方法从Reader对象的流中读取一连串相关联的部件 并分解相互引用关系

  procedure TReader ReadComponents(AOwner AParent: TComponent;

  Proc: TReadComponentsProc)

  var

  Component: TComponent;

  begin

  Root := AOwner;

  Owner := AOwner;

  Parent := AParent;

  BeginReferences;

  try

  while not EndOfList do

  begin

  ReadSignature;

  Component := ReadComponent(nil)

  Proc(Component)

  end;

  FixupReferences;

  finally

  EndReferences;

  end;

  end;

  ReadComponents首先用AOwner和AParent参数给Root Owner和Parent赋值 用于重建各部件的相互引用 然后用一个While循环读取部件并用由Proc传入的方法进行处理 在重建引用关系时 用了BeginReferences FixUpReferences和EndReferences嵌套模式

  ReadRootComponent方法从Reader对象的流中将部件及其拥有的部件全部读出 如果Component参数为nil 则创建一个相同类型的部件 最后返回该部件

  function TReader ReadRootComponent(Root: TComponent) TComponent;

  function FindUniqueName(const Name: string) string;

  begin

  …

  end;

  var

  I: Integer;

  Flags: TFilerFlags;

  begin

  ReadSignature;

  Result := nil;

  try

  ReadPrefix(Flags I)

  if Root = nil then

  begin

  Result := TComponentClass(FindClass(ReadStr)) Create(nil)

  Result Name := ReadStr;

  end else

  begin

  Result := Root;

  ReadStr; Ignore class name

  if csDesigning in Result ComponentState then

  ReadStr else

  Result Name := FindUniqueName(ReadStr)

  end;

  FRoot := Result;

  if GlobalLoaded <> nil then

  FLoaded := GlobalLoaded else

  FLoaded := TList Create;

  try

  FLoaded Add(FRoot)

  FOwner := FRoot;

  Include(FRoot FComponentState csLoading)

  Include(FRoot FComponentState csReading)

  FRoot ReadState(Self)

  Exclude(FRoot FComponentState csReading)

  if GlobalLoaded = nil then

  for I := to FLoaded Count do TComponent(FLoaded[I]) Loaded;

  finally

  if GlobalLoaded = nil then FLoaded Free;

  FLoaded := nil;

  end;

  GlobalFixupReferences;

  except

  RemoveFixupReferences(Root )

  if Root = nil then Result Free;

  raise;

  end;

  end;

  ReadRootComponent首先调用ReadSignature读取Filer对象标签 然后在try…except循环中执行读取任务 如果Root参数为nil 则用ReadStr读出的类名创建新部件 并以流中读出部件的Name属性 否则 忽略类名 并判断Name属性的唯一性 最后用Root的ReadState方法读取属性和其拥有的拥有并处理引用关系

   SetName方法和OnSetName事件

  因为在OnSetName事件中 Name参数是var型的 所以可以用OnSetName事件处理过程修改所读部件的名字 而OnSetName事件处理过程是在SetName方法中实现的

  procedure TReader SetName(Component: TComponent; var Name: string)

  begin

  if Assigned(FOnSetName) then FOnSetName(Self Component Name)

  Component Name := Name;

  end;

  SetName方法和OnSetName事件在动态DFM文件的编程中有很重要的作用

   TReader的错误处理

  TReader的错误处理是由Error方法和OnError事件的配合使用完成的 OnError 事件处理过程的Handled参数是var型的布尔变量 通过将Handled设为True或False可影响TReader 的错误处理 OnError事件处理过程是在Error方法中调用的

  function TReader Error(const Message: string) Boolean;

  begin

  Result := False;

  if Assigned(FOnError) then FOnError(Self Message Result)

  end;

   FindMethod和OnFindMethod事件

  有时 在程序运行期间 给部件的方法指针(主要是事件处理过程)动态赋值是很有用的 这样就能动态地改变部件响应事件的方式 在流中读取部件捍做到一点就要利用OnFindMehtod事件 OnFIndMethod事件是在FindMethod方法中被调用的

  function TReader FindMethod(Root: TComponent;

  const MethodName: string) Pointer;

  var

  Error: Boolean;

  begin

  Result := Root MethodAddress(MethodName)

  Error := Result = nil;

  if Assigned(FOnFindMethod) then FOnFindMethod(Self MethodName Result

  Error)

  if Error then PropValueError;

  end;

  OnFindMethod 方法除了可以给部件的MethodName所指定的方法指针动态赋值外 还可修改Error参数来决定是否处理Missing Method错误 方法中调用的MehtodAddress 方法定义在TObject中 它是个很有用的方法 它可以得到对象中定义的public方法的地址 FindMethod方法和OnFindMethod事件在动态DFM的编程中有很重要的作用

   Delphi对象式数据管理应用实例

  Delphi 无论是其可视化设计工具 还是可视化部件类库(VCL) 都处处渗透了对象存储技术 本节将从Delphi可视化设计内部机制 VCL中的数据存储 BLOB数据操作和动态生成部件的存储几方面介绍对象存储功能的实例应用

   Delphi 动态DFM文件及部件的存取在超媒体系统中的应用

  Delphi的可视化设计工具是同其部件类库紧密结合在一起的

  每个部件只有通过一段注册程序并通过Delphi的Install Component功能 才能出现在Component Palette上 部件的属性才有可能出现在Object Inspector窗口中 部件的属性编辑器才能被Delphi环境使用 因为这种浑然天成的关系 DFM文件存取必然得到VCL在程序上的支持

  DFM文件的部件存取是Delphi可视化设计环境中文件存取的中心问题 因为Delphi可视化设计的核心是窗体的设计 每个窗体对应一个库单元 是应用程序的模块 窗体在磁盘上的存储就是DFM文件

  DFM文件结构我们前面介绍过了 它实际上是存储窗体及其拥有的所有部件的属性 这种拥有关系是递归的 问题在于如何将这些属性数据与程序中的变量(属性)代码联系起来

  在Delphi中处理这种联系的过程分为两种情况 设计时和运行时

  在设计时 建立联系表现为读取DFM 文件 建立DFM文件中的部件及其属性与可视化设计工具(Object Inspector 窗体设计窗口和代码编辑器)的联系 也就是说让这些部件及其属性能出现在这些窗口中 并与代码中的属性定义联系起来 分解联系表现为存储DFM文件 将窗体窗口中的部件及其属性写入DFM文件

  在运行时 主要是建立联系的过程 即读取DFM文件 这时 DFM文件不是作为独立的磁盘文件 而是以应用程序资源中的RCDATA类型的二进制数据存在 建立联系的过程表现为将资源中的部件及其属性与应用程序中的对象及其数据域联系起来 其过程为 根据DFM中的部件类名创建对象 再将用DFM中的部件属性值给程序中的部件属性赋值 当然要完成这一过程 还必须在代码中有相应的窗体定义 因为方法等代码是不存入部件的

  VCL对读取DFM文件在代码上的支持是通过Stream对象和Filer对象达到的 在 和 节中 我们可以看到Stream对象和Filer对象中有大量的用于存取部件及其属性的方法 尤其在TReader对象中 还有关于错误处理和动态的方法赋值的方法 下面我们就通过程序实例介绍存取DFM文件方法 步骤和注意事项

  返回目录 DELPHI基础教程

       编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

  Visual C++音频/视频技术开发与实战

  Oracle索引技术

  ORACLE G数据库开发优化指南

  Java程序性能优化 让你的Java程序更快 更稳定

  C嵌入式编程设计模式

  Android游戏开发实践指南

cha138/Article/program/Delphi/201311/25095

相关参考

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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