第二十章开发delphi对象式数据管理功能五内容摘要:

是非可视化的。 但可以借助于静态 DFM文件的可视化设计。 这就是生成和使用动态 DFM 文件的第二种方法。 也就是在应用程序运行前,在 Delphi 开发环境中,使用可视化开发工具设计所需窗口或部件的样式,以 DFM 文件保存。 然后在应用程序运行过程中,将 DFM 文件读入内存。 Delphi 的 Stream 对象和 Filer 对象在读取 DFM 文件时,会根据 DFM文件的内容自动创建部件及其拥有的所有部件。 在使用动态 DFM 文件时有两点需要注意。 ● 每一个动态插入的控制或部件必须在程序中调用 RegisterClass 进行注册 ● 读入 DFM 文件自动创建部件后,如果调用了 InsertControl 方法, 则在关闭窗口时要调用 RemoveControl 方法移去该控制,否则会产生异常事件 2. 动态 DFM 文件应用之一:超媒体系统的卡片设计 Delphi 多种类型的可视部件,如文本部件、编辑部件、图形图像部件 、数据库部件、媒体媒放部件和 OLE 部件等,每一种部件在屏幕中占据一定的区域,具有相当丰富的表现能力,可以作为卡片中的一种媒体,因此可以利用这些可视部件进行超媒体系统的卡片设计。 超媒体卡片设计要求卡片中的媒体数目和媒体种类是不受限制的,而且必须能够修改和存取卡片,因此,采用动态 DFM 文件是比较合适的。 而且如果利用Stream 对象,将卡片存储在数据库 BLOB 字段中,就为把超文本与关系数据库技术结合起来创造了契机。 下面是超媒体卡片设计子系统中的部分源程序,它演示了如何创建对象、插入对象和存取动态 DFM 文件。 ⑴ 在应用程序中注册对象 procedure (Sender: TObject)。 begin RegisterClass(TLabel)。 RegisterClass(TEdit)。 RegisterClass(TMemo)。 RegisterClass(TButton)。 RegisterClass(TPanel)。 RegisterClass(TPanelP)。 RegisterClass(TBitBtn)。 „ end。 ⑵ 创建和插入对象 procedure (Sender: TObject)。 var Ctrl : TControl。 Point: TPoint。 begin GetCursorPos(Point)。 Point := (Point)。 case CurToolIndex of 1 : begin Ctrl := (self)。 TLabel(Ctrl).AutoSize := False。 TLabel(ctrl).Caption := 39。 Label39。 +S。 TLabel(ctrl).Name := 39。 Label 139。 TLabel(ctrl).Top :=。 TLabel(ctrl).Left :=。 TLabel(Ctrl).Height := Round(100*Res/1000/Ratio)。 TLabel(Ctrl).Width := Round(600*Res/1000/Ratio)。 TLabel(Ctrl).Color := clWhite。 TLabel(Ctrl). := clBlack。 TLabel(Ctrl). := 39。 Roman39。 TLabel(Ctrl). := TLabel(Ctrl).Height。 TLabel(Ctrl). := fpFixed。 TLabel(Ctrl).Enabled := False。 TLabel(Ctrl).OnClick := LabelClick。 TLabel(Ctrl).OnMouseMove := ReportPos。 (Ctrl)。 := False。 CurTool := nil。 „ end。 2: begin Ctrl := (self)。 TEdit(ctrl).AutoSize := True。 TEdit(ctrl).Top :=。 TEdit(ctrl).Left :=。 TEdit(Ctrl).Height := 20。 (Ctrl)。 „ end。 3: „ end。 end。 ⑵ 存取动态 DFM 文件 procedure (Sender: TObject)。 begin if then begin DesignWin := (Application)。 ReadComponentResFile(, DesignWin)。 FileName :=。 := FFileName。 end。 end。 DesignWin是在 TMainForm 中定义的 TMDIChild 类型的窗体部件,是卡片设计平台; FFileName 是私有变量,用来保存当前编辑的卡片文件名。 DesignWin的 Init 方法实现如下: procedure。 var I: Integer。 Ctrl: TControl。 begin。 with BackGround do for I:= 0 to ControlCount 1 do if Controls[I].Name 39。 39。 then (Controls[I].Name, Controls[I])。 end。 BackGround 是 TPanel 类型的部件,所有的动态创建对象都插入到BackGround 中,所以,后面调用 (Ctrl); ObjectIns是个仿 Delphi 的媒体属性编辑器。 动态 DFM 文件的存储过程是这样的: procedure (Sender: TObject)。 begin if nil then := True。 WriteComponentResFile(FFilename, DesignWin)。 := FileName。 end。 end。 因为在 DesignWin 的 Init 方法 中调用了 InsertControl 方法,所以在关闭DesignWin窗口时要相应地调用 RemoveControl,否则在关闭 DesignWin窗口时会产生内存错误。 procedure (Sender: TObject。 var CanClose: Boolean)。 var I: Integer。 Ctrl: TControl。 Removed: Boolean。 begin if Modified = True then if MessageDlg(39。 Close the form?39。 , mtConfirmation, [mbOk, mbCancel], 0) = mrCancel then CanClose := False。 if CanClose = True then begin repeat removed := False。 I := 0。 repeat if [I].Name 39。 39。 then begin ([I])。 Removed := True。 end。 I := I + 1 until (I = ) or (Removed = True)。 until (Removed = False)。 SendMessage(, WM_MDICHILDCLOSED, 0, 0)。 end。 end。 3. 动态 DFM 文件应用之二:超媒体系统脚本语言设计 超媒体脚本语言设计是超媒体系统设计的重要内容。 脚本语言必须能够表达卡片中的多种 媒体对象,必须是可编程,可理解的,必须是可执行的,应该可以由脚本语言生成超媒体系统中的卡片和链。 DFM 文件可以看作是超媒体系统的卡片, DFM 脚本能够表达 DFM 文件中的多种控制,也就是说能够表达卡片中的多种媒体对象,再加上 DFM 脚本的对象式表达,可编辑性,可转换为 DFM 文件,因此用作超媒体系统脚本语言较好的形式。 ObjectBinaryToText和 ObjectTextToBinary过程提供了在部件和 DFM脚本之间相互转化的功能, ObjectResourceToText 和 ObjectTextToResoure 过程提供了 DFM 文件和 DFM 脚本之间相互转化的功能。 这样就可以在应用程序中自如实现超媒体卡片和超媒体脚本语言相互转化。 下面是卡片和脚本语言相互转化的程序:。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。