DELPHI基础教程:开发Delphi对象式数据管理功能(五)[1]
第二十章 开发Delphi对象式数据管理功能(五)
写DFM文件的过程 WriteComponentResFie
该过程带有两个参数FileName和Instance FileName参数指定要写入的DFM文件名 Instance参数是TComponent类型的 它指定要写入的部件名 一般是TForm对象的子类 该过程将Instance部件和其拥有的所有部件写入DFM文件
这个过程的意义在于 可以在程序运行过程中产生Delphi的窗体部件和在窗体中插入部件 并由该函数将窗体写入DFM文件 支持了动态DFM文件的重用性
该过程的程序是这样的
procedure WriteComponentResFile(const FileName: string; Instance: TComponent)
var
Stream: TStream;
begin
Stream := TFileStream Create(FileName fmCreate)
try
Stream WriteComponentRes(Instance ClassName Instance)
finally
Stream Free;
end;
end;
函数中 用FileStream创建文件 用Stream对象的WriteComponetRes方法将Instance写入流中
读DFM文件的函数 ReadComponentResFile
ReadComponentResFile函数带有两个参数FileName和Instance FileName参数指定要读DFM文件名 Instance参数指定从DFM文件中要读的部件 该函数从DFM文件中将Instance和它拥有的所有部件 并返回该部件
这个函数的意义在于 配合WriteComponentResFile过程的使用支持DFM文件的重用性
该函数的程序是这样的
function ReadComponentResFile(const FileName: string; Instance: TComponent)
TComponent;
var
Stream: TStream;
begin
Stream := TFileStream Create(FileName fmOpenRead)
try
Result := Stream ReadComponentRes(Instance)
finally
Stream Free;
end;
end;
程序中使用FileStream对象打开由FileName指定的DFM文件 然后用Stream对象的ReadComponentRes方法读出Instance 并将读的结果作为函数的返回值
读取Delphi应用程序资源中的部件
函数InternalReadComponentRes可以读取Delphi应用程序资源中的部件 Delphi 的DFM文件在程序经过编译链接后被嵌入应用程序的资源中 而且格式发生了改变 即少了资源文件头
在第一节中曾经介绍过TResourceStream对象 该对象是操作资源媒介上的数据的 函数InternalReadComponentRes用了TResourceStream 程序是这样的
function InternalReadComponentRes(const ResName: string;
var Instance: TComponent) Boolean;
var
HRsrc: THandle;
begin { 避免 EResNotFound 异常事件的出现 }
HRsrc := FindResource(HInstance PChar(ResName) RT_RCDATA)
Result := HRsrc <> ;
if not Result then Exit;
FreeResource(HRsrc)
with TResourceStream Create(HInstance ResName RT_RCDATA) do
try
Instance := ReadComponent(Instance)
finally
Free;
end;
Result := True;
end;
HInstance是一个Delphi VCL定义的全局变量 代表当前应用程序的句柄 函数用了资源访问API函数FindResource来测定是否存在ResName所描述资源 因为在TResourceStream的创建过程还有FindResource等操作 所以函数中调用了FreeResource 最后函数调用了Stream对象的ReadComponent方法读出部件 因为函数的Instance是var类型的参数 所以可以访问Instance 得到读出的部件
DFM文件与标准文本文件(TXT文件)的相互转换
在Delphi可视化设计环境中 允许程序员在代码编辑器中以文本的方式浏览和修改DFM文件内容 当用File/Open命令直接打开DFM文件或者选择窗体设计窗口的弹出式菜单上的View as Text命令时 就会在编辑器中出现文本形式的信息 我们姑且将这种文本形式称之为窗体设计脚本 Delphi提供的这种脚本编辑功能是对Delphi可视化设计的一大补充 当然这个脚本编辑能力是有限制的 比方说不能在脚本任意地添加和删除部件 因为代码和DFM脚本是紧密相连的 任意添加和修改会导致不一致性 然而在动态生成的DFM文件中 就不存在这一限制 后面会介绍DFM动态生成技术的应用
实际上 DFM文件内容是二进制数据 它的脚本是经过Delphi开发环境自动转化的 而且Delphi VCL中的Classes库单元中提供了在二进制流中的文件DFM和它的脚本之相互转化的过程 它们是ObjectBinaryToText和ObjectTextBinary ObjectResourceToText和ObjectTextToResource
ObjectBinaryToText过程将二进制流中存储的部件转化为基于文本的表现形式 这样就可以用文本处理函数进行处理 还可以用文本编辑器进行查找和替代操作 最后可以将文本再转化成二进制流中的部件
ObjectBinaryToText过程的主程序是这样的
procedure ObjectBinaryToText(Input Output: TStream)
var
NestingLevel: Integer;
SaveSeparator: Char;
Reader: TReader;
Writer: riter;
procedure WriteIndent;
const
Blanks: array[ ] of Char = ;
var
I: Integer;
begin
for I := to NestingLevel do Writer Write(Blanks SizeOf(Blanks))
end;
procedure WriteStr(const S: string)
begin
Writer Write(S[ ] Length(S))
end;
procedure NewLine;
begin
WriteStr(# # )
WriteIndent;
end;
procedure ConvertHeader;
begin
…
end;
procedure ConvertBinary;
begin
…
end;
procedure ConvertValue;
begin
…
end;
procedure ConvertProperty;
begin
…
end;
procedure ConvertObject;
begin
…
end;
begin
NestingLevel := ;
Reader := TReader Create(Input )
SaveSeparator := DecimalSeparator;
DecimalSeparator := ;
try
Writer := riter Create(Output )
try
Reader ReadSignature;
ConvertObject;
finally
Writer Free;
end;
finally
DecimalSeparator := SaveSeparator;
Reader Free;
end;
end;
过程中调用的ConvertObject过程是个递归过程 用于将DFM文件中的每一个部件转化为文本形式 因为由于部件的拥有关系 所以部件成嵌套结构 采用递归是最好的方式
procedure ConvertObject;
begin
ConvertHeader;
Inc(NestingLevel)
while not Reader EndOfList do ConvertProperty;
Reader ReadListEnd;
while not Reader EndOfList do ConvertObject;
Reader ReadListEnd;
Dec(NestingLevel)
WriteIndent;
WriteStr( end # # )
end;
NestStingLevel变量表示部件的嵌套层次 WriteIndent是写入每一行起始字符前的空格 ConvertHeader过程是处理部件的继承标志信息 转换成的头信息文本有两种形式
Inherited TestForm : TTestForm[ ]
或者
Object TestForm : TTestForm
前者是ffInherited和ffChildPos置位 后面是都没置位
ConvertProperty过程用于转化属性
procedure ConvertProperty;
begin
WriteIndent;
WriteStr(Reader ReadStr)
WriteStr( = )
ConvertValue;
WriteStr(# # )
end;
WriteIndent语句写入属性名前的空格 WriteStr(Reader ReadStr)语句写入属性名ConvertValue过程根据属性的类型将属性值转化为字符串 然后写入流中
lishixinzhi/Article/program/Delphi/201311/25088
Delphi基础教程(计算机技术专业)内容简介
对于计算机技术专业的学习者,《Delphi基础教程》是一本实用且适合中等职业学校电子信息类教材的指南。它以实例为导向,详细地指导读者如何运用Delphi 5来创建一个实际的数据库管理系统——学生档案管理系统。这个过程涵盖了从数据录入、打印、维护,到最后安装程序的制作,注重的是实践操作,而非深入的理论讲...
Delphi 7基础教程基本信息
以下是关于《Delphi 7基础教程》的一些基本信息:该书籍的官方名称是《Delphi 7基础教程》,书号为1966656,它由宋兵等专家编著,为读者提供了深入学习Delphi 7的实用指南。这本书由享有盛誉的机械工业出版社出版,定价合理,为29.5元。ISBN号码是711115414,这有助于读者在众多书籍中准确识别。出版日期为2...
Delphi程序设计基础教程版权信息
要了解Delphi程序设计的基础,可以参考曹静所著的教材。该书名为《Delphi程序设计基础教程》,由中国水利水电出版社出版,于2008年发行。本书的ISBN号码是9787508459110,适合16开本的阅读体验,定价为27.00元。此书的特点是理论与实践相结合,内容通俗易懂,讲解深入透彻,配以丰富的实例,使其成为理想的教...
Delphi基础教程(计算机技术专业)目录
以下为Delphi基础教程的详细内容概览,主要针对计算机技术专业学习者:第1章深入探讨数据库开发技术的基础知识,包括数据结构、SQL语言和数据库连接原理,为后续操作奠定坚实基础。第2章则是实战应用,教授如何设计主菜单并录入学生档案信息,通过实例学习数据录入和管理的技巧。第3章讲解如何生成数据库报表,掌握...
Delphi 7基础教程目录
第1章:Delphi基础知识 1.1 Delphi的特点 - 介绍编程环境的独特性 1.2 Delphi 7集成开发环境 - 环境设置与使用入门 1.3 实例 - Hello,world! - 初步实践项目 1.4 小结 - 基础概念回顾第2章:ObjectPascal语言基础 2.1 Delphi编程风格 - 代码规范和习惯 2.2 标识符 - 认识和使用...
Delphi程序设计基础教程上机指导与习题解答内容简介
本书《Delphi程序设计基础教程上机指导与习题解答》是一本全面深入的教程,旨在引导读者掌握Delphi的基础知识和核心技能。内容涵盖:首先,它从基础开始,详细讲解ObjectPascal语言,这是Delphi编程语言的核心,为后续章节打下坚实基础。然后,章节转向实际应用,介绍了如何设计和使用窗体以及基本组件,让读者了解...
Delphi 7 基础教程目录
系列教材序言 本教程旨在为初学者提供Delphi 7的基础知识,通过循序渐进的方式,让学习者逐步掌握这门强大的编程语言和开发环境。第一章:Delphi基础知识 1.1 Delphi的特点:作为RAD(Rapid Application Development)工具,Delphi以其高效和易用性闻名。1.2 Delphi 7的集成开发环境:介绍了Delphi的IDE,...
Delphi 7 基础教程简介
本书以基础为起点,逐步深入,全面讲解Delphi 7的基础知识。书中通过实际案例,详细剖析了各类常用组件的运用方法。全书共分为13个章节,涵盖了集成开发环境的介绍、ObjectPascal编程语法的精要、用户界面设计的实践、多媒体应用的探讨、数据库开发的步骤以及网络编程的策略等全方位内容。内容丰富,图文并茂,...
Delphi基础教程图文版之语句(循环语句)
在控制循环流程时,break强制退出最近的循环,类似于C\/C++的break;continue则跳过当前循环的剩余部分,进入下一次迭代,尽管在实际编程中使用较少。exit则是从当前代码块或程序中退出,它在Delphi中常与Result和Exit一起使用,替代return。总的来说,理解并熟练运用这些循环语句和控制结构,是Delphi编程的...
Delphi7开发基础教程目录
以下是Delphi 7开发基础教程的概要,分为几个部分:第1章: Delphi 7入门1.1 介绍了Delphi的历史发展和主要特点,以及它的企业版发布版本。1.3 部分详细讲解了企业版的安装流程,包括系统需求和安装步骤。1.4 集成开发环境(IDE)的组成部分,如菜单栏、工具栏、组件面板,以及工程和文件管理功能。1....
严牵凯思: DELPHI基础教程 -------------------------------------------------------------------------------- 第一章 Delphi快速入门(一) 第一章 Delphi快速入门(二) 第一章 Delphi快速入门(三) 第一章 Delphi快速入门(四) 第一章 Delphi快速入门(五) 第二章 Delphi面...
大厂回族自治县19127654510: Delphi入门教程是什么? ?
严牵凯思: 按动ObjectInspector下端的“Events”页标签,使得Events页可见,这一定的事件后边的空白处,可以定义对象接受到相应事件时执行的动作
大厂回族自治县19127654510: 初学者如何学习DELPHI?对编程一点经验都没有 50分?
严牵凯思: 我的建议是直接从数据库编程开始 买一本书,找自己感兴趣的数据库编程,然后自己就照着做,这样在潜移默化中你将会学习到了基本基础知识 然后呢,你在慢慢学会变通吧:)
大厂回族自治县19127654510: Delphi7开发基础教程的介绍 - ?
严牵凯思: 《Delphi7开发基础教程》由牛汉民编著,科学出版社出版.本书共分7章,主要内容包括Delphi 7入门、Delphi语言基础、面向对象的程序设计技术、组件库体系结构及其使用、数据库应用系统开发基础、基于BDE的数据库应用程序开发和Delphi 7程序调试,可作为高等职业技术院校和相关认证课程教材,也可供从事Delphi 7应用开发的程序设计人员学习、参考.目录
大厂回族自治县19127654510: delphi应该怎么学?从何学起? - ?
严牵凯思: 建议按照下面步骤吧.... 先声明下 delphi 在WIN32应用方面 MIS数据库方面,C/S多层,,很强大,,,呵呵...... 1: 先学 Pascal , Object Pascal. 只要学习pascal的语法就行,比如变量声明,各种操作符,关键字等. 不管那种语言的语句基本上都...
大厂回族自治县19127654510: 怎么自学Delphi??
严牵凯思: 先阅读 delphi入门与精通丛书 然后看视频课程和做demo练习 完事找个师傅做高端的开发 例如三层架构 工控等等 delphi盒子 delphi原地 等等 都是比较出色的网站 看看其他有经验人的交流
大厂回族自治县19127654510: Delphi语法基础? - ?
严牵凯思: Delphi语法基础2.1 保留字与标识符2.1.1 标识符 标识符是Object Pascal语言中各种成分 的名称,这些成分包括变量(Var)、常量(Const)、类型(Type)、过程(Procedure)、函数(Function)、方法(Method)、单元(Unit)等.标识符...
大厂回族自治县19127654510: 如何学习 delphi - ?
严牵凯思: 终于有人问这个问题了!我虽然现在编程这里得分最多,但是很少有人问我最喜欢回答的问题.就凭你要学DELPHI,不给分我也好好回答!我是个DELPHI的忠实FANS.大学刚毕业.初中生可以学这个,这是肯定的.学习DELPHI,其实就是...
大厂回族自治县19127654510: DELPHI数控加工技术教学这个毕业设计软件应该怎么去开发??
严牵凯思: 下面从软件工程的角度介绍本程序的基本开发步骤.Delphi 应用程序一般包含以下三个基本部分: 应用程序运行的接口:负责系统整体环境的设置,运行状态的监视,应用程序的启动等.具体的内容可以参考一下 毕业设计( http://www.buy56.net/Product/Pro406.Html) 网站,他们那里关于这个题目的介绍比较详细,你去看一下肯定有好处的!
大厂回族自治县19127654510: delphi怎么入门啊?
严牵凯思: 1我认为进修次序应当是下面的步调: 实践是最重要的1、pascal说话,进修下根本的数据类型、语法构造(跟C差好远,愁闷); 2、搞个delphi7,进修桌面应用法度榜样的开辟,不消太难的,搞点小法度榜样就可以,比如写个寂骥什么的,关键是看delphi生成的代码是若何写的(感到跟VB一个样,事宜驱动); 3、进修delphi的面向对象编程,懂得面向对象编程的思惟,这点异常重要,要不就掉去了进修delphi的意义; 4、win32的编程,这部分是delphi的优势地点. 进修根本的语法===》IDE(熟悉组件) + RAD(快速开辟)=====》数据库(能让你认为有点成就)=====》windows ,收集,等等