delphi程序设计.1

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章 应用程序框架和设计
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了Microsoft Windows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语言(Object-Oriented Language)、当今世界上最快的编辑器、最为领先的数据库技术。对于广大的程序开发人员来讲,使用Delphi开发应用软件,无疑会大大地提高编程效率,而且随着应用的深入,您将会发现编程不再是枯燥无味的工作——Delphi的每一个设计细节,都将带给您一份欣喜。  1.1 Delphi基本概念介绍  1.1.1 Delphi的基本形式  Delphi实际上是Pascal语言的一种版本,但它与传统的Pascal语言有天壤之别。一个Delphi程序首先是应用程序框架,而这一框架正是应用程序的“骨架”。在骨架上即使没有附着任何东西,仍可以严格地按照设计运行。您的工作只是在“骨架”中加入您的程序。缺省的应用程序是一个空白的窗体(Form),您可以运行它,结果得到一个空白的窗口。这个窗口具有Windows窗口的全部性质:可以被放大缩小、移动、最大最小化等,但您却没有编写一行程序。因此,可以说应用程序框架通过提供所有应用程序共有的东西,为用户应用程序的开发打下了良好的基础。Delphi已经为您做好了一切基础工作——程序框架就是一个已经完成的可运行应用程序,只是不处理任何事情。您所需要做的,只是在程序中加入完成您所需功能的代码而已。 在空白窗口的背后,应用程序框架正在等待用户的输入。由于您并未告诉它接收到用户输入后作何反应,窗口除了响应Windows的基本操作(移动、缩放等)外,它只是接受用户的输入,然后再忽略。Delphi把Windows编程的回调、句柄处理等繁复过程都放在一个不可见的Romulam覆盖物下面,这样您可以不为它们所困扰,轻松从容地对可视部件进行编程。 1.1.2 面向对象编程的概念  面向对象的程序设计(Object-Oriented Programming,简记为OOP)是Delphi诞生的基础。OOP立意于创建软件重用代码,具备更好地模拟现实世界环境的能力,这使它被公认为是自上而下编程的优胜者。它通过给程序中加入扩展语句,把函数“封装”进Windows编程所必需的“对象”中。面向对象的编程语言使得复杂的工作条理清晰、编写容易。说它是一场革命,不是对对象本身而言,而是对它们处理工作的能力而言。对象并不与传统程序设计和编程方法兼容,只是部分面向对象反而会使情形更糟。除非整个开发环境都是面向对象的,否则对象产生的好处还没有带来的麻烦多。而Delphi是完全面向对象的,这就使得Delphi成为一种触手可及的促进软件重用的开发工具,从而具有强大的吸引力。 一些早期的具有OOP性能的程序语言如C++,Pascal,Smalltalk等,虽然具有面向对象的特征,但不能轻松地画出可视化对象,与用户交互能力较差,程序员仍然要编写大量的代码。Delphi的推出,填补了这项空白。您不必自己建立对象,只要在提供的程序框架中加入完成功能的代码,其余的都交给Delphi去做。欲生成漂亮的界面和结构良好的程序丝毫不必绞尽脑汁,Delphi将帮助您轻松地完成。它允许在一个具有真正OOP扩展的可视化编程环境中,使用它的Object Pascal语言。这种革命性的组合,使得可视化编程与面向对象的开发框架紧密地结合起来。 1.2 Delphi 快速入门  在这一节中,我们来开发一个小程序。随着开发的过程,逐步介绍Delphi的主要部件及其操作方法。建议读者按照本书介绍的过程,在您的电脑上直接操作。您将对Delphi的可视化编程有一个直观、快捷的了解,必将起到事半功倍的效果。  1.2.1 进入Delphi的可视化编程环境 1.2.1.1 安装Delphi  Delphi的安装与其它应用软件并无不同。2.0版必须在Windows 95以上的操作系统中使用。启动Windows 95或Windows NT后,将Delphi的光盘放入光驱(CD-ROM)中,运行光盘上的\INSTALL\SETUP.EXE文件,它的安装程序会提示您正确地装入Delphi。如果您是在微软中文Windows环境中安装Delphi,请参照附录A来设置您的BDE环境,以便于处理中文数据。  1.2.1.2 进入Delphi 环境 为避免隐藏在Delphi后的Program Manager和曾经运行过的其它程序扰乱版面,分散您的注意力,不妨在启动Delphi前关掉其它应用程序启动Delphi后,再最小化隐藏在后面的Delphi 2.0程序组。这样屏幕上就只留下Delphi窗口可见了。 首次加载Delphi,屏幕上会出现四个窗口: ● 标题为“Delphi-Project1”的Delphi主窗口 ● Object Inspector窗口 ● 标题为“Form1”的窗体(Form)窗口 ● 标题为“Unit1.PAS”的代码编辑窗口。刚启动时这一窗口的大部分被“Form1”窗体所掩盖。将“Form1”窗体移开,或单击Form1窗体下方的状态行,可以使其全部可见。在“Form1”窗体的任意可见位置单击鼠标,可以恢复主窗体可见 以下我们将对这四个窗口分别进行介绍。  1.2.2 Delphi可视化编程环境介绍  1.2.2.1 主窗口(Main Form)  Delphi的主窗口位于屏幕的上端,包括Menu(菜单)、Speed Bar(加速条)和Component Panel(部件选项板)。Menu是下拉式主菜单。Speed Bar位于主窗口的左下端,由两排共14个加速按钮组成。这些按钮是菜单功能的快捷方式,各种图标直观地表示了它能执行的动作。Component Panel由一行、若干页对象按钮所组成,利用它来选择需要的部件并将它放到窗体中去。  1.2.2.2 Object Inspector(对象检视器)  Object Inspector窗口含有两页:Properties页显示窗体中当前被选择部件的属性信息,并允许改变对象的属性;Events页列出了当前部件可以响应的事件。按动Object Inspector下端的“Events”页标签,使得Events页可见,这一定的事件后边的空白处,可以定义对象接受到相应事件时执行的动作。首次启动时,Object Inspector窗口显示的是当前窗体Form1的属性。Object Inspector根据对象属性的多少,决定是否有滚行显示。移动滚行条,可以查看当前对象的全部属性。 此外,Object Inspector上还有Object Selector(对象选择器),位于Object Inspector上方的下拉式菜单中。它显示了窗体上所有部件的名称和类型,也包含窗体本身。您可以用Object Selector很容易地在窗体的各个部件之间切换,也可以快速地回到窗体本身。当窗体中含有较多的对象时,您会发现这是切换对象尤其是回到窗体的最快捷途径。 想使Object Inspector一直可见,可将鼠标移到Object Inspector上,按动右键,以启动Object Inspector的弹出式菜单,将其设置为Stay On Top。这对初学者常是一个很重要的设置方式。  1.2.2.3 窗体窗口  Forms窗口是开展大部分设计的工作区域。首次启动Delphi 2.0时显示的是窗体Form1。可以把部件放在窗体中,通过移动位置、改变尺寸等操作随心所欲地安排它们,以此来开发应用程序的用户界面。您可以把窗体想象成一个可以放置其它部件的容器。窗体上有栅格(Grids),供放置部件时对齐位置用,在程序运行时Grids是不可见的。 一个真正的应用程序可能有不止一个窗口,您可以选用不同的窗体进行设计。其它窗体可以是对话框(Dialog Box)、数据录入框等。  1.2.2.4 代码窗口  代码窗口一开始处于窗体窗口之下。因为在Delphi中,设计用户界面直接在窗体中进行,运行结果和设计样板完全一致。当部件被放到窗体上时,Delphi会自动生成大部分的用户界面代码。您所应做的只是在它为您生成的框架中加入完成所需功能的程序段而已。点动Form1的状态行使代码窗口可见。 这个窗口中是代码编辑器。可以在其中书写Delphi应用程序的源代码。当程序中含有不止一个窗口时,会有几个库单元的源程序出现在代码编辑器中。代码编辑器的标题条中显示了当前正在编辑的库单元文件名。要查看某一特定程序的源代码,只需用鼠标点动写有该库单元文件名的页标签,就可以对该库单元进行编辑了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值