Delphi源程序格式书写规范
Delphi编程代码规范

循环控制变量常常为单个字母,诸如I、J或K。也可以使用更有意义的名称,例如UserIndex。布尔变量名必须能清楚表示出True和False值的意义。
2.4.2 局部变量
局部变量用于例程内部,遵循其他变量的命名规则。
局部变量加前缀l_(循环控制变量除外),如l_UserName。
2.8 构造类型
2.8.1 数组类型
数组类型名应表达出该数组的用途。类型名必须加字母T为前缀。如果要声明一个指向数组类型的指针,则必须加字母P为前缀,且声明在类型声明之前。例如:
type
PCycleArray = ^TCycleArray;
TCycleArray = array[1..100] of integer;
■ 命名冲突
当两个单元中含有相同名称的例程时,如果调用该例程,实际被调用的是uses子句中最后出现的那个单元中的例程。为避免这种情况,可在方法名前加想要的单元名,例如:
SysUtils.FindClose(SR);
或
Windows.FindClose(Handle)
2.4 变量
2.4.1 变量的命名与格式
WindowsHandle: HWND; // Win32 API 类型
i: Integer; // 在System单元中介绍的类型标识
2.7.2 浮点型
不鼓励使用Real类型,因为它只是为了与老的Pascal代码兼容而保留的。通常情况下对于浮点数应当使用Double。Double可被处理器优化,是IEEE定义的标准的数据格式。当需要比Double提供的范围更大时,可以使用Extend。Extend是Intel专用的类型,Java不支持。当浮点变量的物理字节数很重要时(可能使用其他语言编写的DLL),则应当使用Single。
Delphi编程-程序代码编写规范

附录A 编码规范管理程序代码编写规范通常一个大型应用系统,都是由多人共同完成的。
在这种环境下如何实现相互之间的交流呢,这就要求同一个程序组的编程风格要基本一致。
这里,除了以上讲到的命令和界面要一致外,还包括程序代码的规范。
而程序代码的规范主要有以下几个方面的内容:一、代码及注释规范1.代码中所有保留字的大小写要一致,这里我们规定都用小写;2.注释要求:●单元的头注释中要求指明的项目如下示例:(******************************************************** 建立日期:年月日;* 作者:* 最近更新时间:******************************************************** 单元主要功能描述:********************************************************* 修改记录* =======* 修改日期:* 修改原因:* 修改简要情况:*******************************************************)●过程和函数注释中除了指明该过程或函数的功能外,在该过程或函数中的重要方法的语句的作用都要加注(显而易见的语句除外,当然这个度是靠每个人自己把握)。
●公用变量也要求被注释,以说明该变量的用途。
●被引用自制构件或第三方构件单元,要求与系统中的单元区分开,可另起一行,并在中间加入注释如:{ 以下为自制构件及第三方构件单元}●被引用的单元要求注释如,usesDataMod; { 数据模块 }3.变量申明位置要求:●全局变量要求在程序接口部分的var下面申明;●公用变量要求在public部分申明;●私有变量要求在private部分申明;●对于用作for循环的变量,如i、j、k等应该在使用该变量的过程或函数中去申明,不得在public、private以及程序接口部分的var下面申明;●只在一个过程或函数中使用的变量或方法,和用作for循环的变量一样,应在使用该变量的过程或函数中去申明。
程序设计规范(Delphi)

程序设计规范(Delphi)1.概述:1.1. 编写目的本规范规定了YUNTONG-TECH程序在编写过程中涉及到的程序文件和编码风格。
本规范以Delphi 语言为标准制定,使用其它编程语言的编码风格和规范在相关的文档中规定。
1.2. 参考资料(1)程序员指南,Microsoft Press(2)Windows界面应用程序设计指南,Microsoft Press(3)Delphi 5 开发人员指南,机械工业出版社(4)程序设计规范VB,聂俊华,北航十四系2.程序文件1.1. 项目文件的组织在Delphi中,按照项目为单位来组织程序文件。
在一个典型的项目中包括:(1)项目文件(.DRP文件)含有工程主程序的Pascal源代码;(2)单元文件(.PAS文件)项目中每个窗体的Pascal源文件,包含该窗体的所有声明和过程(包括时间处理过程);(3)窗体文件(.DFM文件)含有一个窗体的设计属性的二进制文件,每个窗体的.DFM文件与.PAS文件相互对应;(4)资源文件(.RES文件)编译的二进制资源文件,被链接到应用程序的可执行文件中;(5)项目选项文件(.DOF文件)存储了Project|Options菜单命令所设置的项目选项;(6)桌面设置文件(.DSK文件)存储了Tools|Options菜单命令所设置的桌面选项;(7)包文件(.DPK/.BPL文件)用于共享组件、类、数据和代码的文件。
源文件为.DPK文件,编译后为.BPL文件;每个软件项目应使用独立的目录,软件项目下的不同类别文件、不同模块分设子目录。
以下给出软件项目及软件模块中,设置子目录名称的规范:子目录说明\Bin 建立产品的工作目录,存放项目中所有可执行文件的当前版本。
\Lib 与项目有关的库文件。
\Man 包括项目的所有外部文档。
包括手册、帮助文件、其他在线文档、README文件以及其他将和产品一起发放到用户手中的文档。
\SQL 存放数据库的SQL文件(只针对数据库程序的开发) 。
delphi源码

Delphi源码1. 简介Delphi是一种面向对象的编程语言,由Borland公司于1995年推出。
它基于Object Pascal语言,并结合了图形化用户界面设计和RAD(快速应用程序开发)工具。
Delphi主要用于Windows平台上的应用程序开发,特别适用于快速构建桌面应用程序。
Delphi的源码是指Delphi程序的源代码文件。
在Delphi 中,我们可以通过源码文件来编写程序的逻辑和功能。
这些源码文件包含了程序的各个模块和单元的实现代码,以及相应的声明和定义。
2. Delphi源码文件格式Delphi源码文件通常以.pas为扩展名,表示Pascal源码文件。
每个源码文件通常对应一个单元(Unit),用于实现一个代码模块。
在Delphi中,一个工程可以由多个单元组成,这些单元可以相互引用和调用。
Delphi源码文件以UTF-8编码保存,可以使用任何文本编辑器打开和编辑。
在Delphi的集成开发环境(IDE)中,我们可以使用Delphi自带的代码编辑器来编写和编辑源码文件,它提供了丰富的代码提示和自动补全功能,以提高开发效率。
3. Delphi源码的语法Delphi的源码是基于Object Pascal语言的,具有类似于其他编程语言的基本语法。
以下是一些Delphi源码的语法特点:3.1 变量声明在Delphi中,我们可以使用var关键字来声明变量。
例如:vari: Integer;s: string;3.2 过程和函数Delphi中可以定义过程(Procedure)和函数(Function)来实现一段可复用的代码逻辑。
过程和函数可以有参数和返回值。
例如:procedure ShowMessage(message: string);beginMessageBox(0, PChar(message), '提示', MB_OK); end;function Add(x, y: Integer): Integer;beginResult := x + y;end;3.3 类和对象Delphi是一种面向对象的编程语言,支持类和对象的概念。
Delphi程序员代码编写标准指南

Delphi 程序员代码编写标准指南一、序言二、通用源代码格式规则2.1 缩格2.2 页边空格2.3 Begin…End 配对三、Object Pascal3.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开发者指南下进行编程的代码编写标准。
Delphi代码规范

Delphi 开发指南——编码标准文档版权所有?1998 Xavier Pacheco 及Steve Teixeira翻译2000 李颖(e.w@)目录1.导言2.一般源代码格式规范缩进页宽Begin..End 对3.Object Pascal 语言3.1括号3.2保留字和关键字3.3过程和函数(子程序)3.4变量3.5语句if 语句case 语句while 语句for 语句repeat 语句with 语句3.6结构化的意外处理概要try..finally 的使用try..except 的使用try..except..else 的使用3.7类(Classes)域(Fields)方法(Methods)静态方法(Static Methods)的使用虚/动态方法(Virtual/Dynamic Methods)的使用抽象方法(Abstract Methods)的使用属性访问方法(Property AccessMethods)属性(Properties)命名规则访问方法的使用4文件工程(Project)文件窗体(Form)文件数据模块(Data Module)文件远程数据模块(Remote Data Module)文件单元(Unit)文件一般单元结构单元名称Uses 子句Interface 部分Implementation 部分Initialization 部分Finalization 部分窗体单元数据模块单元一般用途单元组件(Component)单元文件头5.窗体和数据模块窗体窗体类型命名标准窗体实例命名标准自动创建窗体模式化(Modal)窗体实例函数数据模块数据模块命名规则数据模块实例命名规则6.包(Packages)运行期(Runtime)和设计期(Design)包的使用文件命名规则7. 组件(Components)7.1用户自定义组件7.2组件单元7.3注册(Registration)单元的使用7.4组件实例命名约定7.5组件前缀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 标准. 和大多数编码规范文档一样, 本文档将根据需要继续更新. 因此, 你可以在/ddg 在线得到最新版本. 本文档不会包括用户界面标准. 这是一个不同的但同样重要的主题. 大量的第三方书籍和Microsoft 文档都包括了这些指南, 因此我们决定不再重复这些信息, 而是将你指引到Microsoft Developers Network 和其他信息来源. .一般编码格式规范缩进缩进应该是每行2个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度.你可以禁止保存Tab字符, 方法是通过Tools | Environment 菜单打开Environment Options 对话框, 然后在Editor 页中关闭"Use tab character" 和"Optimal 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 = thenbegin...endelse beginSomeOtherStatement;end;end 语句永远单独作为一行.如果begin 语句不是else 子句的一部分, 相应的end 语句应该缩进到与begin 对齐的位置.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 类型变量自动初始化为nil, Variant 和OleVariant 类型变量自动初始化为Unassigned.全局变量的使用使用全局变量不是好习惯, 但也有可能必须使用全局变量. 如果是这样, 建议你尽量保持全部变量在它可用的范围内与上下文相关. 例如, 一个全局变量可能只在某个单元的implementation 部分可用.打算供几个单元公用的全局数据应该移到一个公用单元中.全局数据可以在var 部分用一个值立即初始化. 注意, 所有的全局数据初始状态下都自动归零, 因此不要将全局变量初始化为"空"值, 比如0, nil, '', Unassigned 等等. 全局数据自动归零的原因之一是因为初始状态为0的全局数据在exe 文件中不占据空间. 初始状态为0的数据将存储在一个"虚"数据段中, 这个数据库只在应用程序启动时从内存中分配. 初始状态非0的全局数据则必须在磁盘上的exe 文件中占据空间.类型大小写约定类型名称如果是保留字, 则必须完全小写. Win32 API 类型一般完全大写, 你应该遵循Windows.pas 和其他API 单元中某些类型名称的约定. 其他变量名称, 首字母应该大写, 其余部分也应该足够清楚. 下面是几个例子:varMyString: string; // 保留字WindowHandle: HWND; // Win32 API 类型I: Integer; // 在System 单元中引入的类型标识符浮点(Floating Point)类型使用Real 类型是不好的, 因为它仅仅是为了与旧的Pascal 代码保持向后兼容而保留的. 对于一般的浮点运算应该使用Double 类型. Double 是IEEE 定义的标准数据格式, 处理器指令以及系统总线都为处理Double 类型而进行过优化. Extended 类型应该只在需要比Double 更大的数据范围时使用. Extended 是Intel 指定类型, Java 不支持. Single 类型应该只在浮点变量本身占用的字节大小很重要的情况下使用, 比如使用其他语言编写的DLL 时.枚举(Enumerated)类型枚举类型名称应该具有与其用途相关的含义. 类型名称必须以字符T 为前缀, 表示是一个类型声明. 枚举类型的标识符序列必须以2到3个小写字符为前缀, 而且前缀必须与类型名有联系, 例如:TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);枚举类型的变量实例的名称应该与不带T 前缀的类型名称相同, 除非有其他原因需要更详细的名称, 比如FavoriteSongType1, FavoriteSongType2, 等等.Variant 和OleVariant一般来说使用Variant and OleVariant 类型是不好的, 但如果数据类型只能在运行时确定, 就必须使用这些类型了, 比如开发COM 和数据库程序时. OleVariant 常用于开发基于COM 的程序, 比如OLE 自动化和ActiveX 控件. Variant 则常用于非COM 程序. 原因是Variant 能(与字符串变量一样)更高效地存储Delphi 字符串, 但OleVariant 需要把所有的字符串转换为Ole Strings(WideChar Strings), 而且由于没有引用记数, 字符串将永远存在.结构类型数组类型数组类型名称应该具有与其用途相关的含义. 类型名必须以字符T 为前缀. 如果声明了指向该数组类型的指针类型, 则其名称必须以字符P 为前缀, 而且必须在数组类型的前一行位置进行声明, 例如:typePCycleArray = ^TCycleArray;TCycleArray = array[1..100] of integer;数组类型变量实例名称应该与不带字符T 前缀的类型名称相同.记录类型记录类型名称应该具有与其用途相关的含义. 类型名必须以字符T 为前缀. 如果声明了指向该记录类型的指针类型, 则其名称必须以字符P 为前缀, 而且必须在记录类型的前一行位置进行声明. 记录元素的声明应该对齐为一列, 例如:typePEmployee = ^TEmployee;TEmployee = recordEmployeeName: stringEmployeeRate: 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 thencase 语句概要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 以确保资源被正确释放. 在单元的initialization/finalization 中或在对象的constructor/destructor 中分配/释放资源的情况不在此列.try..finally 的使用任何可能的地方, 所有的资源分配代码都必须以try..finally 结构保护起来.例如, 下面的代码可能导致的bug:SomeClass1 := TSomeClass.CreateSomeClass2 := TSomeClass.Create;try{ do some code }finallySomeClass1.Free;SomeClass2.Free;end;更安全的做法应该是:SomeClass1 := TSomeClass.CreatetrySomeClass2 := TSomeClass.Create;try{ do some code }finallySomeClass2.Free;end;finallySomeClass1.Free;end;try..except 的使用try..except 应该只在你需要在产生意外时执行任务的情况下使用. 一般来说, 你不需要使用try..except 来简单地显示错误信息, 因为应用程序将通过Application 对象自动实现这一点. 在except 子句中, 如果你希望在执行过自己的任务后再调用缺省的意外处理程序, 应该使用raise 来再次产生这个意外.try..except..else 的使用在try..except 中使用else 子句是不好的, 因为它将阻塞所有的意外, 包括那些你没有准备处理的意外.类命名规则类的类型名称应该具有与其用途相关的含义, 类型名必须以字符T 为前缀, 表明这是一个类型定义, 例如:typeTCustomer = class(TObject)类的实例名称一般与不带T 前缀的类名称一样, 例如varCustomer: TCustomer;注意: 关于组件命名的更多信息, 请参见"组件类型命名标准" 部分.域命名规则类的域遵循与变量一样的命名约定, 除非以字符F 前缀表示是重要的域名称.可见度(Visibility)所有的域都应该是私有的(private). 可在类范围外访问的域应该通过属性来实现.方法命名规则类方法与过程和函数遵循相同的命名约定.静态方法的使用如果你不希望方法在派生类中被重载(override), 应该使用静态方法.虚/动态方法的使用如果你希望方法在子类中被重载, 应该使用虚方法方法. 动态方法应该只在存在大量(直接和非直接)派生类的类中使用. 例如, 一个类中包含一个很少被重载的方法, 但这个类有100个派生类, 则应该将这个方法设置为动态方法, 以减少这100个派生类消耗的内存.抽象方法的使用不要在会创建实例的类中使用抽象方法. 抽象方法应该只在不会创建实例的基类(base classes)中使用.属性存取方法所有的属性存取方法应该出现在类定义的私有或保护部分.属性存取方法遵循与过程和函数相同的命名约定. 取值方法必须以单词Get 为前缀, 赋值方法必须以单词Set 为前缀, 赋值方法参数必须命名为Value, 类型应该与属性描述的一致, 例如:TSomeClass = class(TObject)privateFSomeField: Integer;protectedfunction GetSomeField: Integer;procedure SetSomeField( Value: Integer);publicproperty SomeField: Integer read GetSomeField write SetSomeField;end;属性命名规则用于存取私有域的属性应该与相应的域名称系统, 但没有F 前缀.属性名应该是名词, 而不是动词. 属性表示数据, 方法则表示动作.数组属性名应该是复数形式. 普通属性名应该是单数形式.存取方法的使用尽管不是必要的, 我们仍然建议你为访问私有域的属性最少建立一个的赋值方法.文件工程文件工程文件名称应该具有描述性. 例如, The Delphi 4 Developer's Guide Bug Manager 的工程命名为: DDGBugs.dpr. 一个系统信息程序命名为SysInfo.dpr.窗体文件命名窗体文件名称应该具有描述性, 并与其用途相关. 名称应该带有Frm 后缀. 例如, About 窗体的文件名为AboutFrm.dpr. Main 窗体的文件名为MainFrm.dpr.数据模块文件命名数据模块名称应该具有描述性, 并与其用途相关. 名称应该带有DM 后缀. 例如, Customers 数据模块的文件名为CustomersDM.dfm.远程数据模块文件命名远程数据模块名称应该具有描述性, 并与其用途相关. 名称应该带有RDM 后缀.例如, Customers 远程数据模块的文件名为CustomersRDM.dfm.单元文件一般单元结构单元名称单元文件名称应该带描述性. 例如, 包含应用程序主窗体的单元应该命名为MainFrm.pas.Uses 子句interface 部分的uses 子句应该只包括interface 部分中代码需要的单元. Delphi 自动加入的无关的单元名应该删除.implementation 部分的uses 子句应该只包括implementation 部分中代码需要的单元. 无关的单元名应该删除.Interface 部分Interface 部分应该只包括可被外部单元访问的类型声明, 变量声明, 过程/函数的预先声明, 等等. 其他内容应该在implementation 部分.Implementation 部分Implementation 部分应该包括类型本单元私有的类型声明, 变量声明, 过程/函数.Initialization 部分不要将耗费大量时间的代码放在单元的initialization 部分. 这将导致应用程序启动缓慢.Finalization 部分确保你释放了在Initialization 部分分配的全部项目.窗体单元命名窗体的单元文件名应该与窗体文件名相同. 例如, About 窗体的单元文件名为AboutFrm.pas. Main 窗体的单元文件名为MainFrm.pas.数据模块单元命名数据模块的单元文件名应该与数据模块的文件名相同. 例如, Customers 数据模块的单元文件名为CustomersDM.pas.一般用途单元命名一般用途单元名称应该具有含义, 并与其用途相关. 例如, 一个实用程序单元命名为BugUtilities.pas. 一个包含全局变量的单元命名为CustomerGlobals.pas.记住, 单元名在工程使用的所有包内应该是唯一的. 因此建议你不要使用过于抽象或普通的单元名.组件单元命名组件单元应该保存在单独的目录下, 以便将它们作为用户自定义组件和组件包区分开. 绝对不要与工程保存在相同的目录下. 单元名应该能表示其内容.注意: 关于组件命名标准的更详细信息, 请参见"用户自定义组件"部分.文件头建议在所有的源文件, 工程文件, 单元文件等等中使用包含信息的文件头. 正确的文件头应该包括以下信息:{Copyright ?YEAR by AUTHORS}窗体和数据模块窗体窗体类型命名标准窗体类型名称应该描述其用途. 类型定义应该以字符T 为前缀, 描述性的名称跟随在前缀之后. 最后, Form 作为后缀跟在描述性的名称之后. 例如, About 窗体的类型名称应该是:TAboutForm = class(TForm)Main 窗体的定义应该是TMainForm = class(TForm)客户登记窗体的名称类似于TCustomerEntryForm = class(TForm)窗体实例命名标准窗体实例应该命名为与类名一致, 但不带T 前缀. 例如, 上述窗体类型, 其实例名称如下:Type Name Instance NameTAboutForm AboutFormTMainForm MainFormTCustomerEntryForm CustomerEntryForm自动创建窗体除非有其他更好的理由, 否则应该只有主窗体是自动创建的. 其他所有窗体应该从Project Options 对话框的Auto-Create Forms 列表中删除. 详情请阅读下面的部分.模式化(Modal)窗体实例函数所有的窗体单元应该包含一个窗体实例化函数, 这个函数将创建, 设置, 模式化显示, 释放窗体, 并返回窗体模式化(modal result)结果. 传递给该函数的参数遵循本文档规定的"参数传递"标准. 使用这样的函数的目的是为了封装窗体的使用, 使得代码更易于重用和维护.窗体变量应该从单元中删除, 并在函数中声明为局部变量. 注意, 这需要先将窗体从Project Options 对话框的Auto-Create Forms 列表中删除参见本文档的"自动创建窗体"部分.例如, 下面的单元说明了为GetUserData 窗体编写的一个这样的函数.unit UserDataFrm;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;typeTUserDataForm = 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;varUserDataForm: TUserDataForm;beginUserDataForm := TUserDataForm.Create(Application);tryUserDataForm.Caption := 'Getting User Data';Result := UserDataForm.ShowModal;if ( Result = mrOK ) thenbeginaUserName := UserDataForm.edtUserName.Text;aUserID := StrToInt(UserDataForm.edtUserID.Text);end;finallyUserDataForm.Free;end;end;end.数据模块数据模块命名标准DataModule 类型名称应该描述其用途. 类型定义应该以字符T 为前缀, 描述性的名称跟随在前缀之后. 最后, DataModule 作为后缀跟在描述性的名称之后. 例如, Customer 数据模块的类型名称类似于:TCustomerDataModule = class(TDataModule)Orders 数据模块的类型名称类似于TOrdersDataModule = class(TDataModule)数据模块实例命名标准数据模块实例名称应该与类型名称一致, 但不带T 前缀. 例如, 上述数据模块类型, 其实例名称如下:Type Name Instance NameTCustomerDataModule CustomerDataModuleTOrdersDataModule 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 附带的标准组件. 如果安装了第三方组件, 请增加这份列表.。
Delphi编码规范(精)

ObjectPascal
保留字和关键字 过程和函数 变量
保留字和关键字
Object Pascal语言的保留字和关键字总 是完全的小写。
过程和函数
过程/函数名应当以大写字母开始,且大小 写交错以增加可读性。 下面是一个不正确的写法:
procedure thisisapoorlyformattedroutinename; 改成这样写就对了: Procedure ThisIsMuchMoreReadableRoutineName;
Delphi编码规范
概述
制定编码规范的目的是为了使一组程序 员生成同样风格的代码,使一个团队形 成并保持一定的风格。如果这个目标能 够实现,那么整个项目的文件看上去就 像是一个程序员写的。从而会在很大程 度上提高代码的可维护性,也因此会降 低维护费用。
1. 2. 3. 4. 5.
一般的源代码格式规则 ObjectPascalbx TComboBox grpbx TGroupBox rdgrp TRadioGroup dts TDataSource adotbl TADOTable adoqry TADOQuery adocnn TADOConnection
常用组件的前缀(续)
dbgrd TDBGrid dbnv TDBNavigator dbtxt TDBText dbedt TDBEdit dbmem TDBMemo
窗体文件
窗体文件的名称应当表达出窗体的用途 ,且具有Frm后缀。例如,About窗体的 文件名叫AboutFrm.pas,主窗体的文件 名叫MainFrm.pas
数据模块文件
数据模块文件的名称应当表达出数据模 块的作用,且具有DM后缀。例如, Customers数据模块的文件名叫 CustomersDM.dfm。
Delphi源程序格式书写规范

Delphi语言编码规范0总则0.1目标为了使软件开发人员在项目开发中统一编码行为和风格,从而有利于软件项目的健康发展,特制订本规范。
本规范的最终目的是统一软件信息表达方式,使他们在编程时有一致格式可遵循,便于软件开发中准确地交流信息以及日后的软件测试、维护和升级。
0.2适用范围本规范规定了以标准Delphi7语言为开发工具的程序员和系统分析员所应遵循的标准和定义.0.3阅读对象本文档适用于了解Delphi7语言基本编程规则的程序员或软件工程师。
0.4相关文档0.5文档变更0.6一致性凡所有使用Delphi7开发的软件都必须遵循本文档的要求,第三方软件可以有例外。
其中,规则必须遵守,而建议则希望被遵守,如不能遵守,其原因必须作书面记载。
所有对规则的违背都必须有书面记载,并将结果记录到文档讨论区。
1规则和建议1.1文件目录1.1.1规则:项目目录结构--00 Component(所需要控件)--01 Build (编译的文件)--02 Release (可发布的执行文件)--03 Source (源码路径)--04 Test (测试源码)--ReadMe.TXT (关于本文件夹说明)1.1.2建议:每个源码文件夹中建立 ReadMe.TXT文件,描述本文件夹中的文件和说明。
1.2项目命名1.2.1规则:项目文件必须使用一个有意义的名字。
范例: Delphi中系统信息的项目文件被命名为 SysInfo.dpr。
1.3窗体文件命名1.3.1规则:窗体文件名称同窗体的名称相一致,并且使用‘frm’作为前缀。
范例:Form的名称为frmMain,则Form文件的名称就为frmMain.frm。
1.4数据窗体模块文件命名1.4.1规则:数据窗体模块文件的命名应该有意义,并且使用‘dm’作为前缀。
范例:用户data module 被命名为‘dmCustomer.dfm’。
1.5远程数据窗体模块文件命名1.5.1规则:远程数据模块文件的命名应该有意义,并且使用‘rdm’作为前缀。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Delphi 源程序格式书写规范感谢 tianhaiyise 提供的来自/的译本1.规范简介本规范主要规定Delphi源程序在书写过程中所应遵循的规则及注意事项。
编写该规范的目的是使公司软件开发人员的源代码书写习惯保持一致。
这样做可以使每一个组员都可以理解其它组员的代码,以便于源代码的二次开发记忆系统的维护。
2.一般格式规范2.1缩进缩进就是在当源程序的级改变时为增加可读性而露出的两个空格。
缩进的规则为每一级缩进两个空格。
不准许使用Tab。
因为Tab会因为用户所作的设置不同而产生不同的效果。
当遇到begin 或进入判断、循环、异常处理、with语句、记录类型声明、类声明等的时侯增加一级,当遇到end或退出判断、循环、异常处理、with语句、记录类型声明、类声明等的时侯减少一级。
例如:if TmpInt <> 100 thenTmpInt := 100;2.2 Begin..Endbegin语句和end语句在源程序中要独占一行,例如:for I := 0 to 10 do begin //不正确的用法end;for I := 0 to 10 do //正确的用法beginend;2.3空格在操作符及逻辑判断符号的两端添加空格,例如:I := I + 1;,a and b 等,但添加括号时不需要空格。
例如:if ( a > b ) then //错误的用法If (a > b) then //正确的用法又例如:procedure Test(Param1: integer; Param3: string);3. Object Pascal语法书写格式规范3.1保留字Object Pascal 语言的保留字或关键词应全部使用小写字母。
3.2过程和函数3.2.1命名及格式过程和函数的名称应全部使用有意义的单词组成,并且所有单词的第一个字母应该使用大写字母。
例如:procedure formatharddisk;//不正确的命名procedure FormatHardDisk;//正确的命名设置变量内容的过程和函数,应使用Set作为前缀,例如:procedure SetUserName;读取变量内容的过程和函数,应使用Get作为前缀,例如:function GetUserName: string;3.2.2 过程和函数的参数3.2.2.1命名统一类型的参数写在同一句中:procedure Foo(Param1, Param2, Param3: Integer; Param4: string);3.2.2.2命名所有参数必须是有意义的;并且当参数名称和其它属性名称重了的时候,加一个前缀'A', 例如:procedure SomeProc(AUserName: string; AUserAge: integer);3.2.2.3命名冲突当使用的两个unit中包括一个重名的函数或过程时, 那幺当你引用这一函数或过程时,将执行在use 子句中后声明的那个unit中的函数或过程。
为了避免这种'uses-clause-dependent'需要在引用函数或过程时,写完整函数或过程的出处。
例如:SysUtils.FindClose(SR);Windows.FindClose(Handle);3.3 变量3.3.1 变量命名及格式首先所有变量必须起有意义的名字,使其它组员可以很容易读懂变量所代表的意义,变量命名可以采用同义的英文命名,可使用几个英文单词,但每一单词的首字母必须大写。
例如:varWriteFormat::string;同时对于一些特定类型可采用一定的简写如下:指针类型P纪录类型Rec数组类型Arr类Class循环控制变量通常使用单一的字符如:i, j, 或 k。
另外使用一个有意义的名字例如:UserIndex ,也是准许的。
3.3.2 局部变量在过程中使用局部变量遵循所有其它变量的命名规则。
3.3.3 全局变量尽量不使用全局变量,如必须使用全局变量则必须加前缀'g',同时应在变量名称中体现变量的类型。
例如:gprecUserCount: point;//名称为UserCount的全局变量,其类型为指向一结构的指针但是在模块内部可以使用全局变量。
所有模块内全局变量必须用'F'为前缀。
如果几个模块之间需要进行资料交换,则需要通过声明属性的方法来实现。
例如:typeTFormOverdraftReturn = class(TForm)private{ Private declarations }FuserName: string;FuserCount: Integer;Procedure SetUserName(Value: string);Function GetUserName: string;public{ Public declarations }property UserName: string read GetUserName write SetUserName;property UserCount: Integer read FuserCount write FuserCount;end;3.4类型3.4.1 大小写协议保留字的类型名称必须全部小写。
Win32 API 的类型通常全部大写,对于其它类型则首字母大写,其余字母小写,例如:varMyString: string; // reserved wordWindowHandle: HWND; // Win32 API typeI: Integer; // type identifier introduced in System unit3.4.2 浮点类型尽量不使用 Real 类型,他只是为了和旧的Pascal代码兼容,尽量使用Double 类型。
Double 类型是对处理器和数据总线做过最优化的并且是IEEE定义的标准数据结构。
当数值超出Double的范围时,使用Extended 。
但Extended不被Jave支持。
但使用其它语言编写的DLL 时可能会使用Single 类型。
3.4.3 枚举类型枚举类型的名字必须有意义并且类型的名字之前要加前缀'T'。
枚举类型的内容的名字必须包含枚举类型名称的简写,例如:TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);3.4.4 数组类型数组类型的名字必须有意义并且类型的名字之前要加前缀'T'。
如果声明一个指向数组类型的指针必须在该类型的名字之前加前缀'P',例如:typePCycleArray = ^TCycleArray;TCycleArray = array[1..100] of integer;3.4.5记录类型记录类型的名字必须有意义并且类型的名字之前要加前缀'T'。
如果声明一个指向数组类型的指针必须在该类型的名字之前加前缀'P',例如:typePEmployee = ^TEmployee;TEmployee = recordEmployeeName: stringEmployeeRate: Double;end;3.5类3.5.1 命名及格式类的名字必须有意义并且类型的名字之前要加前缀'T'。
例如:typeTCustomer = class(TObject)类实例的名字通常是去掉'T'的类的名字。
例如:varCustomer: TCustomer;3.5.2 类中的变量3.5.2.1命名及格式类的名字必须有意义并且类型的名字之前要加前缀'F'。
所有的变量必须是四有的。
如果需要从外部访问此变量则需要声明一属性3.5.3 方法3.5.3.1命名及格式同函数和过程的命名及格式。
3.5.3.2 属性访问方法所有的属性访问方法必须出现在private 或 protected 中。
属性访问方法的命名同函数和过程的命名另外读方法(reader method)必须使用前缀'Get'. 写方法(writer method)必须使用前缀'Set'。
写方法的参数必须命名为'Value',其类型同所要写的属性相一致。
例如:TSomeClass = class(TObject)privateFSomeField: Integer;protectedfunction GetSomeField: Integer;procedure SetSomeField( Value: Integer);publicproperty SomeField: Integer read GetSomeField write SetSomeField;end;3.6属性3.6.1 命名及格式同其用操作的,出去前缀'F'的类的变量的名称相一致。
3.7文件3.7.1项目文件3.7.1.1项目目录结构程序主目录--Bin(应用程序所在路径)-Db(本地数据库所在路径)-Doc(文档所在路径)-Hlp(帮助文件所在路径)-Backup(备份路径)-Tmp(临时文件路径)3.7.1.2命名项目文件必须使用一个有意义的名字。
例如: Delphi中系统信息的项目文件被命名为 SysInfo.dpr。
3.7.2 Form 文件3.7.2.1命名同Form的名称相一致:例如:Form的名称为FormMain则Form文件的名称就为FormMain.frm。
3.7.3 Data Module 文件3.7.3.1命名data module文件的命名应该有意义,并且使用'DM'作为前缀。
例如:用户data module 被命名为'DMCustomers.dfm'。
3.7.4 Remote Data Module 文件3.7.4.1 命名remote data module文件的命名应该有意义,并且使用'RDM'作为前缀。
例如:用户remote data module 被命名为'RDMCustomers.dfm'。
3.7.5 Unit文件3.7.5.1普通 Unit3.7.5.1.1 Unit文件命名unit文件的命名应该有意义,并且使用'unit'作为前缀。
例如:通用unit 被命名为'UnitGeneral'。
3.7.5.2 Form Units3.7.5.2.1命名Form unit 文件的名字必须和Form的名称保持一致。