单元(unit)是组成Pascal 程序的单独的源代码模块,单元由函数和过程组成,这些函数和过程能被主程序调用。

一个标准的单元文件格式如下:

unit Unit1; //单元头

interface

uses { 单元列表 } //公有

{接口部分}        //公有

implementation

uses {单元列表}   //私有

{实现部分 }       //私有

initialization

{初始化部分}

finalization

{结束部分}

end

一个单元至少要由以下三部分组成:.

一个unit 语句,每一个单元都必须在开头有这样一条语句,以标识单元的名称,单元的名称必须和文件名相匹配。例如,如果有一个文件名为A1,则unit 语句可能是:

unit A1

interface 部分,在unit 语句后的源代码必须是interface 语句。在这条语句和implementation 语句之间是能被程序和其它单元所共享的信息。一个单元的interface 部分是声明类型、常量、变量、过程和函数的地方,这些都能被主程序和其它单元调用。这里只能有

声明,而不能有过程体和函数体。interface 语句应当只有一个单词且在一行:

Interface

Interface部分又分为多个可选部分,包括单元引用部分(uses)、类型声明部分(type)、常量声明部分(const)、变量声明部分(var)以及过程和函数声明部分(function 和 procedure)。

其程序示例如下:

unit Unit1;

interface

uses                          //单元引用部分

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;

type                          //类型声明部分

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Button3: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

const                          //常量声明部分

PI=3.1415926;

var                            //变量声明部分

Form1: TForm1;

X: integer;

Function Mytest(X:string):String;stdcall;external 'test_dll.dll';                //过程和函数声明部分

implementation

{$R *.dfm}

implementation 部分,它在interface 部分的后面。Implementation部分又分为两部分:一部分是声明部分,另一部分是对于在Interface部分中声明过的程序和函数的定义。

声明部分包括单元、常量、数据类型、变量、过程和函数的 声明,这与interface部分相类似,所不同的是在implementation部分声明的单元、常量、数据类型、变量、过程和函数只对本单元而言是 公用的和可见的,其他单元如果要引用该单元的话是不能访问它们的。而在implementation部分生命的过程和函数不需要遵循先声明后定义的规则, 可以直接写出过程和函数的定义。

implementation 语句只有一个单词并且在一行上:

implementation

一个单元能可选地包含其它两个部分:

initialization 部分,在单元中它放在文件结尾前,它包含了用来初始化单元的代码,它在主程序运行前运行并只运行一次。

finalization 部分,在单元中它放在initialization 和end 之间。

注意如果几个单元都有initialization/finalization 部分,则它们的执行顺序与单元在主程序的users 子句中的出现顺序一致。不要使initialization/finalization 部分的代码依赖于它们的执行顺序,因为这样的话主程序的uses 子句只要有小小的修改,就会导致程序无法通过编译。

1.uses 子句

users 子句在一个程序或单元中用来列出想要包含进来的单元。例如,如果有一个程序名为FooProg,它要用到在两个单元UnitA 和UnitB 中的函数和类型,正确的uses 声明应该这样:

Program FooProg;

uses UnitA,UnitB;

单元能有两个uses 子句,一个在interface 部分,一个在implementation 部分。这里有一个例子:

Unit FooBar

Interface

Uses BarFoo;

{在这里进行全局声明 }

implementation

uses BarFly;

{在这里进行局部声明 }

initiallization

{在这里进行单元初始化 }

finalization

{在这里进行退出操作 }

end.

2.循环单元引用

读者也许经常会碰到这样的情况,在UnitA 中调用UnitB 并在UnitB 中调用UnitA,这称为循环单元引用。循环单元引用的出现表明了程序设计有缺陷,应该在程序中避免使用循环单元引用。比较好的解决方法是把UnitA 和UnitB 共有的代码移到第三个单元中。然而,有时确实需要用到循环单元引用,这时就必须把一个uses 子句移到implementation 部分,而把另一个留在interface 部分,这样就能解决问题。

Delphi库单元结构的更多相关文章

  1. Delphi 中的结构体与结构体指针

    好多程序都给结构体变量设定了一个结构体指针 例如: PAbc = ^TAbc; TAbc = record a: string[10]; b: string[5]; c: string[1]; end ...

  2. linux mysql-workbench 创建与正式库表结构一样的表

    先在本地创建数据库 字符集选择这个 创建数据库成功 创建与正式库一样的表 step1: 连接正式库,找到要生成的表,导出创建表的sql语句 step2: 找到本地数据库,选择表,在sql执行区域复制s ...

  3. Delphi BASE64单元EncdDecd的修改

    Delphi BASE64单元EncdDecd的修改 EncdDecd.pas两个函数声明: procedure EncodeStream(Input, Output: TStream);proced ...

  4. Delphi 跨单元进入(访问)类的私有成员,protected ,private部分

    http://blog.sina.com.cn/s/blog_5f8861b60102v1nl.html Delphi 跨单元进入(访问)类的私有成员,protected ,private部分 (20 ...

  5. Git-仓库基本结构

    三 Git 仓库      1.1Git 基本概念    在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过 ...

  6. 使用C++/C qsort 标准库对结构体进行快速排序

    C++标准快速排序库qsort进行结构体快速排序 代码如下 #include <stdio.h> #include <stdlib.h> typedef struct { in ...

  7. Delphi 记录类型- 结构指针

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  8. STORM_0008_Structure-of-the-codebase_Storm的代码库的结构

    http://storm.apache.org/releases/1.0.1/Structure-of-the-codebase.html Structure of the codebase 源码分成 ...

  9. 对比库表结构,生成SQL

    网上找了一圈对比库的工具,能手工生成差别的SQL的工具没有,改造了一下网上的sql 1, 获取字段名的类型 create FUNCTION [dbo].[getColType](@tab varcha ...

  10. [sql] 同库表(结构)的备份和sql聚合&navicat使用

    同库表的备份-赋值表结构和数据SQL语句 参考 有时候我们处理某个表时,需要先备份下这个表到当前这个库,然后再执行sql. 站在sql角度,就无需在mysqldump或者诸如导出sql的方式来备份了. ...

随机推荐

  1. 微信小程序图片展示类型

  2. P5723 注意特殊情况

    https://www.luogu.com.cn/problem/P5723 不是难题,但是倘若忽略L<2的情况就无法AC,Lougu得分只有80.因此写完题后一定要把各种边界性质的数据想出并用 ...

  3. 第七届蓝桥杯大赛个人赛省赛(软件类)B组

    3.凑算式     B      DEFA + --- + ------- = 10     C      GHI     (如果显示有问题,可以参见[图1.jpg])   这个算式中A~I代表1~9 ...

  4. Liunx快捷命令(别名)与快捷方式(软/硬链接)

    一.快捷命令(别名)-临时生效1.命令:alias 别名='原命令' 2.举例:给检查防火墙的命令设置别名 [root@localhost ~]# alias fhq='firewall-cmd -- ...

  5. Java之利用openCsv导出csv文件

    当时导入的时候用的openCsv,那么导出的时候自然也是用这个,查了好多资料才找到解决方案,下面记录一下实现过程. 1.Controller层: /** * 导出csv文件 */ @RequestMa ...

  6. 【译】Visual Studio 2013 退役 :旧版本 Visual Studio 的支持提醒

    新年到了,也是提醒我们 Visual Studio 支持生命周期中即将到来的日期的好时机.对 Visual Studio 2013 的支持将于今年4月9日结束.如果您使用的是旧版本的Visual St ...

  7. vue3 路由页面返回时,恢复滚动条位置

    首先,路由必须是KeepAlive模式 <script setup lang="ts"> import { onActivated } from "vue&q ...

  8. 【OpenVINO】基于 OpenVINO C# API 部署 RT-DETR 模型

      RT-DETR是在DETR模型基础上进行改进的,一种基于 DETR 架构的实时端到端检测器,它通过使用一系列新的技术和算法,实现了更高效的训练和推理,在前文我们发表了<基于 OpenVINO ...

  9. [转帖]idea配置tomcat参数,防止nvarchar保存韩文、俄文、日文等乱码

    描述下我的场景: 数据库服务器在远程机器上,数据库使用的Oracle,字符集是ZHS16GBK,但保存韩文.俄文.日文等字段A的数据类型是nvarchar(120),而nvarchar使用的是Unic ...

  10. [转帖]win10多网卡指定ip走某个网卡的方案

    https://zhuanlan.zhihu.com/p/571614314 我的电脑上有两个网卡,一个网卡A(网线),一个是网卡B(WIFI). 需求:网卡A和网卡B是不同的网络,网卡A已经把338 ...