Delphi库单元结构
单元(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库单元结构的更多相关文章
- Delphi 中的结构体与结构体指针
好多程序都给结构体变量设定了一个结构体指针 例如: PAbc = ^TAbc; TAbc = record a: string[10]; b: string[5]; c: string[1]; end ...
- linux mysql-workbench 创建与正式库表结构一样的表
先在本地创建数据库 字符集选择这个 创建数据库成功 创建与正式库一样的表 step1: 连接正式库,找到要生成的表,导出创建表的sql语句 step2: 找到本地数据库,选择表,在sql执行区域复制s ...
- Delphi BASE64单元EncdDecd的修改
Delphi BASE64单元EncdDecd的修改 EncdDecd.pas两个函数声明: procedure EncodeStream(Input, Output: TStream);proced ...
- Delphi 跨单元进入(访问)类的私有成员,protected ,private部分
http://blog.sina.com.cn/s/blog_5f8861b60102v1nl.html Delphi 跨单元进入(访问)类的私有成员,protected ,private部分 (20 ...
- Git-仓库基本结构
三 Git 仓库 1.1Git 基本概念 在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过 ...
- 使用C++/C qsort 标准库对结构体进行快速排序
C++标准快速排序库qsort进行结构体快速排序 代码如下 #include <stdio.h> #include <stdlib.h> typedef struct { in ...
- Delphi 记录类型- 结构指针
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- STORM_0008_Structure-of-the-codebase_Storm的代码库的结构
http://storm.apache.org/releases/1.0.1/Structure-of-the-codebase.html Structure of the codebase 源码分成 ...
- 对比库表结构,生成SQL
网上找了一圈对比库的工具,能手工生成差别的SQL的工具没有,改造了一下网上的sql 1, 获取字段名的类型 create FUNCTION [dbo].[getColType](@tab varcha ...
- [sql] 同库表(结构)的备份和sql聚合&navicat使用
同库表的备份-赋值表结构和数据SQL语句 参考 有时候我们处理某个表时,需要先备份下这个表到当前这个库,然后再执行sql. 站在sql角度,就无需在mysqldump或者诸如导出sql的方式来备份了. ...
随机推荐
- d3过滤
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- 从输入URL后浏览器的渲染逻辑
从输入URL到浏览器渲染页面需要经过很多过程,本文简单说明下各个环节的内容 主要渲染节点如下: 一.浏览器进程说明 出于安全考虑,打开一个浏览器的Tab页签,会生成1个浏览器主进程.1个网络进程.1个 ...
- 京东App秒杀抢购流程接口分析(基于pypp技术)
App数据抓包必需工具 必需工具:小米手机,Charles,HttpCanary 从2022年2月后,京东只限于从app发起抢购,所以,网上的很多工具已经无效了.只能分析app端的底层协议和流程. g ...
- SV 数据类型-3
联合数组 在内存中分配的空间可以是不连续的 联合数组方法 数组的方法 数组使用推荐 结构体 枚举类型 字符串变量类型String 操作符
- 【转】国产飞腾D2000:基于A72?
https://zhuanlan.zhihu.com/p/612054128 China's Phytium D2000: Building on A72? 国产飞腾D2000:基于A72? PS:麒 ...
- ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes
ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes 背景 duckdb 是一个很流行的单机版数据库引擎 同事下载了相关的预 ...
- [转帖]oracle数据库中RMAN备份格式化format解释
格式化解释: 使用格式串 更改格式命令: RMAN> configure channel device type disk format ' E:\app\Administrator\db_ba ...
- [转帖]线上一个隐匿 Bug 的复盘
前言 之前负责的一个项目上线好久了,最近突然爆出一 Bug,最后评估影响范围将 Bug 升级成了故障,只因为影响的数据量有 10000 条左右,对业务方造成了一定的影响. 但因为不涉及到资金损失,Bu ...
- 虚拟化平台IO劣化分析
虚拟化平台IO劣化分析 背景 最近同事让帮忙做几个虚拟机进行性能测试. 本来应该搭建CentOS/Winodws平台进行相关的测试工作. 但是为了环境一致性, 使用了ESXi6.7 进行虚拟化 然后这 ...
- [转帖]Sar的一次使用案例
https://www.jianshu.com/p/b93342d43e13 问题现象 有一台机器,在某个时间点OS类似无响应,造成使用者感觉在该时间点机器应该发生重启,就此问题进行分析. 日志查看 ...