概要介绍:
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部分称为接口部分,用于声明引用的、常量、类型、变量、过程和函数,单元的Implementa-tion部分(实现部分)也可以声明引用的单元、常量、类型、变量、那么这两者有什么区别呢?

在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(0);

而不需要这么写:
    Windows.MessageBeep(0);

尽管这个例程是在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(0);
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架构的更多相关文章

  1. Delphi XE5 常见问题解答

    Delphi XE5 常见问题解答 有关于新即时试用的问题吗?请看看 RAD Studio 即时试用常见问答. 常见问题 什么是 Delphi? Embarcadero? Delphi? XE5 是易 ...

  2. Delphi之萝莉调教篇

    本文纯属技术交流.如果各位看官想与小生一起探讨萝莉的问题的话...PM我吧 关于Delphi的萝莉调教技术,很久以前就有大牛做过了...其实技术早掌握了只是觉得太无聊~估计大家也都会于是就没有写~既然 ...

  3. C#和.NET Framework简介

    注:本文大部分借鉴了<果壳中的C#5.0权威指南>,小编也想根据这本书好好梳理一下C#. 序言:C#是一种通用的类型安全且面向对象的编程语言.这种语言的目标是提高程序员的生产力,为此,需要 ...

  4. Delphi三层网络架构代码实现

    Delphi三层网络架构代码实现 1 .三层网络的概念 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为: 表现层(UI).业务逻辑层(BLL).数据访 ...

  5. Delphi数据库的三层架构的问题和解决方法

    Delphi数据库的三层架构的问题和解决方法 原创 2014年03月26日 16:26:03 标签: Delphi / 数据库三层架构 / DCOM / DCOMConnection 790 //-- ...

  6. delphi 三层架构简单例子(经测试成功)

    delphi 三层架构简单例子(经测试成功) 转载 2013年12月19日 09:48:57 1100 所谓三层: (1) 客户端 (2) 服务器端 (3) 数据库 在数据访问时,使得客户端必须通过服 ...

  7. delphi三层架构

    我们的delphi程序很多是以前开发的,采用典型的CS架构,由程序直接连接数据库.现在需要改成在外网可以直接操作软件.先把数据库搬到了阿里云上,测试发现直接连数据库和VPN连接测试速度很慢,直连还容易 ...

  8. delphi三层架构(使用SATRDA改造,客户端代码不变)

    我们的delphi程序很多是以前开发的,采用典型的CS架构,由程序直接连接数据库.现在需要改成在外网可以直接操作软件.先把数据库搬到了阿里云上,测试发现直接连数据库和VPN连接测试速度很慢,直连还容易 ...

  9. Delphi - 手把手教你基于D7+Access常用管理系统架构的设计与实现 (更新中)

    前言 从事软件开发工作好多年了,学的越深入越觉得自己无知,所以还是要对知识保持敬畏之心,活到老,学到老! 健身和代码一样都不能少,身体是革命的本钱,特别是我们这种高危工种,所以小伙伴们运动起来!有没有 ...

随机推荐

  1. 学习 Spring (十二) AOP 基本概念及特点

    Spring入门篇 学习笔记 AOP: Aspect Oriented Programming, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 主要功能是:日志记录.性能统计.安全控 ...

  2. 【C/C++】查找(一):静态查找表

    {静态查找表 + 动态查找表} 所谓动态,就是,找的时候没有则添加,或者能删除 关键字:primary key:用来表示查找表中的一条记录 {主关键字 + 次关键字} 主关键字是唯一的,用来唯一的标识 ...

  3. kubernetes 编排详解 资源分配

    ########给pod 分配cpu和内存资源apiVersion: v1 kind: Pod metadata: name: frontend spec: containers: - name: d ...

  4. BZOJ5419[Noi2018]情报中心——线段树合并+虚树+树形DP

    题目链接: [NOI2018]情报中心 题目大意:给出一棵n个节点的树,边有非负边权,并给出m条链,对于每条链有一个代价,要求选出两条有公共边的链使两条链的并的边权和-两条链的代价和最大. 花了一天的 ...

  5. 提高SqlServer数据库的安全性,禁用掉sa账户

    Sqlsever 数据库有两种登陆身份验证模式,一种是windows身份验证:一种是sqlserver 账户验证模式,在sqlserver 账户验证模式中,sa账户是大家所熟知的,并且sa也是内置的默 ...

  6. P1091 合唱队形 最长上升子序列

    思路:最长上升子序列 正着做一遍 倒着做一遍 然后 取最大值 #include<bits/stdc++.h> using namespace std; const int maxn=105 ...

  7. 数据分析---用pandas进行数据清洗(Data Analysis Pandas Data Munging/Wrangling)

    这里利用ben的项目(https://github.com/ben519/DataWrangling/blob/master/Python/README.md),在此基础上增添了一些内容,来演示数据清 ...

  8. 【XSY2708】hack 网络流

    题目描述 给你一个图,每条边有一个权值.要求你选一些边,满足对于每条从\(1\)到\(n\)的路径上(可以不是简单路径)有且仅有一条被选中的边.问你选择的边的边权和最小值. \(n\leq 100\) ...

  9. 如何判断是否为同一个App,Ionic3如何修改包名

    如何判断是否同一个App 使用Ionic3创建了两个项目demo1.demo2,然后使用同一个JDK,生成了两个不同的keystore证书. 结果在手机端安装的时候,先安装demo1,没有任何替换的提 ...

  10. [HNOI2008]玩具装箱TOY(斜率优化)

    题目链接 题意:有编号为\(1\cdots N\)的N件玩具,第 i 件玩具经过压缩后变成一维长度为 \(C_i\)​ .要求在一个容器中的玩具编号是连续的,同时如果将第 i 件玩具到第 j 个玩具放 ...