单元(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. 【驱动】串口驱动分析(三)-serial driver

    简介 前两节我们介绍串口驱动的框架和tty core部分.这节我们介绍和硬件紧密相关的串口驱动部分. UART驱动部分依赖于硬件平台,而TTY驱动和具体的平台无关.虽然UART部分依赖于平台,但是不管 ...

  2. 实现不限层级的Element的NavMenu

    做管理后台开发的时候,需要用到Element的NavMenu组件,于是乎,翻开文档,大致是这样实现的. <el-menu> <el-menu-item index="1&q ...

  3. C# 通过ServiceStack 操作Redis——Hash类型的使用及示例

    接着上一篇,下面转到hash类型的代码使用 Hash:结构 key-key-value,通过索引快速定位到指定元素的,可直接修改某个字段 /// <summary> /// Hash:类似 ...

  4. 让vs支持wsl调试

    WSL安装 wsl --install -d Ubuntu 等一会提示输入用户名,不用管它,直接关闭,下次打开wsl,会以无密码的root用户打开 wsl卸载 wsl --unregister Ubu ...

  5. 单元测试中如何Mock HttpContext

    最近团队有小伙伴问在单元测试中如何Mock HttpContext. 这是一个好问题,整理了一个实现方案分享给大家. 在C#中,尤其是在单元测试场景下,模拟(Mocking)HttpContext 是 ...

  6. [转帖]Kubernetes 1.23:IPv4/IPv6 双协议栈网络达到 GA

    https://kubernetes.io/zh-cn/blog/2021/12/08/dual-stack-networking-ga/#:~:text=Kubernetes%201.23%EF%B ...

  7. [转帖]使用systemd-analyze 工具来分析各个服务进程的启动性能

    https://www.cnblogs.com/xingmuxin/p/11413784.html systemd-analyze是一个分析启动性能的工具,用于分析启动时服务时间消耗.默认显示启动是内 ...

  8. [转帖]TiDB 最佳实践

    https://docs.pingcap.com/zh/tidb/stable/tidb-best-practices 本文档总结使用 TiDB 时的一些最佳实践,主要涉及 SQL 使用和 OLAP/ ...

  9. [转帖]Linux kernel内存管理之overcommit相关参数

    前言 了解 linux kernel内存管理,首先可以从用户空间的角度来看kernel的内存管理,执行ls /proc/sys/vm的命令,就可以看到vm运行的所有参数,其中就包含了跟overcomm ...

  10. unzip 解压缩存在Bug-- 这个方法不行啊

    linux中解压大于4G的zip压缩包(已解决) tar -zxvf 压缩包名.zip