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的方式来备份了. ...
随机推荐
- Linux一键安装docker脚本,含ubuntu和centos
将脚本保存为docker_install.sh,可以上传git,到服务器中,git clone下来后,sh docker_install.sh即可自动安装 ubuntu实现 # 以Ubuntu为例 # ...
- 强烈建议收藏,python库大全
Python常用库大全及简要说明 本文为大家罗列了Python开发的常用库和各个库的简要说明以及Python开发工具,包管理,环境管理等其它常用资源和Python学习资料.本文只罗列了一部分,完整内容 ...
- Liunx运维(一)-命令行
一.命令行的开启与推出 1.exit 2.logout 3.ctrl+d 二.命令行提示符 1.#root用户 2.$普通用户 3.~当前用户所在的路径 4.全局配置文件: /etc/profil ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.03)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.21)
百度网盘会员账号共享(11.21更新) 账号:tgc91660 密码:6858hykh 账号:ofj51327 密码:rvzp3251 账号:5799osrb 密码:862lwtr 账号:3730sw ...
- [转帖] q命令-用SQL分析文本文件
https://www.cnblogs.com/codelogs/p/16060830.html 简介# 在Linux上分析文本文件时,一般会使用到grep.sed.awk.sort.uniq等命令, ...
- [转帖]linux 批量修改文件格式
将Windows上的shell脚本拷贝到Linux时,脚本的编码格式还是docs,需要改成unix才可执行,在文件不多的情况下可以直接手动更改,但是在脚本文件比较多的时候,手动改起来就太麻烦了,此时就 ...
- Ergonomics JVM 的一种FullGC的说明
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/ergonomics.html 2 Ergonomics Ergo ...
- [转帖]深入理解Redis的scan命令
熟悉Redis的人都知道,它是单线程的.因此在使用一些时间复杂度为O(N)的命令时要非常谨慎.可能一不小心就会阻塞进程,导致Redis出现卡顿. 有时,我们需要针对符合条件的一部分命令进行操作,比如删 ...
- vCenter 6.7 使用Grafana监控失败的处理
背景 国庆处理的vCenter监控. 老的vCenter6.0的平台很正常. 但是新的vCenter 6.7 就经常出现断连的情况. 花费了快一个多小时才搞定, 这里记录一下. 问题现象 vCente ...