Delphi 程序结构
概要介绍:
Object Pascal语言的结构比较特殊,跟C有很大的不同,但是它秉承PASCAL语言的一贯结构化的传统,相信大家很容易就可以了解。
Program 单元
一个object Pascal程序,是由一个特殊的单元和若干个可选的单元组成的,也就是说一个最简单的Object Pascal程序,可以只由一个特殊的单元组成,这个特殊的单元就是Program 单元。
在Delphi中,Program 单元也就是Delphi的工程文件。Program 单元从功能上讲,有点像C语言中的主程序,程序再简单,它也得有一个Main函数。Program单元也就是这样的主程序。当然,一个程序如果只有Program单元,它也没多大实际意义(除了一些完成特殊任务的程序外),事实上Delphi的程序至少有一个子程序,即后面要介绍的子程序单元。
下面列出一个典型的Program单元:
Program Project1;
Uses
Forms,
Unit1 in 'Unit1.pas';
{$R *.RES}
Begin
Application.Initialize;
Application.CreateForm(Tform1,Form1);
Application.Run;
End;
Program单元由以下几个部分组成:
程序首部,由保留字Program后跟一个程序名组成,上例中是Project1。程序首部也可以带有参数,不过一般很少用到。
引用部分,由保留字Uses加要引用的单元名组成,上例中有两个,分别是Forms单元和Unit1单元,其中Unit1单元还指定在Unit1.pas文件中。最简单的程序可以没有USES部分。
编译指令,上例中,只有一个编译指令{$R *.RES},编译指令也是可选的。
执行部分也称初始化部分,由保留字Begin和End括起来的一段代码。
注意:用Delphi开发程序,除了一些特殊需要,如检查第二个实例是否运行,一般很少需要手工修改Program单元,因为Delphi能够自动建立和维护这个单元,例如当您开始一个新的工种的时候,Delphi 自动建立一个Program单元和一个子程序单元。当您向工程中加入了一个新的Form或Unit,或者使用Project|Option…子命令修改了程序名,program单元将自动更新。
子程序单元(Unit)
子程序单元这种叫法只是为了和Program单元区别,由于大多数时候,我们几乎不需要接触Program 单元,所以以后我们提到单元即是指子程序单元。
Object pascal的一个单元,就是一个独立的Pascal源文件,扩展名为.Pas。单元的结构分为以下几个部分:
首部
接口部分
实现部分
初始化部分
终止部分
End;
1:单元首部
单元首部类似于程序单元首部,由保留字Unit加单元名组成,如:
Unit Unit1;
注意:单元首部也是一个完整的语句,因此单元名后应当跟分号,另外单元名必须符合Object Pascal 关于标识符的规则,并且在同一个工程中单元名必须是唯一的。
当您保存文件时,您使用的保存文件名,将自动反映到这个部分。而且也会加到程序单元的USES部分中。 因此,如果您工程中提示某文件缺失,你可以检查一下这个文件的路径和名称是否改动过。DELPHI工程的文件是不必放在同一目录下的(但是我建议您这么做,便于管理)。
2:Interface部分
Interface部分称为接口部分,用于声明引用的单元、常量、类型、变量、过程和函数,单元的Implementation部分(实现部分)也可以声明引用的单元、常量、类型、变量、那么这两者有什么区别呢?
在Interface部分声明的引用单元、常量、类型、变量、过程和函数对整个程序是公共的,也就是对所有引用该单元的单元来说,这些声明都是可见的、可访问的,例如引用该单元的单元就可以调用在Interface声明的过程和函数。Interface部分相当于类类型的Public部分。Interface部分从保留字Interface开始到保留字Implementation前结束。
在Interface部分,过程和函数只需写出它们的首部,具体的定义是在下面的Implementation(实现部分)给出的。
Interface部分本身又可以由几个可选的部分组成,分别是单元引用部分(Uses)、常量声明部分、类型声明部分、变量声明部分、过程和函数声明部分。
单元引用部分(uses)用于列出该单元要引用的标准单元和其它单元。单元引用的概念有点类似于C语言中的INCLUDE,用于把外部的已声明过的常量、类型、变量、过程或函数引入到本单元中使用,其中标准单元是指Object Pascal预定义好的单元,例如Windows单元、SysUtils单元、Forms单元等,您也可以把其它非标准单元加到Uses,这样该单元也就能引用这些单元中的常量、类型、变量过程和函数等。当您往一个表单上加入控件时,该控件的单元将自动加到该部分,如果你还看不到,存盘就可以看到了。
下面是一个示例:
Unit Unit1;
Interface
Uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Diglogs;
Type
Tform1=Class(Tform)
Private
Public
End;
Var
Form1:Tform1;
Implementation
{$R *.DFM}
End.
这是一个典型的Delphi自动生成的单元,它仅给出这个表单的结构。在Uses部分,引入了Windows,Messages,SysUtils,Classes,Graphics等单元,这样就可以直接调用这些单元中的例程,而无需加入单元引用名。例如:
MessageBeep();
而不需要这么写:
Windows.MessageBeep();
尽管这个例程是在Windows单元中声明的。
注意:如果Interface部分有Uses部分,Uses保留字必须紧跟在保留字Interface后面,尽管可以不在同一行。
上例中,引用的单元都是标准单元,其中有的标准单元几乎是所有的单元都要用到的,因此Delphi自动把这些加到您的单元的Uses 部分,不过一些不太常用的单元,如果您的程序中要引用,您就必须自已手工把它们加到Uses部分。例如,在程序如果你需要使用sndPlaySound函数来播放一个WAV文件,而这个函数是在mmsystem单元中声明的,因此,你需要在Uses 部分加入mmsystem,记得在加入在分号之前,与其他单元用逗号隔开。
加入到Uses单元的顺序一般是无关紧要的,但是有的单元如ShareMem单元必须放在第一个。
最后强调一点,就是如果Interface 部分同时有这几个部分,一定要按照单元引用、常量声明、类型声明、变量声明、过程和函数的顺序排列。
3:Implementation部分
Implementation部分分为两大块,一块是声明部分,包括单元引用、常量、类型、变量、过程和函数的声明,这一点跟Interface部分相似,所不同的是,在Implementation部分声明的单元引用、常量、类型、变量、过程和函数只对本单元是公共的、可见的,其它单元即使引用了该单元,也不能访问它们。另一个不同点是,在Implementation部分声明的过程和函数,不需要遵循先声明后定义的规则,而只要直接写出过程或函数的定义。
Implementation部分的另一大块是在Interface部分声明的过程和函数的定义,程序示例如下:
Unit Unit1;
Interface
Uses Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Diglogs;
Type
Tform1=Class(Tform)
Procedure FormCreate(Sender:Tobject);
Private
Public
End;
Var
Form1:Tform1;
Implementation
{$R *.DFM}
Procedure Beep;
Begin
MessageBeep();
End;
Procedure Tform1.FormCreate(Sender:Tobject);
Begin
Beep;
End;
End.
4:Initialization部分
单元中可以有Initialization部分,这个部分也称为初始化部分,用于对该单元进行初始化。例如给变量赋初值,分配资源等,不过一般很少用到。
Initialization部分由保留字Initialization加一些语句构成,语句可以是单个语句,也可以是复合语句,如果是复合语句,应当用Begin和End括起来。
如果有多个单元含有Initialization部分,它们的执行顺序和这些单元在Program单元的Uses 部分出现的顺序是一致的。
5:Finalization部分
如果单元有Initialization 部分,这个单元才能有Finalization,终止部分的语法和初始化的部分是相似的,是由保留字Fnialization加一些语句构成的,语句可以是单个语句,也可以是复合语句,如果是复合语句,应当用Begin和End括起来。
如果有多个单元含有Finalization部分,它们的执行顺序跟Initialization执行的顺序正好相反。
注意:Finalization部分的代码应当能考虑到这样一种情况,就是单元的Initialization部分在执行过程中可能会被意外终止,也就是说可能会出现这么一种情况,就是有些指针的值是nil,那么在相应地终止,应当避免出现对这些指针的引用。
Delphi 程序结构的更多相关文章
- Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
Delphi程序调用C#.Net编译的DLL并打开窗体(详解)最近用C#.Net写了一个公用模块, 本以为仅提供给.Net程序使用, 但是领导要求把这些功能提供给旧系统使用, 天啦, 几套旧系统全是D ...
- 谈谈.net模块依赖关系及程序结构
技术为解决问题而生. 上面这个命题并非本文重点,我将来有空再谈这个.本文也并非什么了不起的技术创新,只是分享一下我对.net模块依赖关系及程序结构方面的一些看法.先看一个最最简单的hello worl ...
- 【C语言入门教程】1.1 基本程序结构
基本程序结构就是从上至下顺序执行的程序,C语言程序必须有且只有一个主函数,程序从主函数开始执行,直到主函数结束.下例是根据半径求圆形面积的程序源代码. #include <stdio.h> ...
- 一名Delphi程序员的开发习惯
一名Delphi程序员的开发习惯 有关开发习惯的一些想法,如鲠在喉,不吐不快.究其发贴动机,当然不排除有骗取参与分的可能,但另一方面,也希望能给同行(念Xing)者提供一些 建议,或者参考(希望不是误 ...
- Fastreport使用经验(转)在Delphi程序中访问报表对象
Fastreport使用经验(转) 在Delphi程序中访问报表对象 最基本的方法就是frxReport1.FindObject. 然后把返回的对象强制转换成它的类型,当然,在报表中必须真的有这么个东 ...
- C++程序结构---1
C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...
- delphi 程序全屏显示无标题栏,覆盖整个屏幕
delphi 程序全屏显示无标题栏,覆盖整个屏幕,这个在做工控机或屏保时有用的,所以记下 procedure TMainFrm.FormCreate(Sender: TObject); begin w ...
- ASP.NET MVC掉过的坑_MVC初识及MVC应用程序结构
APS.Net MVC 浅谈[转] 来自MSDN 点击访问 MVC 理论结构 模型-视图-控制器 (MVC) 体系结构模式将应用程序分成三个主要组件:模型.视图和控制器. ASP.NET MVC 框架 ...
- MFC单文档程序结构
MFC单文档程序结构三方面: Doc MainFrame View
随机推荐
- android 6.0权限处理
在模拟器测试好的程序,运行在mate8上面一直崩,经多方查探才找到以下博文,方法还没掌握,但也算是找到原因了: http://***/article/android-6-0-runtime-permi ...
- [C++]C++标准里 string和wstring
typedef basic_string<char> string; typedef basic_string<wchar_t> wstring; 前者string是常用类型, ...
- MultiSelectComboBox(一)
1. MultiSelectComboBox.xaml <UserControl x:Class="MultiSelectComboBox.MultiSelectComboBox&qu ...
- Linux高级变量
http://blog.chinaunix.net/uid-27040051-id-3450991.html 高级变量 基本形式 [1].变量扩展 格式 ${变量名称} [2].命令扩展 格式 $(命 ...
- LInux ugo权限详解[修]
Linux 中的用户和组是用来控制使用者或者进程可以或者不可以使用哪些资源和硬件,是Linux权限控制最基本的方式. 用户和组可以看一下上一章的部分,先来看一下权限. 一.权限概览 在Linux下,使 ...
- 2016年11月1日 星期二 --出埃及记 Exodus 19:17
2016年11月1日 星期二 --出埃及记 Exodus 19:17 Then Moses led the people out of the camp to meet with God, and t ...
- Nginx架构的企业级应用
Nginx架构的企业级应用 ==================================================== 实现HA高可用集群 实现LB负载均衡集群 Nginx实现反向代理 ...
- 使用JavaScript操作DOM节点元素的常用方法(创建/删除/替换/复制等)
getElementById(id)这是通过id来访问某一元素,最常用的之一,例:<html><body><div id="myid">test ...
- SSL/TLS 原理详解
本文大部分整理自网络,相关文章请见文后参考. SSL/TLS作为一种互联网安全加密技术,原理较为复杂,枯燥而无味,我也是试图理解之后重新整理,尽量做到层次清晰.正文开始. 1. SSL/TLS概览 1 ...
- C++实现有向权图的基本操作,界面友好,操作方便,运行流畅
Ⅰ.功能: .创建图 .展示全图 .添加顶点 .添加边 .删除顶点 .删除边 .查看指定边权值 .修改指定边权值 .输出两点间的所有简单路及路径对应权值 .销毁图 ps:关于9,如果不存在任何简单路, ...