求Delphi编程规范。(100分)

  • 主题发起人 主题发起人 yukaikai
  • 开始时间 开始时间
Y

yukaikai

Unregistered / Unconfirmed
GUEST, unregistred user!

查找了一下,都不是太满意。

最好是软件公司自己制定的,比如华为的编程规范和范例就很好,不过是VC的。
 
这里有一篇:
Delphi 4 程序员代码编写标准指南
版权所有 1998 Xavier Perched和 Steve Teiseira

一、序言
二、通用源代码格式规则
2.1 缩格
2.2 页边空格
2.3 Begin…End 配对
三、Object Pascal
3.1 括号
3.2 保留字和关键字
3.3 过程和函数(例程)
3.3.1 命名/格式化
3.3.2 形式参数
3.3.2.1 格式化
3.3.2.2 命名
3.3.2.3 参数的排序
3.3.2.4 常量参数
3.3.2.5 名称的冲突
3.4 变量
3.4.1 变量的命名和格式
3.4.2 局部变量
3.4.3 全局变量的使用
3.5 类型
3.5.1 大写约定
3.5.1.1 浮点指针类型
3.5.1.2 枚举类型
3.5.1.3 变数和ole变数类型
3.5.2 结构类型
3.5.2.1 数组类型
3.5.2.2 记录类型
3.6 语句
3.6.1 if 语句
3.6.2 case 语句
3.6.2.1 一般性话题
3.6.2.2 格式
3.6.3 while 语句
3.6.4 for 语句
3.6.5 repeat 语句
3.6.6 with 语句
3.6.6.1 一般话题
3.6.6.2 格式
3.7 结构异常处理
3.7.1 一般话题
3.7.2 try…finally的使用
3.7.3 try…except的使用
3.7.4 try…except…else的使用
3.8 类类型
3.8.1 命名和格式
3.8.2 域
3.8.2.1 命名/格式
3.8.2.2 可视化
3.8.3 方法
3.8.3.1 命名/格式
3.8.3.2 使用静态的方法
3.8.3.3 使用虚拟/动态的方法
3.8.3.4 使用抽象的方法
3.8.3.5 属性存取方法
3.8.4 属性
3.8.4.1 命名/格式
3.8.4.2 使用存取的方法
四、文件
4.1 工程文件
4.1.1 命名
4.2 窗体文件
4.2.1 命名
4.3 数据模板文件
4.3.1 命名
4.4 远端数据模板文件
4.4.1 命名
4.5 Unit文件
4.5.1 通用Unit结构
4.5.1.1 unit的名字
4.5.1.2 uses子句
4.5.1.3 interface部分
4.5.1.4 implementation部分
4.5.1.5 initialization部分
4.5.1.6 finalization部分
4.5.2 窗体单元
4.5.2.1 命名
4.5.3 数据模板单元
4.5.3.1 命名
4.5.4 一般目的单元
4.5.4.1 命名
4.5.5 构件单元
4.5.5.1 命名
4.6 文件头
五、窗体和数据模板
5.1 窗体
5.1.1 窗体类型命名标准
5.1.2 窗体实例命名标准
5.1.3 自动创建窗体
5.1.4 模式窗体实例化函数
5.2 数据模板
5.2.1 数据模板命名标准
5.2.2 数据模板实例命名标准
六、包
6.1 使用运行包和设计包的比较
6.2 文件命名标准
七、构件
7.1 用户自定义构件
7.2 构件单元
7.3 使用注册单元
7.4 构件实例命名约定
7.5 构件的前缀
7.6 Standard页
7.7 Additional页
7.8 Win32页
7.9 System页
7.10 Internet页
7.11 Data Access页
7.12 Data Controls页
7.13 Decision Cube页
7.14 QReport页
7.15 Dialogs页
7.16 Win3.1页
7.17 Samples页
7.18 ActiveX页
7.19 Midas页

一、序言

本文档详述了在Delphi 4开发者指南下进行编程的代码编写标准。在通常情况下,本文档遵循“取消”式格式的指引方针,该方针由Borland国际通过一些例外来使用。在Delphi 4开发者指南中包含本文档的目的在于阐述一种方法,通过该方法,开发小组可以在他们所编写的代码中保持一贯的风格。这样做的目的是使在开发小组中的每一个程序员都可以明白其他程序员的代码。这有助于提高代码编写的可读性和使用的一贯性。

本文档并不意味着包含了所有存在于代码中的标准。但是,它的内容已足够帮你起个好头。你可以自由的增加修改这些标准来满足你的需要。我们不赞成你偏离这些由Borland开发人员所使用的标准太远。我们推荐这么做是因为一旦有新的程序员加入到你的开发小组中,而他们最喜欢和最熟悉的是Borland的标准。象大多数代码标准文档,本文档也会根据需要进行改动。因此,你可以到www.xapware.com/ddg中找到最新的更新版本。本文档不包括用户接口标准。本文档是独立的但也是同样重要的。已经有足够的第三方书籍和Microsoft文档包括了另外一些指导方针,而我们决定并不复制这些信息,但我们会指引你到Microsoft Developers Network 和一些资源,在那儿可以找到你所需的信息。

二、通用源代码格式规则

2.1 缩格

缩格是指在每一级有两个空格。不要在源代码中保留tab字符,这是因为tab字符会随着不同用户的不同设置和不同的资源管理工具(打印、文档、版本控制等)而代表不同的宽度。

你可以通过关闭Environment选项对话框中Editor页上的“Use tab character”和“Optimal fill”检查框(通过Tools|Environment)来禁止保存tab字符。

2.2 页边空格

页边空格会被设置成80字符宽。通常,源码不会超出这个边界,但这个方针会有一些弹性。不管是否有可能,那些超出到另一行的语句会在一个逗号或其他操作符之后与前面的语句相连。当一个语句被打断相连时,它应比原来的那一行语句缩进两个字符。

2.3 Begin…End 配对

Begin 子句应写在独立的一行。例如,下面第一行是错误的写法而第二行是正确的。
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语句永远缩进到与begin部分相对应的位置。

三、Object Pascal

3.1 括号

永远不要在括号与括号之间的字符中间留下空格。下面的例子示范了错误的与正确地使用括号中的空格:
CallProc( Aparameter ); //错误
CallProc(Aparameter); //正确

永远不要在一个语句中使用不必要的括号。括号只应在源代码中需要的地方使用。以下的例子示范了错误和正确的使用:
if (I = 42) then //错误 - 多余的括号
if (I = 42) or (J = 42) then //正确 - 需要括号

3.2 保留字和关键字

Object Pascal 保留字和关键字永远是全部小写。

3.3 过程和函数(例程)

3.3.1 命名/格式化

例程的名字永远应该以大写的字母开头并且中间错落分明以便于可读性。下面是一个不正确格式的过程名称:
procedure thisisapoorlyformattedroutinename;

下面是一个合适的大小写例程名称的例子:
procedure ThisIsMuchMoreReadableRoutineName;

例程的名称应该同它的内容相符。一个会导致某个行为的例程应以动词开头。例如:
procedure FormatHardDrive;

一个用于设置输入参数的例程应以单词set作为前缀,例如:
procedure SetUserName;

一个用来接收某个值的例程应以单词get作为前缀,例如:
procedure GetUserName : string;

3.3.2 形式参数

3.3.2.1 格式化

如果有的话,相同类型的形参应合并在一个语句中:
procedure Foo(Param1, Param2, Param3 : Integer; Param4 : string);

3.3.2.2 命名

所有形参的名字应是十分符合它们所代表的意义,特别是应该以传送到例程中的标志符的名称为基础。一个好的参数名称应以字符A为前缀 - 例如:
procedure SomeProc(AuserName : string; AuserAge : integer);

“A”前缀按约定表示该参数的名称是与类类型中的一个属性或域的名称相对应的。

3.3.2.3 参数的排序

下面的形参的顺序重点说明了注册者调用约定调用的好处。

- 最常用的参数应放在第一位,其它的参数应按从左到右的顺序排列。
- 输入参数列表应放在输出参数列表的左边。
- 将通用的参数放在特殊参数的左边,例如:
procedure SomeProc(Aplanet, AContinent, Acountry, Astate, Acity)
- 排序有可能有些例外,比如事件的处理。类型为TObject的Sender参数经常放在第一位。

3.3.2.4 常量参数

当一个参数为记录型、数组类型、ShortString、或接口类型并且在例程中不被改变时,这些参数应做上常量标记。这样做会让编译器更加有效率的产生有关这些不改变的参数的代码。

而例程中另外一些非变参数也可常量来传送。尽管这样做没有产生任何效果和提高效率,这将会给调用例程的使用者提供更多的信息。

3.3.2.5 名称的冲突

当使用拥有两个名称相同的例程的两个单元时,如果你调用该例程时,在uses子句中排在后面的单元中的例程将会被调用。为了解决这种“在uses子句上的模糊”冲突,要在调用该例程时写上相关的单元的前缀,例如:
sysUtile.FindClose(SR);

windows.FindClose(Handle);

3.4 变量

3.4.1 变量的命名和格式

变量的命名应以使用它们的目的相符

循环控制变量应采用一个单独的字符作为名字,比如 I,J,或K,也可以采用更加有意义的名字,比如 UserIndex。

逻辑变量的名字应能充分表达准确的真或假的意思。

3.4.2 局部变量

一个过程中的局部变量应遵循所有其它变量的使用和命名约定。临时变量的取名应合理。

如果必须的话,在一进入例程就应初始化局部变量。局部的AnsiString变量会自动初始化为一个空的字符串。
局部接口和派分接口类型变量将会自动初始化为nil,并且局部变数和ole变数类型变量会自动初始化为Unassigned

3.4.3 全局变量的使用

使用全局变量是不推荐的。但是,在某些时候还是必须使用,而且它们也只应在必须使用的时候才使用。在这种时候,你应努力只在一段上下文范围内使用全局变量。例如,一个全局变量只应在一个单元的implemntation部分内是全局的。如果打算在多个单元类使用全局数据,你应将它们移到一个公共的单元中然后被其它所有单元使用。

全局变量可以在var子句中直接初始化为一个值。记住,所有的全局数据会自动初始化为0,因此不要将全局变量初始化为一个“空”值比如 0、nil、’’、Unassigned、等等。这样做的一个理由是因为零-初始化的全局数据在exe文件中不会占据任何空间。零-初始化数据被存储在一个虚拟的数据段,它在应用程序启动后被分配在一段内存中。非零-初始化的全局数据在硬盘的exe文件占用空间。

3.5 类型

3.5.1 大写约定

如果类型的名字是保留字,那么它应全部小写。Win32 API类型通常全部大写,并且你必须遵循在Windows.pas或其他API单元中的详细类型名称的约定。对于其他变量名字,地一个字母应为大写,而其他字母应错落有致。下面是一些例子:
var
MyString : string; //保留字
WindowHandle : HWND; //Win32 API 类型
I : Integer; //在System单元中引进的类型标识符

3.5.1.1 浮点指针类型

不推荐使用Real类型,因为它的存在只是为了向前兼容早期的Pascal代码。在通常情况下用Double来实现浮点指针的需要。并且,Double对处理器和总线而言是做了最优化处理的,它也是IEEE中定义的标准数据格式。只有当需要的范围超出Double所定义的范围时才使用Extended。Extended是intel定义的类型且在Java中不支持。只有当浮点指针变量的实际字节大小有其意义时才使用Single。(比如当使用另一种语言的DLLs时)。

3.5.1.2 枚举类型

枚举类型的名字需符合使用该类型的目的。该类型的名字需以字符T为前缀,以表明这是一个类型。枚举类型中的标识符列表必须包含两个或三个字符的前缀来对应于该枚举类型的名字 - 例如:
TsongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
一个枚举类型的实例的名字应与不要前缀的枚举类型(SongType)相同,除非有更好的原因来赋予该变量更特殊的名字,比如:FavoriteSongType1,FavoriteSongType2 等等。

3.5.1.3 变数和ole变数类型

通常不建议使用变数和Ole变数类型。但在只有运行时刻才能知道数据类型的程序中必须使用该类型,这种情形多出现在COM和数据库开发中。Ole变数使用在以COM为基础的编程中例如自动化和ActiveX控制,而变数使用在非COM的编程中,这是因为变数可以十分有效地存储本地Delphi字符串(同一个字符串变量一样),但Ole变数会将所有的字符串转换为Ole字符串(WideChar 字符串)并且并不实例运算 - 它们永远拷贝。

3.5.2 结构类型

3.5.2.1 数组类型

数组类型的名字需符合它们使用的目的。该类型的名字必须加以前缀T。如果须声明该数组类型的指针,那么该指针需加以前缀P而且应立即声明在该数组声明的前面。例如:
type
PCycleArray = ^TCycleArray;
TCycleArray = array[1…100] of integer;
在实际应用中,数组的变量实例的名称应是其类型的名字去掉前缀T。

3.5.2.2 记录类型

记录类型的名字应符合使用它们的目的。其类型的声明应加以前缀T。如果要声明该记录类型的指针,就应加以前缀P并且应紧靠在类型声明的前面声明。例如:
type
PEmployee = ^TEmployee;
TEmployee = record
EmployeeName : string;
EmployeeRate : Double;
end;

3.6 语句

3.6.1 if 语句

在if/then/else语句中最常发生的行为应放在then子句中,而其它发生可能性较小的行为应放在else子句中。

尽量避免使用嵌套的if语句,在这种情形下应用多个if语句来判断各种可能。

不要使用if嵌套超过五级深度。应使代码编写得更加清晰、明了。

不要在if语句中使用不必要的圆括号。

如果在if语句中有多个条件需测试,这些条件应按计算强度由少到多的顺序从左到右排列。这样做能使编译器在编译代码时获得布尔估算逻辑的捷径,从而使你的代码获得最佳的优化。举例来说,如果条件1快过条件2,而条件2快过条件3,那么在if语句中的排列应是:
if 条件1 and 条件2 and 条件3 then

3.6.2 case 语句

3.6.2.1 一般性话题

在一个case语句中的各个独立的单元应以数字或字母顺序排列。

每一个case单元的动作行为应保持简单而不应该超过四到五行代码。如果所要执行的动作过于复杂应采用独立的过程或函数。

Case语句中的else子句只有当需要缺省行为或处理错误时才使用。

3.6.2.2 格式

case语句应遵循其它结构的缩格和命名约定。

3.6.3 while 语句

在一个while语句中不建议使用exit过程来跳出循环,尽量仅使用循环条件来跳出循环。

在一个while循环中所用的初始化代码应紧靠在进入while循环前面出现而不要被其它不相关的语句隔开。

任何结束后的处理应在循环之后立即进行。

3.6.4 for 语句

for语句只有当循环次数已知的情况下才能取代while语句使用。

3.6.5 repeat 语句

repeat语句的使用同while语句一样,并且遵循同样的通用方针。

3.6.6 with 语句

3.6.6.1 一般话题

with语句应节省使用,并且带有大量的警告。避免过度使用with语句并且在with语句中小心使用多个对象、记录等等。例如:
with Record1, Record2 do
这些事情会使程序员感到困惑并难以发现问题所在。

3.6.6.2 格式

with 语句遵循本文档所说明的命名约定和缩格的格式规则。

3.7 结构异常处理

3.7.1 一般话题

异常的处理大量地使用在错误纠正和资源保护方面。这就是说一旦资源被分配,一个try…finally必需加以使用来保证该资源被正确的释放。这种异常的保护也是指在一个单元的initializition/finalization或一个对象的constructor/destructor中进行资源的分配和释放。

3.7.2 try…finally的使用

任何情形下,每一次的分配都应跟随一个try…finally。举例来说,下面的代码会造成可能的错误:
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;

3.7.3 try…except的使用

只有当在异常被触发而你想执行一些任务时才使用try…except。通常,你没有必要为了只是简单地在屏幕上显示一个错误信息而使用try…except语句,因为这会被Application对象自动执行。如果你想在except子句中执行完一些任务之后调用缺省的异常处理,使用raise来重新触发异常到下一个句柄。

3.7.4 try…except…else的使用

try…except中的else子句不建议使用,因为它会打断所有的异常包括那些你没有准备的异常。

3.8 类类型

3.8.1 命名和格式

类类型的名称应符合使用它们的目的。类型名字应加以前缀T以表明这是一个类型的定义 - 例如:
type
Tcustomer = class(TObject)
类型的实例通常是没有前缀T的类型的名字 - 例如:
var
Customer :Tcustomer;
注意:查阅“构件类型的命名标准”来获得更多有关构件命名的信息。

3.8.2 域

3.8.2.1 命名/格式

类的域名遵循与变量标识符同样的约定除了它们应以F为前缀,来表明这是一个域的名称。

3.8.2.2 可视化

所有的域都必需是私有的。想在类的范围之外存取域得通过属性来使用。

3.8.3 方法

3.8.3.1 命名/格式

方法的命名应遵循本文档中有关过程和函数的约定叙述。

3.8.3.2 使用静态的方法

如果使用一个静态的方法,那么该方法就不能被该类的后代类所继承。

3.8.3.3 使用虚拟/动态的方法

如果你打算该类的方法能被后代的类所继承就得使用虚拟的方法。只有在该方法有多个继承时(直接的或间接的)才使用动态的方法。例如,一个类类型包含一个可继承的方法,而100个后代类要继承这种方法,那么这个方法就会动态地产生为100个后代类使用的内存。

3.8.3.4 使用抽象的方法

如果在一个类中使用抽象的方法,该类就不能被创建。只有在那些永远不会被创建的类中使用抽象的方法。

3.8.3.5 属性存取方法

所有存取类的方法都只能出现在类的private或protected部分。属性存取方法的命名应遵循过程和函数的约定规则。读取存取方法(方法读取器)必需以单词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;

3.8.4 属性

3.8.4.1 命名/格式

属性如果是表示为一个私有域的存取器的话,那么它的名字应是它们所操作的域的名字除去解释符F。

属性的名字应是名词,不是动词。属性表示的是数据,而方法表示的是行为。

数组类型的名称应为复数。一般情况下属性的名称应为单数。

3.8.4.2 使用存取的方法

尽管没有要求,但还是建议尽量少地为一个表示私有域的属性而使用写入存取方法。

四、文件

4.1 工程文件

4.1.1 命名

工程文件应取个描述性的名字。例如,Delphi 4开发者指南错误管理器 的工程名字是:DDGBugs.dpr。一个有关系统信息的程序的名字就应象 SysInfo.dpr。

4.2 窗体文件

4.2.1 命名

一个窗体文件的取名应可以描述使用该窗体的目的,并加以后缀Frm。例如,一个“关于”的窗体的文件名应是AboutFrm.dpr。主窗体的文件名应是MainFrm.dpr。

4.3 数据模板文件

4.3.1 命名

数据模板的取名应能表示使用该数据模板的目的,它的名称应加以两个字符的后缀DM。例如,自定义数据模板的文件名字应为CustomersDM.dfm。

4.4 远端数据模板文件

4.4.1 命名

远端数据模板的取名应能表示使用该远端数据模板的目的,它的名称应加以三个字符的后缀RDM。例如,自定义远端数据模板的文件名字应为CustomersRDM.dfm。

4.5 Unit文件

4.5.1 通用Unit结构

4.5.1.1 unit的名字

Unit文件应取一个可描述性的名字。例如,包含应用程序主窗体的单元应叫做MainFrm.pas。

4.5.1.2 uses子句

在interface部分的uses子句应包含在interface部分中的代码所需要的单元。去掉那些Delphi可以自动加入到程序中的单元。

在implementation部分的uses子句应只包含在implementation部分中的代码所需要的单元的名字。去掉不必要的单元。

4.5.1.3 interface部分

interface部分应包含只那些其它单元所需要存取类型的定义、变量、过程/函数的预定义等等。否则,就应放在implementation部分定义。

4.5.1.4 implementation部分

implementation部分应包含那些只在本单元中私用的类型定义、变量、过程/函数定义等等。

4.5.1.5 initialization部分

不要在initialization 部分放入耗时长的代码,这将使程序的第一个界面出现
得比较缓慢。

4.5.1.6 finalization部分

在这里要保证释放你在Initialization部分所分配的任何资源。

4.5.2 窗体单元

4.5.2.1 命名

一个窗体的单元文件应拥有与它所对应的窗体文件同样的名称。例如,“关于”窗体的单元名称应为 AboutFrm.pas,而主窗体的单元名称应为MainFrm.pas。

4.5.3 数据模板单元

4.5.3.1 命名

一个数据模板的单元文件应拥有与它所对应的数据模板文件同样的名称。例如,一个自定义数据模板单元的名称应为CustomersDM.pas。

4.5.4 一般目的单元

4.5.4.1 命名

一般目的单元的取名应符合使用该单元的目的。例如,一个实用程序单元取名为BugUtilities.pas。一个包含全局变量的单元取名为CustomerGlobals.pas。

注意,该单元的名字不能与它的工程中所使用的所有包中的单元的名字相同。不赞成使用一般的或通用的单元名字。

4.5.5 构件单元

4.5.5.1 命名

构件单元应放在独立的目录,以将它们同定义构件组或构件集合的单元区分开来。它们要永远同工程在不同的目录。单元名字应同它们的内容相符。

注意:查阅“用户定义的构件”部分来获得更多有关构件命名标准的信息。

4.6 文件头

建议在所有源文件、工程文件、单元等等中使用信息化文件头。一个良好的文件头应包含以下信息:

版权… 著作的年、月、日…
}

五、窗体和数据模板

5.1 窗体

5.1.1 窗体类型命名标准

窗体类型的取名应能表达使用该窗体的目的。类型定义应加以前缀T。前缀后面跟随着描述性的名字。最后,应加以Form后缀来描述名字。例如,一个“关于”的窗体的类型的名字应为:
TAboutFrom = class(TForm);
主窗体的定义为:
TMainForm = class(TForm);
一个用户接入窗体的名字应象:
TCustomerEntryForm = class(TForm);

5.1.2 窗体实例命名标准

窗体实例应是没有带前缀T的相应类的名字。例如,对应于前面窗体类型而言,其实例的名字应为:

类型名称 实例名称
TAboutForm AboutForm
TMainForm MainForm
TCustomerEntryForm CustomerEntryForm

5.1.3 自动创建窗体

只有主窗体可以是自动创建的除非有其它更好的理由不这样做。所有其它的窗体必需从工程选项对话框中的自动创建列表中移走。查阅以下部分来获得更多的信息。

5.1.4 模式窗体实例化函数

所有的窗体单元都应包含一个窗体实例化函数,该函数用来创建、设置、模式地显示窗体,并释放窗体。该函数应返回窗体的模式结果。该函数要传递的参数应遵循本文档指定的“参数传递”标准。通过这种方式封装的函数性有助于代码的再利用和维护。

该窗体的变量要从单元中移走,并再窗体实例的函数中进行本地式地定义。注意,这就意味着该窗体必需从工程/选项对话框中的自动创建列表中剔除。参考本文档后面的“自动创建窗体”。

例如,下面的单元展示了再GetUserData窗体中的一个函数。
unit UserDataFrm;
interface
uses
windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TUserDataForm = class(TForm)
edtUserName : TEdit;
edtUserID : TEdit;
private
{ Private declarations }
public
{ Public declarations }
end;
function GetUserData(var aUserName : String; var aUserID : Integer) :
Word;
implementation
{$R *.DFM }

function GetUserData(var aUserName : String; var aUserID : Integer) :
word;
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.

5.2 数据模板

5.2.1 数据模板命名标准

数据模板的取名要符合使用该数据模板的目的。类型的定义应加以前缀T,后面紧接着描述性的名字,最后要加以后缀单词“DataModule”。例如,一个自定义的数据模板有时候应该象:
TCustomerDataModule = class(TDataModule)
一个命令式的数据模板的名字应象:
TOrdersDataModule = class(TDataModule)

5.2.2 数据模板实例命名标准

数据模板实例的名称应是对应不带前缀T的类型的名称。例如,对于前面的窗体类型而言,其实例的名称应为:
类型名称 实例名称
TCustomerDataModule CustomerDataModule
TOrdersDataModule OrdersDataModule

六、包

6.1 使用运行包和设计包的比较

运行时刻的包应只包含其它构件包所要求的单元或构件。另外,包含属性/构件编辑器和其它只为设计的代码应放入到设计时刻包中。注册单元应放在设计包中。

6.2 文件命名标准

包的名称应依照下面的例子:
“iiilibvv.pkg” - 设计时刻包
“iiistdvv.pkg” - 运行时刻包
字符“iii”表示一个3字符标识前缀。这个前缀用来表明公司、个人或其它有标识意义的实体。

字符“vv”表示为该包想要对应Delphi某个版本的包的版本号。

注意,包的名字中包含“lib”或“std”的意思是表明这是一个设计时刻包还是一个运行时刻包。

如果既是设计时刻包又是运行时刻包,该文件的命名是同上面一样的,例如,为Delphi 4开发者指南做的包的名称应为:

DdgLib40.pkg – 设计时刻包
DdgStd40.pkg – 运行时刻包

七、构件

7.1 用户自定义构件

在标准构件中命名出来的构件的名称同在“类类型”部分定义中的一样定义成一个类类型,不同的是它们有一个3字符的指示前缀,这个前缀可以表示公司、个人或其它实体。例如,一个为Delphi 4开发者指南编写的时钟构件的名称定义为:
TddgClock = class(TComponent)
注意,那三个前缀字符是小写的。

7.2 构件单元

构件单元应只包含一个主要的构件,一个主要的构件是指出现在构件栏中的构件。主要构件的辅助构件/对象应放入到同一个单元中。

7.3 使用注册单元

构件的注册过程应从构件本身的单元中剔除,并放入到一个独立的单元中。这个注册单元可以用来注册任何构件、属性编辑器、构件编辑器、专家器等。

构件的注册只应在设计时刻包中进行,注册单元应包含在设计时刻包中而不应放在运行时刻包中。

推荐使用的注册单元的名称是:
XxxReg.pas
上面的3个前缀字符“Xxx”用来表示一个公司、个人或任何其它的实体。例如,在Delphi 4 开发者指南中的注册单元的名称应为 DdgReg.pas。

7.4 构件实例命名约定

所有的构件都应取个描述性的名称。由Delphi创建的缺省名的构件不会被遗弃。在设计构件类型时应设计一个小写的前缀。使用前缀而不使用后缀的原因是在搜寻时,在对象检查器和代码探索器中搜寻构件的名字比搜寻构件的类型更容易实现。

7.5 构件的前缀

以下构件的前缀可以用来设计Delphi 4中的标准构件。请在此列表中加入第三方构件的前缀。

7.6 Standard页
前缀 构件
mm TMainMenu
pm TPopupMenu
mmi TMainMenuItem
pmi TPopupMenuItem
前缀 构件
lbl TLabel
edt TEdit
mem TMemo
btn TButton
cb TCheckBox
rb TRadioBox
lb TListBox
cb TComboBox
scb TScrollBar
gb TGroupBox
rg TRadioGroup
pnl TPanel
cl TCommandList
7.7 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
7.8 Win32页
tbc TTabControl
pgc TPageControl
il TImageList
re TRichEdit
thr TTrackBar
prb TProgressBar
ud TUpDown
hk THotKey
ani TAnimate
dtp TDateTimePicker
tv TTreeView
lv TListView
hdr THeaderControl
前缀 构件
stb TStatusBar
tlb TToolBar
clb TCoolBar
7.9 System页
tm TTimer
pb TPaintBox
mp TMediaPlayer
olec TOleContainer
ddcc TDDEClientItem
ddci TDDEClientItem
ddsc TDDEServerConv
ddsi TDDEServerItem
7.10 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


7.11 Data Access页
前缀 构件
ds TDataSource
tbl TTable
qry TQuery
sp TStoredProc
db TDataBase
ssn TSession
bm TBatchMove
usql TUpdateSQL
7.12 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
7.13 Decision Cube页
dcb TDecisionCube
dcq TDecisionQuery
dcs TDecisionSource
dcp TDecisionPivot
dcg TDecisionGrid
dcgr TDecisionGraph
7.14 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
7.15 Dialogs页
对话框构件是由构件封装的真正的窗体,因此,它们应遵循窗体的命名约定。类型已由构件的名称定义。它的实例的名称是Delphi自动生成的类型实例名字去掉数字后缀。举例如下:
类型 实例名字
TOpenDialog OpenDialog
TSaveDialog SaveDialog
TOpenPictureDialog OpenPictureDialog
TSavePictureDialog SavePictureDialog
TFontDialog FontDialog
TColorDialog ColorDialog
TPrintSetupDialog PrintSetupDialog
TFindDialog FindDialog
TReplaceDialog ReplaceDialog
7.16 Win3.1页
dbll TDBLookupList
dblc TDBLookupCombo
ts TTabSet
ol TOutline
tnb TTabbedNoteBook
nb TNoteBook
hdr THeader
flb TFileListBox
dlb TDirectoryListBox
dcb TDriveComboBox
fcb TFliterComboBox
7.17 Samples页
gg TGauge
前缀 构件
cg TColorGrid
spb TSpinEdit
spe TSpinEdit
dol TDirectoryOutline
cal TCalendar
ibea TIBEventAlerter
7.18 ActiveX页
cfx TChartFX
vsp TVSSpell
f1b TF1Book
vtc TVTChart
grp TGraph
7.19 Midas页
prv TProvider
cds TClientDataSet
qcds TQueryClientDataSet
dcom TDCOMConnection
olee TOleEnterpriseConnection
sck TSocketConnection
rms TRemoteServer
mid TMidasConnection
 
我有,不过一时找不到,等我找到给你吧
 
I. 总则

1.1 目的
为了对程序员的开发进行适当的规范化,特制定本规范。其根本目的,是为了保证程序具有良好的、一致的结构,以期提高程序的可读性及可维护性,方便程序的测试、维护、升级等工作,同时,也培养程序员书写代码的规范性。

1.2 原则
名称反映含义,形式反映结构;

1.3 申明
本规范适用于采用DELPHI作开发工具的公司所有项目,程序员应严格按照本规范编写代码,如项目有确实需要的特殊要求,也必须经项目经理审核后,把该特殊要求形成文档当作本文档的随附文件一起保存。


II.代码规范

2.1 项目规范

2.1.1. 每一个项目的代码、文档按模块、功能必须在项目文件夹中有条理的归类存放,每个项目文件夹中均必须包含以下子文件夹:
Code:源代码目录
Sql:数据库脚本目录
Demodata:演示数据目录
Userdata:用户数据目录
Help:帮助文档目录
Install:安装文件目录
Document:文档目录
Picture:图片目录
templates:报表模板目录
子文件夹下也必须依照详细的用途分类建立子目录。详细的示例如下:

示例:

Project Name
|
code sql demodata Picture help install document templates
| |
appserver client |
| 测试文档 设计文档 数据字典 需求分析 用户文档
module1 module2 module3 ……

2.1.2. 每个项目的主目录下均必须有一个项目说明文件,说明该项目的一些概要性提示和相关规范。

2.1.3. 在项目文件夹下的每层每个子目录中必须有一个文件夹说明文件,说明该层文件夹及其子文件夹的分类方法和含义。任何时候,新增一个文件夹时,均必须在同层目录下的文件夹说明文件中添加所新增文件夹的分类含义,同时创建该文件夹下的文件夹说明文件。

2.1.4. 工程文件代码规范:
A.任何一个工程文件(包括动态链接库工程文件)的第一部分必须用注释的形式说明项目名称、公司版权、工程描述、版本说明、创建日期、作者以及后续更新人员。
B.除主模块、公共函数模块和公共数据模块外,所有该项目下的单元不可由项目自动创建(CREATE),在加入新单元后,必须在工程文件中删除自动CREATE的语句。
C.工程文件的其余代码遵行本文档约定的单元规范及其它代码规范;

2.2 单元总体规范

2.2.1 每个单元的第一部分必须用注释的形式说明项目名称、公司版权;

2.2.2 必须紧接在单元名之后以注释的形式说明项目名称、模块名称、模块描述、模块版本、创建日期、作者、更新人以及TODO列表;

2.2.3 在INTERFACE部分USE的单元原则上只允许DELPHI的IDE自动添加,如确需自己添加必须在引用到的单元名后用{}注释添加原因。用于编译开关控制的伪指令插入在USE之前。

2.2.4 Interface部分应当只包含需要被外部单元访问的类型、变量、过程和函数的声明,而且这些声明应当在Implementation部分之前。

2.2.5 Implementation部分包含本单元私有的类型、变量、过程和函数的声明。

2.2.6 除非确实需要,不要在Initialization部分写过多代码,如有代码应详细注释说明必须写在Initialization部分的原因。

2.2.7 在Finalization部分释放所有在Initialization部分中分配的资源。

2.2.8 除主FORM外,每个FORM单元都应当含有实例化函数(入口函数),用于创建、设置、显示和释放FORM。FORM的变量应当从单元中移走,改在实例化函数中作为局部变量定义(要先从Project Options对话框的自动生成列表中移走该FORM)。(参见2.1.4.B)

2.2.9 总体风格
缩进规则:每级间保持两个空格。不要将"Tab"符号存储到源文件中,原因是"Tab"字符在不同的源代码管理中宽度会有不同的定义。在Tools | Editor Options 的General 页不要选中 Set Tab Character和Optimal Fill复选框,制表符"Tab"即不会被保存。
边距页宽:边距应保持默认设置的80个字符,只要可能,长度超过一行的语句必须用逗号或运算符换行。换行后,应缩进两个字符。
注释规则:只有在一行的行末注释时才用//,否则均必须使用{}来注释。
空行使用:需使用空行的地方有:版权块、类之间、方法过程函数之间、方法内部算法分段。空行只能用一行,多余的空行必须删除。
Begin…End:任何情况下,Begin和End均必须各自独占一行。End总和对应的Begin左对齐。
工具使用:所有单元提交给版本控制工具之前必须用Source Code Formatter格式化过。

示例:

{*******************************************************}
{ }
{ 项目名称 }
{ }
{ 版权所有 (C) 2000,2001 公司名称 }
{ }
{*******************************************************}

unit UnitName;
{*******************************************************
项目:
模块:
描述:
版本:
日期:
作者:
更新:
TODO:
*******************************************************}

interface

{$I IS.inc}

uses
----,----,----,----,----,----,----,----,----,----,----, ----;

const
--------------------;

type
--------------------;

var
--------------------;

implementation

uses
----,----,----,----;

{$R *.RES}
{$R *.DFM}

--------------------------------;
--------------------------------;
--------------------------------;

end.

2.3 单元内部规范

2.3.1 常量区:
A,所有常量的第一个前缀必须为C,常量必须分主题归类定义,如有多个主题,每一个主题必须加一个主题前缀。前缀与前缀之间、前缀与名称之间用_分割。
B,每个常量的定义单独一行,在同一行上,必须用//加注释说明该常量的含义。
C,按主题归类的常量,在每个主题开始的第一行必须用{}注释主题含义。

D,示例:

Const

{ 主题1 }
C_主题前缀1_--- = ----; // 含义
C_主题前缀1_--- = ----; // 含义
C_主题前缀1_--- = ----; // 含义
C_主题前缀1_--- = ----; // 含义
{ 主题2 }
C_主题前缀2_--- = ----; // 含义
C_主题前缀2_--- = ----; // 含义
C_主题前缀2_--- = ----; // 含义
C_主题前缀2_--- = ----; // 含义

2.3.2 类型区:
A,不提供服务的数据类型定义格式为:
T---- = --------- // 类型含义
B,有状态并提供服务的数据类型定义格式为:
T---- = class(----) //类型含义
private
--------
protected
--------
public
--------
published
--------
end;
C,原则上,数据类型及其内部方法、属性、数据定义时应按字母顺序排列。属性的读写方法分别以Get和Set为前缀命名。
D,内部数据、属性、方法定义规则:
D1,Private区
1、所有数据放在Private 区,以F打头。
2、所有事件属性对应的方法指针放在Private 区,以F打头。
3、不准备被继承的属性的Get与Set方法放在Private 区。
4、响应消息的方法放在Private 区。
D2,Protected区
1、被子类调用的但不能被外界调用的方法与属性。
2、供子类重载的方法 virsual; virsual; abstract。
D3,Public区
1、构建析构方法
2、供外界调用的方法
3、供外界调用的属性
D4,Published区
1、出现在Object Inspector里供设计时用的属性
2、出现在Object Inspector里供设计时用的事件响应
E,特殊的数据应在定义一行的行末用//注释其含义。特殊的属性、方法 应在定义前一行用{}注释其含义。事件指针的定义不需注释,但事件类型定义时必须在其前一行用{}注释其含义。

2.3.3 变量区
A,在变量区定义单元的全局变量。
B,每个需要注释的变量单独一行,在行末用//注释其含义。
C,同一类型且含义逻辑上不并列的变量分开定义,同一类型且含义逻辑上并列的变量在一起定义。
D,一般不鼓励使用全局变量。在确实需要使用全局变量的时候,必须把全局变量限制在需要的环境内,如:一个全局变量可能只在单元的Implementation部分是全局的,所以必须把其定义在该部分内。被多个单元使用的全局数据应该被移入一个公共模块中。
E,全局变量可以在定义时直接初始化为某一个值。注意:所有的全局变量将自动进行零初始化,所以,不要将全局变量初始化为空值,如0, nil, '', Unassigned。零初始化的全局变量在可执行文件中不占用空间,非零初始化的全局变量则在可执行文件中占空间。
F,变量的命名规则参见本文档后面的命名规则项。

2.3.4 实现区
A,事件、过程、函数应按主题分类归集在一起,每个主题开始的第一行用{}注释该类主题。约定归类方法如下:同一个元件的事件应归集在一起,被事件调用或与之相关系的函数或过程应紧跟在该事件之后,函数、过程、方法之间如存在调用关系也应归集在一起,除非该函数、过程被多处调用。被多处调用的单元内部函数、过程应归集在单元的公共过程主题内。可以自定义归类方法,比如按实现功能归类,但如归类方法不同于本约定的,应在所有主题之前用{}注释说明归类方法。
B,每一个事件、方法必须在其代码前用{}注释说明名称、描述、参数含义、创建时间、作者、更新人、更新时间。在事件、方法内部不同含义的算法或不同主题的代码间空一行,每段算法或主题的开始用{}注释算法或主题的目的。关键性的算法行应在行末用//注释算法目的。事件、方法内部的变量定义时必须遵行2.3.3约定的变量区规范。
C,SQL 语句书写规则:在SQL语句中,所有SQL保留字统一用大写,所有字段名以及数据表名全部用小写,SELECT, FROM, WHERE, ORDER BY 顶格起行,各子句中要求每个字段或每个条件或每个关联单独起行. 并缩进对齐,缩进以两格为准。示例如下:
strMasterSql :=
' SELECT preload.*, ' +
' codelib.codename vesselname' +
' blstatus = CASE blstatusid WHEN “1” THEN “订舱” ' +
' WHEN “2” THEN “配航线” ' +
' ELSE “其他” ' +
' END; ' +
' FROM preload ' +
' LEFT JOIN codelib ' +
' ON codelib.codecd = preload.vesselcd ' +
' AND codelib.classid = "03" ';
strMasterFilter :=
' WHERE preload.companycd = :companycd ' +
' AND preload.idno = :idno ';
strMasterOrder := 'ORDER BY preloadno';
注意:CASE...WHEN...THEN...ELSE...END语句的写法不同。
D,代码中用到数据库字段名称的地方,统一用小写。
E,元件本身的属性、事件名,要按照DELPHI自动提示的格式写。


2.4 Object Pascal 语法约定

2.4.1 语法杂项:
A,运算符前后要有各一个空格。
B,在开始圆括号和后一个字符,以及结束圆括号和上一个字符中不出现空格。不要在语句中出现不必要的括号。如 if (I=42) then 中,括号就是不必要的。
C,Object Pascal 语言的保留字和关键字总是小写。
D,一般不建议使用Variant和OleVariant,除非数据类型只有在运行期才能确定或获知的。OleVariant常常用来做基于COM的程序:Auutomation和ActiveX控制,Variant基于non-COM的程序。
E,代码中不可使用Real类型,对于浮点数,应当使用Double类型。
F,定义对象特性时,应当使用读写方法来访问。

2.4.2 过程与函数
A,形参的顺序主要要考虑寄存器调用规则,
最常用的参数应当作为第一个参数,按使用频率依次从左到右排。
输入参数应当位于输出参数之前。
范围大的参数应当放在范围小的参数之前,如SomeProc(Acountry, Astate, ACity)
IDE自动生成的事件句柄,参数顺序不必依此约定。
B,所有的常量参数应当标以Const标记。
C,为避免命名冲突,除调用公共模块的的例程外,调用其他模块的过程、函数时应当在例程名前加该例程所在的单元名。
D,除非确实需要在使用前再初始化,否则例程的内部变量应当在例程的入口处立即初始化。

2.4.3 语句规范
A,IF语句:
l 在if/then/else语句中,最可能执行的情况应放在then子句中,出现可能较小的情况放在else子句。
l 尽量避免使用连续的if语句,应该使用case语句来代替。
l 不要嵌套5层以上的if语句。
l 不要在if语句中使用多余的圆括号。
l 如果if语句中存在多个条件判断,条件应该按从最快的到最慢的计算难度依次从左到右排列整齐。
l IF语句的规范示例:
if (--------) then
-------------;

if (--------) then
begin
-------------;
-------------;
end;

if (--------) then
-------------
else
-------------;

if (--------) then
begin
-------------;
-------------;
end
else
-------------;

if (--------) then
begin
-------------;
-------------;
end
else
begin
-------------;
-------------;
end;

if (--------) then
-------------
else
if (--------) then
-------------;
B,CASE语句:
l CASE语句中,代表每种情况的常量应该按照数字或字母顺序排列。
l 每种情况所对应的动作语句应当简短且通常不超过4-5行。如果动作太复杂,应将代码放到一个单独的过程或函数中。
l CASE语句的ELSE子句只用于默认情况或错误检测。
l CASE语句的规范示例:
case -------- of
-------- : -------------;
-------- : -------------;
-------- : -------------;
else -------------;
end;

case -------- of
-------- :
-----------------------------------------------------------------;
-------- :
-----------------------------------------------------------------;
-------- :
-----------------------------------------------------------------;
else
-----------------------------------------------------------------;
end;

case -------- of
-------- : begin
--------------------------;
--------------------------;
--------------------------;
end;
-------- : begin
--------------------------;
--------------------------;
--------------------------;
end;
-------- : begin
--------------------------;
--------------------------;
--------------------------;
end
else
begin
-------------;
-------------;
-------------;
end;
end;
C,WHILE语句:
l 不要用Exit过程来跳出一个While循环。如果需要的话,应该使用循环条件退出循环。
l 所有对While循环进行初始化的代码应当位于While入口前,且不要被无关的语句分隔开。
l While语句的规范示例:
while ------ do
begin
-------------;
-------------;
-------------;
end;
D,FOR语句:
l 如果循环次数是确定的,应当用FOR语句代替WHILE语句。
l FOR语句的规范示例:
for I := -------- to -------- do
-------------;

for I := -------- to -------- do
begin
-------------;
-------------;
-------------;
end;

for I := -------- to -------- do
if (--------) then
begin
-------------;
-------------;
-------------;
end;

for I := -------- to -------- do
with -------- then
begin
-------------;
-------------;
-------------;
end;
E,REPEAT语句:
l repeat语句和while语句类似,且遵循同样的规则。
l Repeat语句的规范示例:
repeat
-------------;
-------------;
-------------;
until ------;
F,WITH语句:
l with语句应该尽量少的使用,尤其是有多个对象的WITH语句。
l With语句的规范示例:
with -------- do
-------------;

with -------- do
begin
-------------;
-------------;
-------------;
end;
G,try语句:
l 除非是在单元的initialization/finalization部分或者对象的构造/析构中分配/释放资源,否则,凡是分配资源的地方都必须使用TRY……FINALLY语句来保证资源得到释放。
l 可能的情况下,每个资源分配应当与一个try……finally结构配对。
l 不可以在try..exception中使用else字句,因为这样有可能阻碍其他所有的异常发生。
l 需要在发生异常时执行一些自定义的任务,才使用try……except,如果仅仅是为了显示一个错误信息,没有必要使用try……except,因为Application对象能够自动根据上下文做到这一点。
l 如果要在except子句中激活默认的异常处理,可以用raise再次触发异常。
l Try语句的规范示例:
try
-------------;
-------------;
-------------;
finally
-------------;
-------------;
-------------;
end;

try
try
-------------;
-------------;
-------------;
except
-------------;
-------------;
end;
finally
-------------;
-------------;
-------------;
end;

2.5 命名规范

2.5.1 过程、函数的命名规则。
A,例程名以大写字母开始,且应在具有不同词义单词的第一个字母处用大写。
B,例程名应当有意义,并应尽量使用动宾词组。
C,设置输入参数值的例程名应当以Set为其前缀,获取数值的例程名应当以Get为其前缀。
D,例程的形参名称应当表达出它的用途,只要可能,形参的名称应以字母A为前缀。
E,DELPHI的IDE自动产生的事件句柄,名称和参数不可作改动。

2.5.2 变量命名规则
A,变量的名称应当能表达出它的用途。尽量不缩写,并使用名词作为变量名。
B,变量名应该用类型的缩写作为前缀,比如strMasterSql。
B,循环控制变量可以是单个字母如I、J、K,也可以使用具有含义的名称。
C,布尔变量的名称必须能清楚的表示出True和False的意义。
E,工程的全局变量应该以G_作为前缀。单元内的全局变量应该以U_作为前缀。

2.5.3 类型、类、对象命名规则
A,定义枚举类型应在名称前加T作为前缀,枚举类型的标识符列表的前缀应包含2~3个小写字符,来彼此关联。如:
TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal);
一个枚举类型的变量名命名为类型名字去掉前缀"T",除非由于某个原因给这个变量更有意义的名字。
B,数组类型名应表达出该数组的用途,类型名必须加字母T为前缀。如果要声明一个指向数组类型的指针,则必须加字母P为前缀,且应声明在类型声明之前。如:
type PCycleArray = ^TCycleArray;
TCycleArray = array[1..100] of integer;
数组类型的变量命名为类型名去掉前缀"T"。
C,记录类型名应表达出该记录的用途,类型名必须加字母T为前缀。如果要声明一个指向记录类型的指针,则必须加字母P为前缀,且应声明在类型声明之前。
D,类的名字必须是能够体现这个类的用途。类型名必须以字符"T"开始来表明他是一个类型定义。类型的实例名字通常和类型名相匹配而没有字符"T"。
E,类的私有数据域(Fields)命名规则和其他的变量一样,但必须在前面加上字符"F"。
F,类的方法命名和过程、函数的命名一样。
G,类的属性名应该是名词,不是动词。属性的命名规则与类的私有数据域相同,但不要加F前缀。
H,类的事件命名应以ON、BEFORE、AFTER作为前缀。

2.5.4 文件命名规范
A,工程文件:工程文件应该赋予有意义的名字。可以取工程的全称组成单词的开始字符的大写,或者每个单词的缩写。也可以直接用单个单词命名。
B,窗体文件:窗体文件的名称必须能表达Form的用途,并且具有frm前缀。
C,数据模块文件:Data Module文件的名称必须能表达数据模块的用途,并且具有dm前缀。
D,远程数据模块文件:Remote Data Module文件的名称必须能表达远程数据模块的用途,并且具有rdm前缀。
E,单元文件:窗体及数据模块的单元文件名称应与相应的Form和数据模块名称相同。通用单元(如公共函数库、变量库、常量库等)的命名应尽量表达它的含义,并以Lib作为前缀。

2.5.5 窗体、数据模块的命名规则
A,FORM类型的名称应当表达出FORM的用途,且要加Tfrm为前缀,后跟描述性的名称。
B,FORM实例的名称与相应的类型名称相同,但没有前缀T。
C,数据模块的类型名称应为:前缀Tdm + 描述性名称。
D,数据模块实例的名称与相应的类型名称相同,但没有前缀T。

2.5.6 元件命名规则
A,组件命名标准和类的命名标准相似。不同的是他们有三个字符的标志性前缀,用来表明公司、个人等。作为前缀的三个字符要用小写。
B,元件的注册单元名称应为三个字符前缀加Reg,前缀与元件前缀相同。
C,元件实例命名规则:元件类型前缀 + 描述性名称。
D,DELPHI标准元件的类型前缀如下:
Standard Tab

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 Tab
 
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 Tab
  
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 Tab
  
tm TTimer
pb TPaintBox
mp TMediaPlayer
olec TOleContainer
ddcc TDDEClientConv
ddci TDDEClientItem
ddsc TDDEServerConv
ddsi TDDEServerItem

Internet Tab
  
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 Tab
  
ds TDataSource
tbl TTable
qry TQuery
sp TStoredProc
db TDataBase
ssn TSession
bm TBatchMove
usql TUpdateSQL

Data Controls Tab
  
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 Tab
  
dcb TDecisionCube
dcq TDecisionQuery
dcs TDecisionSource
dcp TDecisionPivot
dcg TDecisionGrid
dcgr TDecisionGraph

QReport Tab
  
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

Win31 Tab
  
dbll TDBLookupList
dblc TDBLookupCombo
ts TTabSet
ol TOutline
tnb TTabbedNoteBook
nb TNoteBook
hdr THeader
flb TFileListBox
dlb TDirectoryListBox
dcb TDriveComboBox
fcb TFilterComboBox

Samples Tab
  
gg TGauge
cg TColorGrid
spb TSpinButton
spe TSpinEdit
dol TDirectoryOutline
cal TCalendar
ibea TIBEventAlerter

ActiveX Tab
  
cfx TChartFX
vsp TVSSpell
f1b TF1Book
vtc TVTChart
grp TGraph

Midas Tab
  
psp TDatasetProvider
cds TClientDataSet
dcom TDCOMConnection
olee TOleEnterpriseConnection
sck TSocketConnection
rms TRemoteServer
mid TmidasConnection

ADO Tab
  
adocn ADOConnection
adocm ADOCommand
adods ADODataSet
adot ADOTable
adoq ADOQuery
adosp ADOStoreProc
rdsc RDSConnection

InterBase Tab

ibt IBTable
ibq IBQuery
ibsp IBStoreProc
ibd IBDatabase
ibts IBTransaction
ibu IBUpdateSQL
ibds IBDataSet
ibsql IBSQL
ibdi IBDatabaseInfo
ibsm IBSQLMonitor
ibe IBEvents

III. 补充事项

3.1 本文档如有不明之处,或需要修改的,必须提请项目经理审批、核准。

3.2 文档如有变更,变更日期及变更人应在1.4中注明。
 
ad311500,找到发给我邮箱:yukaikai@sina.com;多谢了。
 
Delphi园地中有一篇Delphi代码规范:
http://mydelphi.8u8.com/wd.htm
 
多人接受答案了。
 
后退
顶部