Delphi 4 开发指南 —— 编码标准文档

Delphi 4 开发指南 —— 编码标准文档 
版权所有 ?1998 Xavier Pacheco 及 Steve Teixeira

翻译 2000 李颖(e.w@263.net)

Delphi 4 开发指南主页
导言

一般源代码格式规范 

缩进
页宽
Begin..End 对 

Object Pascal 语言


括号
保留字和关键字
过程和函数 (子程序)
变量 
结构类型

数组类型
记录类型 

语句 

if 语句
case 语句 
while 语句
for 语句
repeat 语句
with 语句 

结构化的意外处理 

概要
try..finally 的使用
try..except 的使用
try..except..else 的使用 

类(Classes) 

域(Fields)
方法(Methods) 

静态方法(Static Methods)的使用
虚/动态方法(Virtual/Dynamic Methods)的使用
抽象方法(Abstract Methods)的使用
属性访问方法(Property Access Methods) 

属性(Properties) 

命名规则
访问方法的使用 

文件 

工程(Project)文件
窗体(Form)文件
数据模块(Data Module)文件
远程数据模块(Remote Data Module)文件
单元(Unit)文件
一般单元结构

单元名称
Uses 子句
Interface 部分
Implementation 部分
Initialization 部分
Finalization 部分 

窗体单元
数据模块单元
一般用途单元
组件(Component)单元
文件头


窗体和数据模块 

窗体
窗体类型命名标准
窗体实例命名标准
自动创建窗体
模式化(Modal)窗体实例函数
数据模块
数据模块命名规则
数据模块实例命名规则

包(Packages) 

运行期(Runtime)和设计期(Design)包的使用
文件命名规则

组件(Components) 

用户自定义组件
组件单元
注册(Registration)单元的使用
组件实例命名约定
组件前缀
Standard 页面
Additional 页面
Win32 页面
System 页面
Internet 页面
Data Access 页面
Data Controls 页面
Decision Cube 页面
QReport 页面
Dialogs 页面
Win31 页面
Samples 页面
ActiveX 页面
Midas 页面


导言 
本文档将描述 Delphi 4 开发指南 中使用的Delphi程序代码书写规范. 一般情况
下, 本文档遵循 Borland 公司"未明确说明"的编码格式规范, 少数情况下也有例
外. 在 Delphi 4 开发指南 中包括本文档是为了向读者介绍一种在合作开发中保
持代码风格一致的方法. 目的是为了保证开发队伍中的所有程序员都能够理解其
他人编写的代码. 实现这一目的的方法是通过保持代码的一致性来增强其可性.


本文档无法包罗万象, 因此可能对于你不够详细. 你可以使用并修改这些标准以
适应你自己的需要. 但我们仍建议你不要与 Borland 开发组使用的标准偏离得太
多. 我们提出这些建议, 是因为当你的开发队伍中加入新程序员时, 他们最熟悉
的很可能就是 Borland 标准. 和大多数编码规范文档一样, 本文档将根据需要继
续更新. 因此, 你可以在 www.xapware.com/ddg 在线得到最新版本. 本文档不会
包括 用户界面标准. 这是一个不同的但同样重要的主题. 大量的第三方书籍和
Microsoft 文档都包括了这些指南, 因此我们决定不再重复这些信息, 而是将你
指引到 Microsoft Developers Network 和其他信息来源. 

一般编码格式规范

缩进

缩进应该是每行2个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管
理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度. 

你可以禁止保存Tab字符, 方法是通过 Tools | Environment 菜单打开 Environ
ment Options 对话框, 然后在 Editor 页中关闭 "Use tab character" 和 "Op
timal fill" 选项. 

页宽

页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示,
但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一
个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进2个字符.

Begin..End 对

begin 语句应该单独作为一行. 例如, 下面的第1行是错误的, 第2行是正确的:


for I := 0 to 10 do begin // 错误, begin 和 for 在同一行

for I := 0 to 10 do       // 正确, begin 单独作为一行
begin


当 begin 作为 else 子句的一部分时例外, 比如: 

if some statement = then
begin
  ...
end
else begin
  SomeOtherStatement;
end;

end 语句永远单独作为一行.

如果 begin 语句不是 else 子句的一部分, 相应的 end 语句应该缩进到与 beg
in 对齐的位置.

Object Pascal 语言

括号

左括号和后一个字符之间不应该出现空格, 同样, 右括号和前一个字符之间也不
应该出现空格. 下面的例子说明括号和空格的错误及正确使用:

CallProc( AParameter ); // 错误
CallProc(AParameter);   // 正确

不要在语句中使用无意义的括号. 括号只应该为达到某种目的而出现在源代码中
. 下面的例子说明错误和正确的用法:

if (I = 42) then             // 错误 - 括号毫无意义
if (I = 42) or (J = 42) then // 正确 - 的确需要括号 

保留字和关键字

Object Pascal 语言保留字和关键字应该完全小写. 

过程和函数(子程序)

命名规则

子程序名应该以大写字母开头, 而且应该易于阅读. 下面是一个正确格式的子程
序名:

procedure thisisapoorlyformattedroutinename;

下面是一个首字母适当大写的子程序名:

procedure ThisIsMuchMoreReadableRoutineName;

子程序名应该具有与其用途相关的含义. 导致发生某动作的子程序应该以动词为
前缀命名, 例如:

procedure FormatHardDrive;

为输入参数赋值的子程序应该以 Set 为前缀命名,例如:

procedure SetUserName;

取回数值的子程序应该以 Get 为前缀命名, 例如:

function GetUserName: string;

形参(Formal Parameters) 

格式

在可能的情况下, 同类型的形参应该在一条语句中说明:

procedure Foo(Param1, Param2, Param3: Integer; Param4: string);

命名

所有的形参名称应该具有与其用途相关的含义, 而且不应该基于传递到子程序的
标识符名称. 适当情况下, 参数名应该以字符 A 为前缀, 例如,

procedure SomeProc(AUserName: string; AUserAge: integer);

使用前缀 "A" 是一种约定, 以便参数名与类的属性名、域名重复时消除歧义.

参数顺序

下面的形参顺序主要是为在寄存器模式下得到更高的性能, 寄存器模式是惯用的
调用模式. 

调用者最常使用的参数应该在参数的最前位置, 使用越少的参数, 其位置应该越
在右面. 

输入参数队列应该在输出参数队列的左面. 

最抽象参数应该在最精确参数的左面, 例如: SomeProc(APlanet, AContinent,
ACountry, AState, ACity). 

参数顺序规则也可能出现例外情况, 比如事件响应程序(event handlers), 名为
 Sender 的 TObject 类型参数通常作为第一个参数. 

常数参数(Constant Parameters)

当 记录, 数组, ShortString, 或 接口(interface)类型参数在子程序中不被修
改, 则相应的形参应该标识为 Const. 这将确保编译器产生最高效的代码来传递
这些不被修改的.

其他类型的参数如果在子程序中不被修改, 也可以标识为 Const. 虽然不能提高
效率, 但至少为子程序的调用者提供了更多关于参数使用的信息.

命名冲突

如果引用的2个单元中包含同名子程序, 则实际调用的将是在 uses 子句中位置最
后的单元中的子程序. 为了避免这种与 uses 子句相关的语意不明(uses-clause
-dependent ambiguities), 应该用单元名作为前缀来指明所调用的子程序, 例如
:

SysUtils.FindClose(SR);

Windows.FindClose(Handle); 

变量

变量命名和格式

变量名称应该具有与其用途相关的含义.

循环控制变量可以命名为单个字母, 比如 I, J, 或 K. 也可以是更有意义的名称
, 比如 UserIndex.

Boolean 变量名称必须描述得足够详细, 保证其 True 和 False 取值具有清楚的
含义.

局部变量

在过程内使用的局部变量与其他变量一样, 遵循相同的用法和命名约定. 临时变
量应该适当地命名.

如果必要, 局部变量的初始化应该在子程序入口处立即进行. AnsiString 变量自
动初始化为空字符串, interface 和 dispinterface 类型变量自动初始化为 ni
l, Variant 和 OleVariant 类型变量自动初始化为 Unassigned.

全局变量的使用

使用全局变量不是好习惯, 但也有可能必须使用全局变量. 如果是这样, 建议你
尽量保持全部变量在它可用的范围内与上下文相关. 例如, 一个全局变量可能只
在某个单元的 implementation 部分可用. 

打算供几个单元公用的全局数据应该移到一个公用单元中. 

全局数据可以在 var 部分用一个值立即初始化. 注意, 所有的全局数据初始状态
下都自动归零, 因此不要将全局变量初始化为"空"值, 比如 0, nil, '', Unass
igned 等等. 全局数据自动归零的原因之一是因为初始状态为0的全局数据在 ex
e 文件中不占据空间. 初始状态为0的数据将存储在一个"虚"数据段中, 这个数据
库只在应用程序启动时从内存中分配. 初始状态非0的全局数据则必须在磁盘上的
 exe 文件中占据空间. 

类型

大写约定

类型名称如果是保留字, 则必须完全小写. Win32 API 类型一般完全大写, 你应
该遵循 Windows.pas 和其他 API 单元中某些类型名称的约定. 其他变量名称,
首字母应该大写, 其余部分也应该足够清楚. 下面是几个例子:

var
  MyString: string;   // 保留字
  WindowHandle: HWND; // Win32 API 类型
  I: Integer;         // 在 System 单元中引入的类型标识符

浮点(Floating Point)类型

使用 Real 类型是不好的, 因为它仅仅是为了与旧的 Pascal 代码保持向后兼容
而保留的. 对于一般的浮点运算应该使用 Double 类型. Double 是 IEEE 定义的
标准数据格式, 处理器指令以及系统总线都为处理 Double 类型而进行过优化.
Extended 类型应该只在需要比 Double 更大的数据范围时使用. Extended 是 I
ntel 指定类型, Java 不支持. Single 类型应该只在浮点变量本身占用的字节大
小很重要的情况下使用, 比如使用其他语言编写的 DLL 时. 

枚举(Enumerated)类型

枚举类型名称应该具有与其用途相关的含义. 类型名称必须以字符 T 为前缀, 表
示是一个类型声明. 枚举类型的标识符序列必须以2到3个小写字符为前缀, 而且
前缀必须与类型名有联系, 例如:

TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMet
al, stRB);

枚举类型的变量实例的名称应该与不带 T 前缀的类型名称相同, 除非有其他原因
需要更详细的名称, 比如 FavoriteSongType1, FavoriteSongType2, 等等. 

Variant 和 OleVariant

一般来说使用 Variant and OleVariant 类型是不好的, 但如果数据类型只能在
运行时确定, 就必须使用这些类型了, 比如开发 COM 和数据库程序时. OleVari
ant 常用于开发基于 COM 的程序, 比如 OLE 自动化和 ActiveX 控件. Variant
 则常用于非 COM 程序. 原因是 Variant 能(与字符串变量一样)更高效地存储
Delphi 字符串, 但 OleVariant 需要把所有的字符串转换为 Ole Strings(Wide
Char Strings), 而且由于没有引用记数, 字符串将永远存在.

结构类型 

数组类型

数组类型名称应该具有与其用途相关的含义. 类型名必须以字符 T 为前缀. 如果
声明了指向该数组类型的指针类型, 则其名称必须以字符 P 为前缀, 而且必须在
数组类型的前一行位置进行声明, 例如:

type
  PCycleArray = ^TCycleArray;
  TCycleArray = array[1..100] of integer;

数组类型变量实例名称应该与不带字符 T 前缀的类型名称相同. 

记录类型

记录类型名称应该具有与其用途相关的含义. 类型名必须以字符 T 为前缀. 如果
声明了指向该记录类型的指针类型, 则其名称必须以字符 P 为前缀, 而且必须在
记录类型的前一行位置进行声明. 记录元素的声明应该对齐为一列, 例如:

type
  PEmployee = ^TEmployee;
  TEmployee = record
    EmployeeName: string
    EmployeeRate: Double;
  end;

语句

if 语句

if/then/else 语句中最可能被执行的部分应该放在 then 子句中, 不太可能被执
行的部分应该放在 else 子句中.

如果可能, 尽量不要使用一连串的 if 语句, 而应该以 case 语句替代.

不要使 if 语句嵌套超过5层以上, 尽量以更清楚的代码替代.

不要在 if 语句中使用无意义的括号.

如果 if 语句中需要检测多个条件, 则条件应该按照计算强度从小到大地排列.
这将使得你的代码执行的布尔计算更少, 性能更高. 例如, 如果 Condition1 比
 Condition2 计算更快, Condition2 比 Condition3 计算更快, 那么 if 语句应
该是如下结构:

if Condition1 and Condition2 and Condition3 then

case 语句 

概要

case 语句中的单个子句应该以 case 常数的数字顺序或字母顺序排列.

子句中的执行语句应该尽量保持简单, 一般不要超过4到5行代码. 如果执行语句
过于复杂, 应该将它放置在独立的过程或函数中.

case 语句的 else 子句应该只在正常的默认情况或检测到错误的情况下使用. 


格式

case 语句遵循同样的缩进和命名约定.

while 语句

使用 Exit 过程退出 while 循环是不好的; 如果可能, 应该只使用循环条件来结
束循环.

while 循环的所有初始化代码应该紧贴在进入 while 循环之前, 不要被其他无关
语句分隔开.

循环结束后的处理应该紧跟在循环之后.

for 语句

如果需要执行确定次数的增量循环, 应该用 for 语句替代 while 语句.

repeat 语句

repeat 语句与 while 循环类似, 并遵循相同的规则.

with 语句 

概要

with 语句应该小心使用, 并有很多需要注意的地方. 不要过多地使用 with 语句
, 而且要小心 with 语句中使用多个对象, 记录, 等等的情况. 例如:

with Record1, Record2 do

这样的代码可能会产生语意含糊, 并导致难以检测的 bug. 

格式

with 语句格式遵循同样的命名约定和缩排规则. 

结构化的意外处理

概要

意外处理在错误修正以及资源保护中都应该大量使用. 也就是说, 任何分配资源
的情况, 都应该使用 try..finally 以确保资源被正确释放. 在单元的 initial
ization/finalization 中或在对象的 constructor/destructor 中分配/释放资
源的情况不在此列. 

try..finally 的使用

任何可能的地方, 所有的资源分配代码都必须以 try..finally 结构保护起来.
例如, 下面的代码可能导致的 bug:

SomeClass1 := TSomeClass.Create
SomeClass2 := TSomeClass.Create;
try
  { do some code }
finally
  SomeClass1.Free;
  SomeClass2.Free;
end;

更安全的做法应该是:

SomeClass1 := TSomeClass.Create
try
  SomeClass2 := TSomeClass.Create;
  try
    { do some code }
  finally
    SomeClass2.Free;
  end;
finally
  SomeClass1.Free;
end;

try..except 的使用

try..except 应该只在你需要在产生意外时执行任务的情况下使用. 一般来说,
你不需要使用 try..except 来简单地显示错误信息, 因为应用程序将通过 Appl
ication 对象自动实现这一点. 在 except 子句中, 如果你希望在执行过自己的
任务后再调用缺省的意外处理程序, 应该使用 raise 来再次产生这个意外.

try..except..else 的使用

在 try..except 中使用 else 子句是不好的, 因为它将阻塞所有的意外, 包括那
些你没有准备处理的意外. 

命名规则

类的类型名称应该具有与其用途相关的含义, 类型名必须以字符 T 为前缀, 表明
这是一个类型定义, 例如:

type
  TCustomer = class(TObject)

类的实例名称一般与不带 T 前缀的类名称一样, 例如

var
  Customer: TCustomer;

注意: 关于组件命名的更多信息, 请参见 "组件类型命名标准" 部分. 

域 

命名规则

类的域遵循与变量一样的命名约定, 除非以字符 F 前缀表示是重要的域名称.

可见度(Visibility)

所有的域都应该是私有的(private). 可在类范围外访问的域应该通过属性来实现
.

方法 

命名规则

类方法与过程和函数遵循相同的命名约定. 

静态方法的使用

如果你不希望方法在派生类中被重载(override), 应该使用静态方法.

虚/动态方法的使用

如果你希望方法在子类中被重载, 应该使用虚方法方法. 动态方法应该只在存在
大量(直接和非直接)派生类的类中使用. 例如, 一个类中包含一个很少被重载的
方法, 但这个类有100个派生类, 则应该将这个方法设置为动态方法, 以减少这1
00个派生类消耗的内存. 

抽象方法的使用

不要在会创建实例的类中使用抽象方法. 抽象方法应该只在不会创建实例的基类
(base classes)中使用. 

属性存取方法

所有的属性存取方法应该出现在类定义的私有或保护部分.

属性存取方法遵循与过程和函数相同的命名约定. 取值方法必须以单词 Get 为前
缀, 赋值方法必须以单词 Set 为前缀, 赋值方法参数必须命名为 Value, 类型应
该与属性描述的一致, 例如:

TSomeClass = class(TObject)
private
  FSomeField: Integer;
protected
  function GetSomeField: Integer;
  procedure SetSomeField( Value: Integer);
public
  property SomeField: Integer read GetSomeField write SetSomeField;
end;

属性 

命名规则

用于存取私有域的属性应该与相应的域名称系统, 但没有 F 前缀.

属性名应该是名词, 而不是动词. 属性表示数据, 方法则表示动作.

数组属性名应该是复数形式. 普通属性名应该是单数形式. 

存取方法的使用

尽管不是必要的, 我们仍然建议你为访问私有域的属性最少建立一个的赋值方法

文件

工程文件

命名

工程文件名称应该具有描述性. 例如, The Delphi 4 Developer's Guide Bug M
anager 的工程命名为: DDGBugs.dpr. 一个系统信息程序命名为 SysInfo.dpr.


窗体文件

命名

窗体文件名称应该具有描述性, 并与其用途相关. 名称应该带有 Frm 后缀. 例如
, About 窗体的文件名为 AboutFrm.dpr. Main 窗体的文件名为 MainFrm.dpr.


数据模块文件

命名

数据模块名称应该具有描述性, 并与其用途相关. 名称应该带有 DM 后缀. 例如
, Customers 数据模块的文件名为 CustomersDM.dfm. 

远程数据模块文件

命名

远程数据模块名称应该具有描述性, 并与其用途相关. 名称应该带有 RDM 后缀.
 例如, Customers 远程数据模块的文件名为 CustomersRDM.dfm. 

单元文件

一般单元结构 

单元名称

单元文件名称应该带描述性. 例如, 包含应用程序主窗体的单元应该命名为 Mai
nFrm.pas. 

Uses 子句

interface 部分的 uses 子句应该只包括 interface 部分中代码需要的单元. D
elphi 自动加入的无关的单元名应该删除.

implementation 部分的 uses 子句应该只包括 implementation 部分中代码需要
的单元. 无关的单元名应该删除.

Interface 部分

Interface 部分应该只包括可被外部单元访问的类型声明, 变量声明, 过程/函数
的预先声明, 等等. 其他内容应该在 implementation 部分. 

Implementation 部分

Implementation 部分应该包括类型本单元私有的类型声明, 变量声明, 过程/函
数. 

Initialization 部分

不要将耗费大量时间的代码放在单元的 initialization 部分. 这将导致应用程
序启动缓慢. 

Finalization 部分

确保你释放了在 Initialization 部分分配的全部项目. 

窗体单元 

命名

窗体的单元文件名应该与窗体文件名相同. 例如, About 窗体的单元文件名为 A
boutFrm.pas. Main 窗体的单元文件名为 MainFrm.pas.

数据模块单元 

命名

数据模块的单元文件名应该与数据模块的文件名相同. 例如, Customers 数据模
块的单元文件名为 CustomersDM.pas.

一般用途单元 

命名

一般用途单元名称应该具有含义, 并与其用途相关. 例如, 一个实用程序单元命
名为 BugUtilities.pas. 一个包含全局变量的单元命名为 CustomerGlobals.pa
s.

记住, 单元名在工程使用的所有包内应该是唯一的. 因此建议你不要使用过于抽
象或普通的单元名.

组件单元 

命名

组件单元应该保存在单独的目录下, 以便将它们作为用户自定义组件和组件包区
分开. 绝对不要与工程保存在相同的目录下. 单元名应该能表示其内容.

注意: 关于组件命名标准的更详细信息, 请参见"用户自定义组件"部分. 

文件头

建议在所有的源文件, 工程文件, 单元文件等等中使用包含信息的文件头. 正确
的文件头应该包括以下信息:

{
Copyright ?YEAR by AUTHORS
}

窗体和数据模块

窗体

窗体类型命名标准

窗体类型名称应该描述其用途. 类型定义应该以字符 T 为前缀, 描述性的名称跟
随在前缀之后. 最后, Form 作为后缀跟在描述性的名称之后. 例如, About 窗体
的类型名称应该是:

TAboutForm = class(TForm) 

Main 窗体的定义应该是

TMainForm = class(TForm)

客户登记窗体的名称类似于

TCustomerEntryForm = class(TForm)

窗体实例命名标准

窗体实例应该命名为与类名一致, 但不带 T 前缀. 例如, 上述窗体类型, 其实例
名称如下: 

Type Name Instance Name 
TAboutForm AboutForm 
TMainForm MainForm 
TCustomerEntryForm CustomerEntryForm 

自动创建窗体

除非有其他更好的理由, 否则应该只有主窗体是自动创建的. 其他所有窗体应该
从 Project Options 对话框的 Auto-Create Forms 列表中删除. 详情请阅读下
面的部分.

模式化(Modal)窗体实例函数

所有的窗体单元应该包含一个窗体实例化函数, 这个函数将创建, 设置, 模式化
显示, 释放窗体, 并返回窗体模式化(modal result)结果. 传递给该函数的参数
遵循本文档规定的"参数传递"标准. 使用这样的函数的目的是为了封装窗体的使
用, 使得代码更易于重用和维护.

窗体变量应该从单元中删除, 并在函数中声明为局部变量. 注意, 这需要先将窗
体从 Project Options 对话框的 Auto-Create Forms 列表中删除参见本文档的
"自动创建窗体"部分.

例如, 下面的单元说明了为 GetUserData 窗体编写的一个这样的函数.

unit UserDataFrm;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dia
logs,
  StdCtrls;

type
  TUserDataForm = class(TForm)
    edtUserName: TEdit;
    edtUserID: TEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

function GetUserData(var aUserName: String; var aUserID: Integer): Wor
d;

implementation

{$R *.DFM}

function GetUserData(var aUserName: String; var aUserID: Integer): Wor
d;
var
  UserDataForm: TUserDataForm;
begin

  UserDataForm := TUserDataForm.Create(Application);
  try

    UserDataForm.Caption := 'Getting User Data';
    Result := UserDataForm.ShowModal;
    if ( Result = mrOK ) then
    begin
      aUserName := UserDataForm.edtUserName.Text;
      aUserID := StrToInt(UserDataForm.edtUserID.Text);
    end;

  finally
   UserDataForm.Free;
  end;

end;

end.

数据模块

数据模块命名标准

DataModule 类型名称应该描述其用途. 类型定义应该以字符 T 为前缀, 描述性
的名称跟随在前缀之后. 最后, DataModule 作为后缀跟在描述性的名称之后. 例
如, Customer 数据模块的类型名称类似于:

TCustomerDataModule = class(TDataModule)

Orders 数据模块的类型名称类似于

TOrdersDataModule = class(TDataModule)

数据模块实例命名标准

数据模块实例名称应该与类型名称一致, 但不带 T 前缀. 例如, 上述数据模块类
型, 其实例名称如下: 

Type Name Instance Name 
TCustomerDataModule CustomerDataModule 
TOrdersDataModule OrdersDataModule 

运行期和设计期包的使用

运行期包只包含包内其他组件需要的单元和组件. 包含属性/组件编辑器和其他设
计期间代码的单元应该放置在设计期包内. 注册单元应该放在设计期包内.

文件命名标准

包应该按照以下模式命名:

"iiilibvv.pkg" - 设计期包

"iiistdvv.pkg" - 运行期包

其中 "iii" 表示以3个字符作为前缀. 这个前缀可以用来标识公司, 个人, 或其
他信息. 

"vv" 表示包所适用的 Delphi 版本. 

注意包名称中包含 "lib" 或 "std", 是为了标识这是运行期包还是设计期包. 


当既有设计期包又有运行期包时, 文件名应该类似. 例如, Delphi 4 开发指南的
包命名为:

DdgLib40.pkg - 设计期包

DdgStd40.pkg - 运行期包

组件

用户自定义组件

组件类型命名标准

组件命名与类命名类似, 不同的是组件名带有3个字符的前缀. 这个前缀用来标识
公司, 个人, 或其他信息. 例如, Delphi 4 开发指南编写的一个时钟组件定义为
:

TddgClock = class(TComponent)

注意前缀字符为小写. 

组件单元

组件单元应该只包含一个主组件. 主组件是指出现在组件板(Component Palette
)上的组件. 主组件的其他辅助性的组件/对象也在相同的单元内. 

注册单元的使用

组件的注册过程应该从组件单元中删除, 而放置在单独的注册单元中. 这个注册
单元将注册所有的组件, 属性编辑器, 组件编辑器, 专家(experts)等等. 

组件的注册动作只在设计期包内进行, 因此注册单元应该只包含在设计期包内,
而不在运行期包内.

建议注册单元命名为:

XxxReg.pas

其中 "Xxx" 是3字符前缀, 用来标识公司, 个人, 或其他信息. 例如, Delphi 4
 开发指南中的组件注册单元命名为 DdgReg.pas. 

组件实例命名约定

所有的组件名称都应该是描述性的. 不应该有组件使用 Delphi 缺省赋给的名称
. 组件名称应该包括一个小写前缀, 以指明其类型. 使用前缀而不是使用后缀的
原因之一是在 Object Inspector 和 Code Explorer 中可以更容易地按名称查找
组件.

组件前缀

以下前缀赋给 Delphi 4 附带的标准组件. 如果安装了第三方组件, 请增加这份
列表.

Standard 页面 

前缀 组件

mm TMainMenu

pm TPopupMenu

mmi TMainMenuItem

pmi TPopupMenuItem

lbl TLabel

edt TEdit

mem TMemo

btn TButton

cb TCheckBox

rb TRadioButton

lb TListBox

cb TComboBox

scb TScrollBar

gb TGroupBox

rg TRadioGroup

pnl TPanel

cl TCommandList

Additional 页面 

前缀 组件

bbtn TBitBtn

sb TSpeedButton

me TMaskEdit

sg TStringGrid

dg TDrawGrid

img TImage

shp TShape

bvl TBevel

sbx TScrollBox

clb TCheckListbox

spl TSplitter

stx TStaticText

cht TChart

Win32 页面 

前缀 组件

tbc TTabControl

pgc TPageControl

il TImageList

re TRichEdit

tbr TTrackBar

prb TProgressBar

ud TUpDown

hk THotKey

ani TAnimate

dtp TDateTimePicker

tv TTreeView

lv TListView

hdr THeaderControl

stb TStatusBar

tlb TToolBar

clb TCoolBar

System 页面 

前缀 组件

tm TTimer

pb TPaintBox

mp TMediaPlayer

olec TOleContainer

ddcc TDDEClientConv

ddci TDDEClientItem

ddsc TDDEServerConv

ddsi TDDEServerItem

Internet 页面 

前缀 组件

csk TClientSocket

ssk TServerSocket

wbd TWebDispatcher

pp TPageProducer

tp TQueryTableProducer

dstp TDataSetTableProducer

nmdt TNMDayTime

nec TNMEcho

nf TNMFinger

nftp TNMFtp

nhttp TNMHttp

nMsg TNMMsg

nmsg TNMMSGServ

nntp TNMNNTP

npop TNMPop3

nuup TNMUUProcessor

smtp TNMSMTP

nst TNMStrm

nsts TNMStrmServ

ntm TNMTime

nudp TNMUdp

psk TPowerSock

ngs TNMGeneralServer

html THtml

url TNMUrl

sml TSimpleMail

Data Access 页面 

前缀 组件

ds TDataSource

tbl TTable

qry TQuery

sp TStoredProc

db TDataBase

ssn TSession

bm TBatchMove

usql TUpdateSQL

Data Controls 页面 

前缀 组件

dbg TDBGrid

dbn TDBNavigator

dbt TDBText

dbe TDBEdit

dbm TDBMemo

dbi TDBImage

dblb TDBListBox

dbcb TDBComboBox

dbch TDBCheckBox

dbrg TDBRadioGroup

dbll TDBLookupListBox

dblc TDBLookupComboBox

dbre TDBRichEdit

dbcg TDBCtrlGrid

dbch TDBChart

Decision Cube 页面 

前缀 组件

dcb TDecisionCube

dcq TDecisionQuery

dcs TDecisionSource

dcp TDecisionPivot

dcg TDecisionGrid

dcgr TDecisionGraph

QReport 页面 

前缀 组件

qr TQuickReport

qrsd TQRSubDetail

qrb TQRBand

qrcb TQRChildBand

qrg TQRGroup

qrl TQRLabel

qrt TQRText

qre TQRExpr

qrs TQRSysData

qrm TQRMemo

qrrt TQRRichText

qrdr TQRDBRichText

qrsh TQRShape

qri TQRImage

qrdi TQRDBMImage

qrcr TQRCompositeReport

qrp TQRPreview

qrch TQRChart

Dialogs 页面

Dialog 组件是封装在组件内部的实际窗体. 因此应该遵循窗体的命名约定. 类型
定义已经定义为组件名称了, 实例名称应该与不带数字后缀的类型实例名称相同
, 如下: 

类型 实例名称

TOpenDialog OpenDialog

TSaveDialog SaveDialog

TOpenPictureDialog OpenPictureDialog

TSavePictureDialog SavePictureDialog

TFontDialog FontDialog

TColorDialog ColorDialog

TPrintDialog PrintDialog

TPrintSetupDialog PrinterSetupDialog

TFindDialog FindDialog

TReplaceDialog ReplaceDialog

Win31 页面 

前缀 组件

dbll TDBLookupList

dblc TDBLookupCombo

ts TTabSet

ol TOutline

tnb TTabbedNoteBook

nb TNoteBook

hdr THeader

flb TFileListBox

dlb TDirectoryListBox

dcb TDriveComboBox

fcb TFilterComboBox

Samples 页面 

前缀 组件

gg TGauge

cg TColorGrid

spb TSpinButton

spe TSpinEdit

dol TDirectoryOutline

cal TCalendar

ibea TIBEventAlerter

ActiveX 页面 

前缀 组件

cfx TChartFX

vsp TVSSpell

f1b TF1Book

vtc TVTChart

grp TGraph

Midas 页面 

前缀 组件

prv TProvider

cds TClientDataSet

qcds TQueryClientDataSet

dcom TDCOMConnection

olee TOleEnterpriseConnection

sck TSocketConnection

rms TRemoteServer

mid TmidasConnection

转载于:https://www.cnblogs.com/zzling/archive/2008/07/21/1247333.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值