delphi程序设计.1

来源:岁月联盟 编辑:exp 时间:2011-10-15

Delphi应用程序框架和设计

第4章 应用程序框架和设计

本章内容:
1. 理解Delphi环境和项目的体系结构
2. 构成Delphi5项目的文件
3. 项目管理提示
4. Delphi5项目的框架类
5. 定义公共体系结构----使用对象库
6. 一些项目管理的功能
本章主要介绍Delphi的项目管理和体系结构,将告诉你怎样正确使用窗体(Form)以及怎样运用它们的功能和可视化特征。本章将讨论应用程序启动/初始化过程、窗体重用/继承以及增强的用户界面等技术。本章还要介绍下列构成Delphi5应用程序的类:TApplication、TForm、TFrame和TScreen。我们将向你证明掌握这些概念有助于正确建立应用程序。

4.1理解Delphi环境和项目的体系结构
要正确建立和管理Delphi5项目,至少有两个重要因素。第一是要了解创建项目的开发环境的细节,第二是要知道构成Delphi5项目的体系结构。这一章并不带你深入了解Delphi5的开发环境(Delphi文档介绍了怎样使用这个环境);相反,这一章只讲述Delphi5 IDE的特点,以帮助你更有效地管理项目。本章还要解释Delphi应用程序的体系结构。这不但使你能够充分发挥开发环境的特点,而且使你能够正确使用其固有的体系结构。
我们的第一个建议是:熟练掌握Delphi5开发环境。本书假设你已经熟悉Delphi5的IDE。其次,本书假设你已经读过Delphi5的文档。但是,你仍然应该把Delphi5的菜单和对话框都打开一遍。如果遇到什么不清楚的选项、设置或操作,应该打开在线帮助从中找到答案。在这里所花费的时间将被证明是值得的(更不用说还学会了如何有效地使用在线帮助)。
提示:在所有参考工具里面,Delphi5的帮助系统无疑是最有价值和最快的。学会如何利用它在数千页的帮助主题中进行浏览是非常有用的。
Delphi5的帮助包括了从怎样使用Delphi5的环境到Win32 API的细节以及复杂的Win32结构等内容。要快速获得帮助,可以在编辑器中键入帮助主题,并使光标落在该主题上,然后按下Ctrl+F1键,帮助信息屏幕就会立即显示出来。也可以在对话框中单击Help按钮,或者在一个组件上按下F1键来获得帮助信息。还可以选择Delphi的Help菜单来浏览帮助系统。

4.2构成Delphi5项目的文件
一个Delphi5项目由若干个相关的文件构成。一些文件是在设计时(如定义主窗体)创建的。其他文件是在编译项目的时候生成的。要有效地管理Delphi5的项目,必须知道其中每一个文件的用途。
Delphi5的文档和在线帮助都详细介绍了项目中的文件。让我们先回顾一下这些文档,以确保你已经熟悉了这些文件。

4.2.1项目文件
项目文件是在设计时创建的,它的扩展名是.dpr。这个文件也是主程序文件。项目文件是主窗体以及其他自动创建的窗体实例化的地方。一般不需要编辑项目文件,除非要执行程序初始化例程、显示启动画面或执行其他必须在程序启动时运行的例程。下面的代码是一个典型的项目文件:

Pascal程序员会把项目文件看作是标准的Pascal源文件。注意uses子句列出了主窗体单元Unit1。项目文件以同样的方式列出项目的所有窗体单元。下面这行代码用于引用项目的资源文件:

这一行告诉编译器去链接一个资源文件,该资源文件名与项目文件相同,但扩展名是.res。项目的资源文件中包含了程序图标和版本信息。
最后,begin..end之间的语句是应用程序要执行的主代码。在这个例子中,创建了主窗体即Form1。当Application.Run这条语句执行后,Form1作为主窗体显示出来。后面将会介绍,可以在begin..end之间加入自己的代码。

4.2.2单元文件
单元文件是Pascal源文件,它的扩展名是.pas。有三种类型的单元文件:窗体/数据模块和框架的单元文件、组件的单元文件和通用的单元文件。
1. 窗体/数据模块和框架单元文件是由Delphi5自动生成的。每个窗体/数据模块或框架都有一个对应的单元文件。例如,不能让两个窗体共用一个单元文件。为了解释窗体文件,我们不在窗体、数据模块和框架之间进行区分。
2. 组件的单元文件是由程序员或Delphi5创建新的组件时生成的。
3. 通用的单元文件是由程序员创建的,用于声明在应用程序中要访问的数据类型、变量、过程、类等。
后面将详细介绍这些单元的细节。

4.2.3窗体文件
窗体文件存储了窗体的二进制信息。当创建一个窗体时,Delphi5将同时创建一个窗体文件(扩展名为.dfm)和一个Pascal单元文件(扩展名为.pas)。如果打开一个窗体的单元文件,会看到下面这行语句:

这一行告诉编译器去链接对应的窗体文件(名称与单元文件相同,但扩展名是.dfm)到项目中。
一般不用直接编辑窗体文件(尽管可以这么做)。可以用Delphi5编辑器打开一个窗体文件,这样就能够查看或编辑文本形式的窗体文件了。要打开一个窗体文件,先选择File|Open菜单命令,然后选择只打开窗体文件(.dfm)的选项。也可以在窗体设计器上单击鼠标右键,在弹出的菜单中选择View as Text命令。当打开文件后,会看到窗体的文本形式。
查看窗体的文本形式会带来一些方便,因为可以从中看出非缺省的属性设置以及窗体上有那些组件。编辑窗体文件是修改组件类型的方法之一。例如,假设一个窗体上有一个TButton组件:

如果把objectButton1:TButton这一行改为"objectButton1:TLabel",那么组件的类型就被改为TLabel。当打开这个窗体时,将会看到一个标签而不是一个按钮。
注意:在窗体文件中修改组件类型可能会导致错误。例如,TButton原来有TabOrder属性,如果把TButton改为TLabel,由于TLabel没有TabOrder属性,这就会导致错误。不过,不用手工去更正它,因为当保存这个窗体时,Delphi会自动进行更正。
警告:编辑窗体文件时要特别小心。如果操作失误,可能会导致Delphi5无法打开这个窗体文件。
注意:Delphi5的新功能允许以文本文件格式保存窗体。这样就可以利用其他像记事本这样的通用工具来编辑窗体。只要在窗体上单击右键打开关联菜单,然后选择Text DFM命令。

4.2.4资源文件
资源文件(.res)中包含了二进制数据,也称为资源,这些资源将链接到应用程序的可执行文件中。.res文件是Delphi5自动创建的,包含应用程序的图标、应用程序版本信息及其他信息。要把资源加入到应用程序中,可以先创建一个单独的资源文件,然后把它链接到项目中。要创建资源文件,可以使用专门的资源编辑器,例如Delphi5提供的ImageEditor或ResourceWorkshop等。
警告:不要编辑由Delphi在编译时自动生成的资源文件。如果那样的话,下次编译时所做的修改有可能丢失。如果要在应用程序中加入其他资源,应当创建另外一个和项目文件不同名的资源文件,然后参照下面这一行把资源链接到项目中:{$R MYRESFIL.RES}

4.2.5项目选项及桌面设置文件
项目选项文件(扩展名为.dof)存储了Project|Options菜单命令所设置的项目选项。它是在第一次保存项目时创建的,以后每次保存项目时都会保存这个文件。
桌面设置文件(扩展名为.dsk)存储了Tools|Options菜单命令所设置的桌面选项。桌面设置与项目选项不同,项目选项与具体项目有关,而桌面设置作用于Delphi5环境。
提示:错误的.dsk或.dof文件在编译时可能导致像GPF这样不可预测的错误。如果真的出现这种情况,应当把.dof和.dsk文件都删除掉。当保存项目或退出Delphi5时会重新生成这两个文件。IDE和项目又恢复到默认设置。

4.2.6备份文件
自第二次保存开始,Delphi5为项目文件和PAS单元文件生成备份文件。备份文件是上次保存的文件的副本。项目文件的备份文件的扩展名是.~dp。单元文件的备份文件的扩展名是.~pa。
窗体文件的二进制备份文件也是在第二次保存时创建的。窗体文件的备份文件的扩展名是.~df。
删除备份文件一般不会有什么问题。如果不想生成备份文件,可以在Editor Properties对话框的Display页上不选中Create Backup File选项。

4.2.7包文件
包类似于动态链接库,它的代码可以被几个应用程序共享。不过,包是Delphi特有的,用于共享组件、类、数据和代码。把组件放到包中,而不是直接链接到应用程序中,可以大大减少应用程序的长度。后面的章节将进一步介绍包。包的源文件的扩展名是.dpk(Delphi Package的缩写),编译后就会生成一个.bpl文件(一个.bpl文件类似于一个动态链接库)。这个.bpl文件由若干个单元或.dcu(Delphi Compiled Units的缩写)文件组成。与源文件对应的中间文件其扩展名是.dcp(Delphi Compiled Package的缩写)。这些内容如果一时搞不清楚就先不要管它,我们会在后面详细介绍。

4.3项目管理提示
通过良好的组织和代码重用,可以优化开发过程。下面提供一些有关项目管理的建议。

4.3.1一个项目一个目录
应当把一个项目中的文件与另一个项目中的文件分开。这样可以避免一个项目的文件覆盖另一个项目的文件。
你最好也把一个项目放在一个单独的目录中。同时,应当规划好一个项目中文件的命名约定。 (参见第6章"代码标准文档")。

4.3.2共享代码的单元
最好把那些需要被其他应用程序共享的例程,放到一个单独的单元中。一般地,先在磁盘中创建一个目录,然后把需要共享的单元放到这个目录中。当一个项目要共享其中的某个单元时,只要把那个单元的名称加到uses子句中就行了。
另外,必须把共享单元所在的目录加到Project|Options对话框的Directories/Conditionals页上的SearchPath框中。这样,Delphi5就知道到哪里找这个单元。
提示:通过项目管理器,可以把其他目录中的单元加到当前项目中,Delphi会自动添加搜索路径中。
为了解释如何使用共享单元,清单4-1列出了一个短小的单元文件StrUtils.pas,其中定义了一个简单的字符串处理函数。实际上,一个单元可能要包含多个例程,这里仅仅用来举个例子。注释部分解释了函数的用途。
清单4-1StrUtils.pas单元

假设有一个单元SomeUnit.pas,需要使用这个ShortStringAsPChar()函数。
那么只要把StrUtils加到这个单元的uses子句。例如:

还要使用Project|Option菜单命令把StrUtils单元所在的目录加到搜索路径中,以确保Delphi5能够找到这个单元。
这样,就可以在SomeUnit.pas单元的Implementation部分使用ShortStringAsPChar()函数。必须把StrUtils加到所有需要使用ShortStringAsPChar()函数的单元的uses子句中。如果要想在整个应用程序中都能使用这个函数,只把StrUtils加到一个项目的一个单元甚至项目文件中是不够的。
提示:因为ShortStringAsPChar()函数比较实用,值得把它放到一个共享单元中,以便其他应用程序重用,这样就不必记住曾经在哪里使用过它。

4.3.2.1.全局标识符单元
一个单元可以专门用来声明全局标识符。前面提到过,一个项目通常由若干个单元组成,包括窗体的单元文件、组件的单元文件和通用的单元文件。如果需要声明一个所有单元都可以访问的变量,该怎么办?按照下面的步骤可以建立一个专门声明全局标识符的单元:
1. 在Delphi5中创建一个单元(通用的单元文件)。
2. 给这个单元起一个能够体现出它是用来声明全局标识符的名字,例如Globals.pas或者ProjGlob.pas。
3. 在这个单元的Interface部分声明变量、类型等。这些标识符将可被所有单元访问。
4. 为了使这些标识符能够被其他单元访问,把这个单元名称加到那些需要访问这个单元的uses子句(就像本章前面关于共享代码中介绍的那样)。

4.3.2.2.使一个窗体能够被其他窗体调用
每一个窗体都包含在一个单元文件中,这并不意味着它不能访问其他窗体的变量、属性和方法。Delphi会在窗体的单元文件中生成代码,声明窗体的一个全局变量实例。所有需要访问另一个窗体的单元,都要把该窗体的单元加到uses子句中。例如,假设窗体1的单元文件是Unit1.pas,它需要访问窗体2,对应的单元文件是Unit2.pas,只要把Unit2加到Unit1的uses子句。如下所示:

现在,Unit1的Implementation部分就可以引用Form2了。
注意:如果在Unit1中引用了Unit2的窗体(就叫它Form2),那么编译项目时会问是否把Unit2加到Unit1的uses子句中;对于Unit1引用Form2这种情况,这是必须的。

4.3.3多项目管理
通常,一个产品由几个项目组成(这些项目可能互相依赖)。典型的例子是多层应用程序中的每一层,或者被其他项目调用的DLL,因为DLL本身也可能是一个独立的项目。
Delphi5提供了管理项目组的功能。项目管理器允许把几个项目组织在一起,形成一个项目组。这里不想详细介绍项目管理器的使用,因为Delphi的文档已经详细介绍过它。这里主要强调组织项目组是非常重要的,以及项目管理器是如何帮你实现项目组的。
在一个项目组中,每个项目的文件最好放在一个单独的目录中。所有需要共享的单元、窗体等都应当放在一个公共的目录中,以便被所有的项目共享。例如,下面是一个典型的目录结构:

根据上面的结构可以看出,有两个专门的目录各自存放一个项目:BugReportProject和BugAdminTool。这两个项目可能需要共享一些单元和窗体,这些单元和窗体应当放在CommonFiles目录中。
项目管理在开发过程中是至关重要的,尤其是在一个团队开发环境中。强烈建议在整个小组投入开发之前建立一个标准,否则,以后的管理将很困难。可以使用项目管理器来建立项目组的结构。

4.4Delphi5项目的框架类
大多数Delphi5应用程序至少有一个TForm的实例。Delphi5 VCL应用程序也只能有一个TApplication的实例和一个TScreen的实例。这三个类在Delphi5中扮演着重要的角色。下面几节就介绍这几个类,掌握了这些知识后就可以根据需要修改它们的缺省功能。

4.4.1TForm类
TForm类是Delphi5应用程序的焦点。大多数情况下,整个应用程序都是围绕着主窗体转的。从主窗体,可以打开其他窗体,通常要通过菜单命令或按钮。也可以让Delphi5自动创建窗体,这样就不用操心什么时候创建、什么时候删除窗体。也可以选择在运行期间动态创建窗体。
注意:Delphi可以创建不使用窗体的程序(例如控制台程序、服务和COM服务器)。这种情况下,TForm就不再是应用程序的焦点。
显示给用户的窗体有两种:有模式的和无模式的。具体使用哪一种窗体,取决于是否希望用户能够同时与这个窗体和其他窗体交互。

4.4.1.1.显示一个模式窗体
当打开一个模式窗体后,用户无法与应用程序的其他部分交互,直到用户关闭了这个窗体。模式窗体通常是对话框,就好像Delphi5本身的对话框一样。事实上,大多数情况下应当使用模式窗体。
要显示一个模式窗体,只要调用ShowModal()就可以了。下面的代码演示了怎样创建TmodalForm的实例,并把它作为模式窗体打开:

上面的代码演示了怎样动态创建TModalForm的实例以及把实例赋值给ModalForm变量。注意:如果需要动态创建一个窗体的实例,就要把这个窗体从Project|Options对话框的Auto-Create框中去掉。如果窗体的实例已经存在,可以调用ShowModal()函数打开它,其他代码可以删掉,变成下面这样:

ShowModal()函数的返回值是ModalForm的ModalResult属性值。缺省情况下,ModalResult属性的值为0,相当于预定义的常量mrNone。如果ModalResult属性被赋值为其他非零值,则窗体将关闭。
可以在运行时对窗体的ModalResult属性进行赋值:

表4-1列出了预定义的ModalResult值。
表4-1ModalResult值

 

 

第4章 应用程序框架和设计

上一篇:Delphi代码优化

图片内容