ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:29.60KB ,
资源ID:11157006      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11157006.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Delphi编程规范.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Delphi编程规范.docx

1、Delphi编程规范Delphi代码标准文档1.前言 本文档主要是为Delphi开发人员提供一个源代码书写标准,以及程序和文件的命名标准,使他们在编程时有一致格式可遵循。这样,每个编程人员编写的代码能够被其他人理解。 本文档不包含用户界面标准。用户界面标准是独立于其他标准的,并且同样是重要的。2.源程序书写规范2.1.通用源代码格式规则1). 缩进 缩进就是每级间有两个空格。不要在源代码中放置制表符。这是因为,制表符的宽度随着不同的设置和代码管理实用程序(打印、文档及版本控制等)而不同。 通过使用Tools|Environment 菜单,在Environment Options 对话框的Gen

2、eral页上,不要选中Use Tab Character 和Optional Fill 复选框,这样,制表符就不会被保存。2). 边距 边距设置为80个字符。源代码一般不会因写一个单词而超过边距,但本规则比较灵活。只要可能,长度超过一行的语句应当用逗号或运算符换行。换行后,应缩进两个字符。3). begin.end 语句begin 语句必须单独占一行。例如,下面第一行是错误的,而第二行正确:for i:=0 to 10 do begin / 错, begin 与f o r 在同一行for i:=0 to 10 do / 对, begin 在另外一行中begin本规则的一个特殊情况是,当begi

3、n 为else 语句的一部分时,例如:if some statement = thenbegin . . .endelse begin Some Other Statement;end;注意:end 语句总单独一行。当begin 不为else 语句的一部分时,相应的end 语句与begin 语句的缩进量相同。4).注释 我们通常使用“.”类型的块注释,以前的“(*.*)”类型的块注释用于临时注释掉暂不使用的代码,从Delphi 2开始支持“/”行注释,如果决定不在支持Delphi 2.0以下的版本,可以使用“/”注释。2.2.Object Pascal语句格式语句书写规范与用法1). 括号 在

4、左括号与下一字符之间没有空格。同样,右括号与前一字符也没有空格。下面的例子演示了正确与不正确的空格。CallProc( Aparameter ); / 错!CallProc(Aparameter); / 正确! 不要在语句中包含多余的括号。在源代码中,括号只有在确实需要时才使用。下面的例子演示了正确与不正确用法:if (I=42) then / 错,括号是多余的if (I=42) or (J=42) then / 正确,必须使用括号2). 保留字和关键字 Object Pascal 语言的保留字和关键字总是完全的小写。下面是Delphi 保留字列表:andarrayasasmbegincase

5、classconstconstructordestructordispinterfacedivdodowntoelseendexceptexportsfilefinalizationfinallyforfunctiongotoifimplementationininheritedinitializationinlineinterfaceislabellibrarymodnilnotobjectoforoutpackedprocedureprogrampropertyraiserecordrepeatresourcestringsetshlshrstringthenthreadvartotryt

6、ypeunituntilusesvarwhilewithxorprivateprotectedpublicpublishedautomated3). 过程和函数(1). 格式 过程名应当以大写字母开始,且大小写交错以增加可读性。下面是一个不正确的写法:procedure thisisapoorlyformattedroutinename;改成这样写就对了:procedure ThisIsMuchMoreReadableRoutineName;(2). 形参(1) 格式 只要可能,同一类型的形参应当归并在一起:procedure Foo(Param1,Param2,Param3:Imteger;

7、Param4:string);(2) 参数顺序 形参的顺序主要要考虑寄存器调用规则。最常用的参数应当作为第一个参数,按使用频率依次从左到右排。输入参数位于输出参数之前。范围大的参数应当放在范围小的参数之前。例如:SomeProc(aPlanet, aContinent, aCountry, aState, aCity). 有些则例外。例如,在事件处理过程中,TObject 类型的Sender 参数往往是第一个要传递的参数。(3) 常量参数 要使记录、数组、短字符串或接口类型的参数不能被过程修改,就应当把形参标以Const 。这样,编译器将以最有效的方式生成代码,保证传递的参数不可变。 如果其他

8、类型的参数希望不被过程所修改,也可以标上Const 。尽管这对效率没有影响,但这给过程的调用者带来了更多的信息。4). 变量(1). 局部变量 局部变量用于过程内部,果需要的话,应当在过程的入口处立即初始化变量。局部的AnsiString 类型的变量自动被初始化为空字符串,局部的接口和dispinterface类型的变量自动被初始化为nil,局部的Variant和OleVariant类型的变量自动被初始化为Unassigned。(2). 全局变量 一般不鼓励使用全局变量。不过,有时候需要用到。即使如此,也应当把全局变量限制在需要的环境中。例如,一个全局变量可能只在单元的实现部分是全局的。 全局

9、数据如果将由许多单元使用,就应移动到一个公用单元里被所有对象使用。全局数据可在声明时直接初始化为一个值。注意,所有全局变量自动进行零初始化,因此,不要将全局变量初始化为诸如0 、nil、或Unassigned等空值。零初始化的全局变量在.EXE文件中不占空间。零初始化的数据保存在虚拟的数据段中,而虚拟数据段只在应用程序启动时才分配内存。非零初始化的全局数据则在.EXE文件中占空间。5). 类型(1). 大小写规则 类型标识符是保留字,应当全部小写。Win32 API 类型常常全部大写,并且遵循诸如Windows.pas或其他API单元中关于特定类型名的规则。对于其他变量名,第一个字母应大写,其

10、他字母则大小写交错。下面是一些例子:var MyString: string; / 保留字 WindowsHandle: HWND; / Win32 API 类型 I: Integer; /在System单元中引入的类型标识(2). 浮点型 不鼓励使用Real类型,因为它只是为了与老的Pascal代码兼容而保留的。通常情况下,对于浮点数应当使用Double。Double可被处理器优化,是IEEE定义的标准的数据格式。当需要比Double提供的范围更大时,可以使用Extend。Extend是intel专用的类型,Java不支持。当浮点变量的物理字节数很重要时(可能使用其他语言编写DLL),则应当

11、使用Single。(3).Variant和OleVariant 一般不建议使用Variant和OleVariant。但是,当数据类型只有在运行期才知道时(常常是在COM和数据库应用的程序中),这两个类型对编程就有必要。当进行诸如自动化ActiveX控件的COM编程时,应当使用OleVariant;而对于非COM编程,则应当使用Variant。这是因为,Variant能够有效地保存Delphi的原生字符串,而OleVariant则将所有字符串转换为OLE字符串(即WideChar字符串),且没有引用计数功能。6). 语句(1). If 语句 在if/then/else语句中,最有可能执行的情况应

12、放在then子句中,不太可能的情况放在else子句中。为了避免出现许多if语句,可以使用case语句代替。如果多于5级,不要使用if语句。请改用更清楚的方法。不要在if语句中使用多余的括号。 如果在if语句中有多个条件要测试,应按照计算的复杂程度从右向左排。这样,可以使代码充分利用编译器的短路估算逻辑。例如,如果Condition1比Condition2快,Condition2比Condition3快,则if语句一般应这样构造:if Condition1 and Condition2 and Condition3 then 如果Condition3为False的机会很大,利用短路估算逻辑,我们

13、也可以将Condition3放在最前面:if Condition3 and Condition1 and Condition2 then(2). case 语句(1) 概述 case语句中每种情况的常量应当按数字或字母的顺序排列。每种情况的动作语句应当简短且通常不超过4 - 5 行代码。如果动作太复杂,应将代码单独放在一个过程或函数中。Case语句的else子句只用于默认情况或错误检测。(2) 格式 case语句遵循一般的缩进和命名规则。(3). while 语句 建议不要使用Exit过程来退出while循环。如果需要的话,应当使用循环条件退出循环。所有对while循环进行初始化的代码应当位于

14、while入口前,且不要被无关的语句隔开。任何业务的辅助工作都应在循环后立即进行。(4). for 语句 如果循环次数是确定的,应当用for语句代替while语句。(5). repeat 语句 repeat语句类似于while循环,且遵循同样的规则。(6). with 语句(1) 概述 with语句应小心使用。要避免过度使用with语句,尤其是在with语句中使用多个对象或记录。例如:with Record1,Record2 do 这些情况很容易迷惑编程人员,且导致调试困难。(2) 格式 with语句也遵循本章关于命名和缩进的规则。7). 结构化异常处理(1). 概述 异常处理主要用于纠正错误

15、和保护资源。这意味着,凡是分配资源的地方,都必须使用try.finally来保证资源得到释放。不过,如果是在单元的初始/结束部分或者对象的构造器/析构器中来分配/释放资源则例外。(2). try.finally的用法 在可能的情况下,每个资源分配应当与try.finally结构匹配,例如,下面代码可能导致错误:SomeClass1 := TSomeClass.Create;SomeClass2 := TSomeClass.Create;try do some code finally SomeClass1.Free; SomeClass2.Free;end; 上述资源分配的一个安全方案是:So

16、meClass1 := TSomeClass.Create;try SomeClass2 := TSomeClass.Create; try do some code finally SomeClass2.Free; end;finally SomeClass1.Free;end;(3). try.except的用法 如果你希望在发生异常时执行一些任务,可以使用try.except。通常,没有必要为了简单地显示一个错误信息而使用try.except,因为Application对象能够自动根据上下文做到这一点。如果要在子句中激活默认的异常处理,可以再次触发异常。(4). try.except.e

17、lse的用法 不鼓励使用带else子句的try.except,因为这将阻塞所有的异常,包括你没有准备处理的异常。3.命名规范3.1.过程(Procedure)与函数(Function)1).命名 过程与函数名应当有意义。进行一个动作的过程最好在名称前加上表示动作的动词为前缀。例如:procedure FormatHardDrive; 设置输入参数值的过程名应当以Set 为其前缀,例如:procedure SetUserName; 获取数值的过程名应当以Get 为其前缀,例如:function GetUserName:string;2).形参 所有形参的名称都应当表达出它的用途。如果合适的话,形

18、参的名称最好以字母a 为前缀,例如:procedure SomeProc(aUserName:string; aUserAge:integer); 当参数名与类的特性或字段同名时,前缀a 就有必要了。3).命名冲突 当两个单元中含有相同名称的过程时,如果调用该过程,实际被调用的是Uses 子句中较后出现的那个单元中的过程。为避免这种情况,可在方法名前加想要的单元名,例如:SysUtils.FindClose(SR);或Windows.FindClose(Handle);3.2.变量(Variable) 变量的名称应当能够表达出它的用途。循环控制变量常常为单个字母,诸如I 、J 或K 。也可以使

19、用更有意义的名称,例如UserIndex。布尔变量名必须能清楚表示出True 和False 值的意义。1). 局部变量 局部变量遵循其他变量的命名规则。2). 全局变量 全局变量以大写字母“G”打头,并遵循其他变量的命名规则。3.3.类型(Type)3.3.1.一般类型1). 枚举型 枚举类型名必须代表枚举的用途。名称前要加T字符作为前缀,表示这是个数据类型。枚举类型的标识符列表的前缀应包含2 - 3 个小写字符,来彼此关联。例如:TSongType=(stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB); 枚举类

20、型的变量实例的名称与类型相同,但没有前缀T ,也可以给变量一个更加特殊名称,诸如:FavoriteSongTypel、FavoriteSongType2等等。3.3.2.构造类型1). 数组类型 数组类型名应表达出该数组的用途。类型名必须加字母“T”为前缀。如果要声明一个指向数组类型的指针,则必须加字母P 为前缀,且声明在类型声明之前。例如:type PCycleArray = TCycleArray; TCycleArray=array1.100 of integer;实际上,数组类型的变量实例与类型名称相同,但没有“T”前缀。2). 记录类型 记录类型名应表达出记录的用途。类型名必须加字母

21、T为前缀。如果要声明一个指向记录类型的指计,则必须加字母P为前缀,且其声明在类型声明之前。例如:type PEmployee = TEmployee; TEmployee = record EmployeeName: string; EmployeeRate: Double; end;3.3.3.类类型(Class)1). 命名与格式 类的名称应当表达出类的用途。一般的类名前要加字母“T”,如果是接口类那么类名前要加“I”,错误异常类的类名前要加“E”,而类引用类型(Class-reference type)则要在类名后加“Class”。例如:type TCustomer = class(TO

22、bject); ICustomer = interface; TCustomerClass = class of TCustomer ECustomerException = class(Exception); 类的实例名称通常与类名相同,只不过没有前缀“T”。var Customer: TCustomer;注意:关于元件的命名,请参阅“元件类型”。2).字段(1) 命名与格式 字段的命名遵循与变量相同的规则,只不过要加前缀F ,表示这是字段。(2) 可见性 所有字段必须为私有。如果要在类的作用域之外访问字段,可借助于类的属性来实现。3).方法(1) 命名与格式 方法的命名遵循与过程和函数相同

23、的规则。(2) 静态方法 当你不希望一个方法被派生类覆盖时,应当使用静态方法。(3) 虚拟方法(virtual)与动态方法(dynamic) 当你希望一个方法能被派生类覆盖,应当使用虚拟方法(virtual)。如果类的方法要被多个派生类直接或间接地使用,则应当用动态方法(dynamic)。例如,某一个类含有一个被频繁覆盖的方法,并有100个派生类,则应将方法定义为动态的,这样可以减少内存的开销。(4) 抽象方法(abstract) 如果一个类要创建实例,则不要使用抽象方法。抽象方法只能在那些从不创建实例的基类中使用。(5) 属性访问方法 所有属性访问方法应当定义在类的私有或保护部分。属性访问方

24、法遵循与过程和函数相同的规则。用于读的方法应当加“Get”前缀,用于写的方法应当加“Set”前缀,并且有一个叫Value的参数,其类型与属性的类型相同。例如:TSomeClass = class(TObject)privateFSomeField: Integer;protectedfunction GetSomeField: Integer;procedure SetSomeField(Value: Integer);publicproperty SomeField: Integer read GetSomeField write SetSomeField;end; 尽管不是必须,但还是建议

25、你使用写访问方法来访问代表私有字段属性。4).属性 属性作为私有字段的访问器,遵循与字段相同的命名规则,只不过没有F前缀。属性名应为名词,而不是动词。属性是数据,而方法是动作。数组属性名应当是复数,而一般的属性应当是单数。3.3.4.元件类型1). 元件类型的命名标准 元件的命名与类的命名类似,只不过当它与其它元件名称冲突时,你可以加上3个字符的前缀,用以标识公司、个人或其他实体。例如,一个时钟元件可以这样声明:TddgClock = class(TComponent)注意,作为前缀的3 个字符要小写。2). 元件实例的命名规则 元件实例的名称应当能够描述其实际意义,这里命名规则使用了一个变更

26、的匈牙利前缀命名规范。使用前缀而不使用后缀的原因是在搜寻时,在对象检查器和代码探索器中搜寻构件的名字比搜寻构件的类型更容易。在这个标准中,元件实例名包括两个部分:前缀和性质标识名。(1). 元件的前缀 元件的前缀多是表现元件类型的字母缩写。参见下面表中的元件前缀:元件类名元件前缀TActionList, TAction表示动作的列表项actTButton, TSpeedButton, TBitBtn等所有的按钮类btnTCheckBox, TDBCheckBox等所有的检查框chkTRadioButton单选按钮类rdoTToolBar工具条tbTMainMenu所有的主菜单类mmTMainM

27、enuItem所有的菜单项类miTPopupMenu所有的弹出式菜单类pmTPopupMenuItem所有的弹出式菜单项类pmiTLabel, TStaticText等所有用来显示的标签类lblTPanel等所有的面板类pnlTPageControl等所有的页式控件类pgcTEdit, TMaskEdit等所有的单行编辑框类edtTMemo, TRichEdit等所有的多行编辑框类mmoTDrawGrid, TStringGrid等所有的网格类grdTAnimate等所有的动画类aniTImageList等所有的图片列表类ilTImage等图片类imgTChart图表类chtTComboBox

28、, TDBComboBox等所有的下拉式列表框类cboTListBox, TDBList等所有的列表框类lstTTreeViewtvTListViewlvTHotKeyhkTSplitter等所有的分隔符类sptTOpenDialog等所有的对话框元件类dlgTTable等所有的数据表类tblTQuery等所有的SQL查询类元件qryTClientDataSet所有的客户数据集元件cdsTDataSourcedsTDatabasedbTSockConnection,TDCOMConnection等连接元件类conTQuickRep, TFastReport等所有的报表元件类rptTDDECli

29、entConv,TDDEClientItem等所有的DDE元件类ddeTMonthCalendar等所有的日历类calTGroupBox等控件类grp 如上所示,元件类型前缀是从分析描述元件的类型性质而来的。通常情况下,下面的规则描述如何定义一个元件类型前缀: 从元件类型名中移去T前缀。例如TButton变成Button。 除了第一个元音,删去所有元音字母。例如,Button变成bttn,Edit变成edt。 压缩双字母。例如,bttn变成btn。 如发生冲突,则在某一元件前缀中加入一个元音。例如在TBatton元件的前缀中加入元音变为batn,以区别TButton的前缀。 不过,上述规则首先

30、得保证前缀名称必须符合习惯,做到见名知意,如:TDDEClientConv控件的前缀就是一个例外。 注意:元件的前缀是为了表示出元件的类型,是按钮,还是标签等等,因此没有必要为每一个特别元件类建立一个元件前缀,如: TMyButton的元件前缀仍为btn。(2). 元件性质标识名 元件性质标识名是元件意图的描述。例如,一个用于关闭窗体的TButton元件实例可命名为btnClose。一个编辑姓名的元件实例可命名为edName。3.3.5.窗体与对话框类型1). 窗体类型的命名标准 窗体或对话框类型的名称应当表达出窗体的用途,如果是窗体要加“Tfrm”前缀,如果是对话框要加“Tdlg”,后跟描述性名。例如,About窗体类型名称为:TfrmAbout = class(TForm)主窗体的类型名称为:TfrmMain =

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1