Delphi编程规范
更新时间:2024-06-01 17:07:01 阅读量: 综合文库 文档下载
Delphi编程代码规范
1. 一般的源代码格式规则 2
1.1 缩进 2
1.2 空格 2
1.3 边距 2
1.4 颜色及文字属性 2
1.5 begin···end 2
2. OBJECT PASCAL 3
2.1 括号 3
2.2 保留字和关键字 3
2.3 过程和函数(例程) 3
2.4 变量 4
2.5 常量(const) 5
2.6 资源串(resourcestring) 5
2.7 类型 5
2.8 构造类型 6
2.9 语句 6
2.10 结构化异常处理 8 2.11 类 8
3. 文件 10
3.1 项目文件 10
3.2 Form文件 10
3.3 数据模块文件 10
3.4 远程数据模块文件 10
3.5 单元文件 10
3.6 文件头 11
3.7 函数或过程头格式如下 11
4. Form与数据模块 12
4.1 Form 12
4.2 数据模块 13 5. 包 14
5.1 运行期包与设计期包 14
5.2 文件命名标准 14
6. 元件 14
6.1 自定义的元件 14
6.2 元件实例的命名规则 15
6.3 元件性质标识名 15
6.4 元件的前缀 15
1. 一般的源代码格式规则 1.1 缩进
缩进就是每级间有两个空格。不要在源代码中保存制表符。这是因为,制表符的宽度随着不同的用户设置和代码管理实用程序(打印、文档及版本控制等)而不同。
通过使用Tools | Editor Options菜单,在Editor Properties对话框的General页上,不要选中Use tab Character和Optimal Fill复选框,这样,制表符就不会被保存。 1.2 空格
遇到如下情况,需要添加空格:
1) 逗号的后面;
2) 冒号的后面;
3) 等号的前后;
4) 赋值号的前后
5) 运算符(+、-、*、/)的前后。 1.3 边距
边距设置为80个字符。源代码一般不会因写一个单词而超过边距,但本规则比较灵活。只要可能,长度超过一行的语句应当用逗号或运算符换行。换行后,应缩进两个字符。
1.4 颜色及文字属性
通过使用Tools | Editor Options菜单,在Editor Properties对话框的Color页上,设置相应元素的颜色及文字属性。其中:
注释(Comment): 斜体深绿色
保留字(Reserved word): 粗体天蓝色
字符串(String): 普通洋红色
数值(Number): 普通红色
其他元素取Delphi IDE缺省设置。
1.5 begin···end
begin语句必须单独占一行,例如,下面第一行是错误的,而第二行正确:
for i := 0 to l0 do begin // 错, begin与for在同一行
for i := 0 to 10 do // 对, begin在另外一行中 begin end;
本规则的一个特殊情况是,当begin为else语句的一部分时,例如:
if some statement = then
begin ... end
else begin
SomeOtherStatement; end;
end语句总是单独一行。
当begin不为else语句的一部分时,相应的end语句与begin语句的缩进量相同。
2. OBJECT PASCAL 2.1 括号
在左括号与下一个字符之间没有空格。同样,右括号与前一字符间也没有空格。下面的例于演示了正确与不正确的空格。
CallProc( AParameter ); // 错!
CallProc(AParameter); // 正确!
不要在语句中包含多余的括号。在源代码中,括号只有在确实需要时才使用。下面的例子演示了正确与不正确用法:
if (i = 42) then // 错,括号是多余的
if (i = 42)or (j = 42) then // 正确,必须使用括号
2.2 保留字和关键字
Object Pascal语言的保留字和关键字总是全部小写。
2.3 过程和函数(例程)
2.3.1 命名与格式
■ 例程名应当以大写字母开始,且大小写交错以增加可读性。
下面是一个不正确的写法:
procedure thisisapoorlyformattedroutinename;
改成这样写就对了:
procedure ThisIsMuchMoreReadableRoutineName;
■ 例程名应当有意义。进行一个动作的例程最好在名称前加上表示动作的动词为前缀。 例如:
procedure FormatHardDrive;
■ 设置输入参数值的例程名应当以Set为其前缀,例如:
procedure SetUserName;
■ 获取数值的例程名应当以Get为其前缀,例如:
function GetUserName: string;
2.3.2 形参 ■ 格式
只要可能,同一类型的形参应当归并在一起:
procedureFoo(Param1, Param2,Param3: Integer; Param4: string); ■ 命名
所有形参的名称都应当表达出它的用途。如果合适的话,形参的名称最好以字母A为前缀,例如:
procedure SomeProc(AuserName: string; AuserAge: integer);
当参数名与类的特性或字段同名时,前缀A就有必要了。
■ 参数顺序
形参的顺序主要要考虑寄存器调用规则。
最常用的参数应当作为第一个参数,按使用频率依次从左到右排。
可能的情况,每个资源分配应当与:try…finally结构匹配。例如,下面代码可能导致错误:
SomeClassl := 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;
2.10.3 try…except的用法
如果您希望在发生异常时执行一些任务,可以使用try…except。通常,没有必要为了简单地显示一个错误信息而使用try…except,因为Application对象能够自动根据上下文做到这一点。如果要在except子句中激活默认的异常处理,可以再次触发异常。
2.10.4 try…except…else的用法
不鼓励使用带else子句的try…except,因为这将阻塞所有的异常,包括您没有准备的异常。 2.11 类
2.11.1 命名与格式
类的名称应当表达出类的用途。类名前要加字母T,表示它是一个类型。例如: type
TCustomer = class(TObject);
类的实例名称与类名相同,只不过没有前缀T。 var
Customer: TCustomer;
注意:关于元件的命名,请参阅“元件类型命名标准”部分。
2.11.2 字段
■ 命名与格式
字段的命名遵循与变量相同的规则,只不过要加前缀F,表示这是字段。
■ 可见性
所有字段必须为私有。如果要在类的作用域之外访问字段,可借助于类的特性来实现。
2.11.3 方法
■ 命名与格式
方法的命名遵循与过程和函数相同的规则。
■ 静态方法
当您不希望一个方法被派生类重载时,应当使用静态方法。
■ 虚拟方法与动态方法
当您希望一个方法能被派生类重载,应当使用虚拟方法。如果类的方法要被多个派生类直接或间接地使用,
则应当用动态方法。例如,某一个类含有一个被频繁重载的方法,并有100个派生类,则应将方法定义为动态的,这样,可以减少内存的开销。
■ 抽象方法
如果一个类要创建实例,则不要使用抽象方法。抽象方法只能在那些从不创建实例的基类中使用。
■ 特性访问方法
所有特性访问方法应当定义在类的私有或保护部分。
特性访问方法遵循与过程和函数相同的规则。用于读的方法应当加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;
2.11.4 特性
特性作为私有字段的访问器,遵循与字段相同的命名规则,只不过没有F前缀。
特性名应为名词,而不是动词。特性是数据,而方法是动作。
数组特性名应当是复数,而一般的特性应当是单数。
2.11.5 访问方法的使用
尽管不是必须,但还是建议您使用写访问方法来访问代表私有字段的特性。 3. 文件
3.1 项目文件
项目文件的名称应当具有描述意义。例如,“The Delphi 4 Developer?s Guide Bug Manager”的项目名称为DDGBugs.dpr,一个系统信息程序的名称为SysInfo.dpr。
3.2 Form文件
Form文件的名称应当表达出Form的用途,且具有Frm后缀。例如,About的文件名叫AboutFrm,主Form的文件名叫MainFrm。
3.3 数据模块文件
数据模块文件的名称应当表达出数据模块的作用,且具有DM后缀。例如,Customers数据模块的文件名叫CustomersDM.dfm。
3.4 远程数据模块文件
远程数据模块文件的名称应当表达出远程数据模块的用途。名称后要加RDM后缀。例如,Customers远程数据模块的文件叫CustomersRDM.dfm。
3.5 单元文件
3.5.1 普通单元的结构
■ 单元名
单元的名称应当有描述性。例如,应用程序的主Form单元叫MainFrm.pas。
■ Uses子句
Interface部分的Uses子句应当只包含该部分需要的单元。不要包含可能由Delphi自动添加的单元名。
Implementation部分的Uses子句应当只包含在该部分需要的单元,不要有多余的单元。
■ Interface部分
Interface部分应当只包含需要被外部单元访问的类型、变量、过程与函数的声明。而且,这些声明应当在Implementation部分之前。
■ Implementation部分
Implementation部分包括本单元私有的类型、变量、过程与函数的声明。
■ Initialization部分
不要在单元的Initialization部分放置花费时间很多的代码。否则,将导致应用程序启动时显得很慢。
■ Finalization部分
确保释放所有在Initialization部分中分配的资源。
3.5.2 Form单元
Form单元文件的名称与相应的Form名称相同。例如:About的单元名称叫AboutFrm.pas。主From的单元文件名称叫为MainFrm.pas。
3.5.3 数据模块单元
数据模块单元文件的名称与相应的数据模块名称相同。例如,Customers数据模单元的名称叫CustomersDM.pas。
3.5.4 通用的单元
通用单元的名称应当表达出它的用途。例如,一个实用工具单元的名称叫ugUtilities.pas,包含全局变量的单元名称叫CustomerGlobals.pas。
注意,一个项目中单元名称必须是唯一的。
3.5.5 元件单元
元件单元应放在单独的路径中,以区别于定义元件的单元。它们一般与项目不放在同一路径下。单元文件名称应表达出其内容。
注意,有关元件命名标准的更多信息,请参阅“自定义元件”部分。
3.6 文件头
所有源文件和项目文件都应具有文件头。一个正确的文件头应包含以下信息:
//////////////////////////////////////////////////////////////////////(80 chars)// 创建:Tujh010618 (创建信息:创建者、创建日期)
// 版权:迈特安 (版权)
// 功能: (本文件的主要功能)
// 函数: (主要函数和过程;可省)
//////////////////////////////////////////////////////////////////////
3.7 函数或过程头格式如下
//////////////////////////////////////////////////////////////////////
// 创建:Tujh010618 (创建信息:创建者、创建日期)
// 功能:…… (本函数或过程的主要功能)
// 参数:Param1-……
// Param2-(out) …… (out表示输出参数)
// 返回:…… (类型、值)
// 说明:…… (备注信息、调用方法、初始化数值等)
//////////////////////////////////////////////////////////////////////
4. Form与数据模块 4.1 Form
4.1.1 Form类型的命名标准
Form类型的名称应当表达出Form的用途,且要加T为前缀,后跟描述性名,最后是Form。例如,About的类型名称为:
TAboutForm = class(TForm)
主frm的类型名称为:
TMainForm = class(TForm)
客户登录Form的类型名称为:
TCustomerEntryForm = class(TForm)
4.1.2 Form实例的命名标准
Form实例的名称与相应的类型名称相同,但没有前缀T。例如,前面提到的Form类与Form实例的名称为:
类型名 实例名
---------------------------------------------------------------------------
TAboutFo rm AboutForm
TMainForm MainForm
TCustomerEntryForm CustomerEntryForm
4.1.3 自动创建的Form
除非特别原因,只有主Form才自动生成。其他所有Form必须从Project Options对话框的自动生成列表中删除。更进一步的信息,请参阅后面几节。
4.1.4 模式Form实例化函数
所有Form单元都应当含有实例化函数,用于创建、设置、模式显示和释放Form。这个函数将返回由Form返回的模式结果。传递给这个函数的参数遵循“参数传递”的规则。之所以要这样封装,是为了便于代码的重用和维护。
Form的变量应当从单元中移走,改在实例化函数中作为局部变量定义。注意,这要求从Project Options对话框的自动生成列表中移走该Form。
例如,下面的单元文件演示了GetUserData的实例化函数。
unit UserDataFrm; interface uses
Windows, Messages, SysUtils, C1asses, 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: Integ): Word; var
UserDataForm: TUserDataFrom; 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.edtUserName.Text); end; finally
UserDataForm.Free; end; end; end.
4.2 数据模块
4.2.1 数据模块的命名标准
数据模块类型名称应表达出它的用途,且要加前缀T ,后跟描述性名称,最后是DataModule。例如,Customer
数据模块的类型名称为:
TCustomerDataModule = class(TDataModule);
Orders数据模块的类型名称为:
TOrderDataModule = class(TDataModule);
4.2.2 数据模块实例的命名标准
数据模块实例的名称应当与相应的类型名称相同,但没有前缀T。例如,前面的数据模块类型、实例名称如下:
类型名称 实例名
---------------------------------------------------------------------------
TCustomerDataModule CustomerDataModule
TOrderDataModule OrderDataModule 5. 包
5.1 运行期包与设计期包
运行期包中应当只包含所需要的单元。那些特性编辑器和元件编辑器的单元应当放在设计期包中。注册单元也应当放在设计期包中。
5.2 文件命名标准
包的命名遵循下列模式:
iiilibvv.pkg -- 设计期包
iiistdvv.pkg -- 运行期包 其中:
iii代表一个3字符的前缀,用于标识公司、个人或其他需要标识的事情。
vv代表包的版本号,其中也包含了De1phi的版本号。
注意:包名称中的lib或std 分别表示这是设计期包或运行期包。例如,《De1phi 5开发大全》中的包是这样命名的:
ddgLib50.pkg -- 设计期包
ddgStd50.pkg -- 运行期包 6. 元件
6.1 自定义的元件
6.1.1 元件类型的命名标准
元件的命名与类的命名类似,只不过它有3个字符的前缀。这些前缀用以标识公司、个人或其他实体。例如,一个时钟元件可以这样声明:
TddgClock = class(TComponent)
注意,作为前缀的3个字符要小写。
6.1.2 元件单元
元件单元只能含有一个主要元件,这是指出现在元件选项板上的元件。其他辅助性的元件或对象也可以包含在同一单元中。
6.1.3 注册单元
元件的注册过程应当从元件单元中移走,放在一个单独的单元中。这个注册单元用于注册所有元件、特性编辑器、元件编辑器、向导等。
元件注册应当在设计期包中进行。因此,注册单元应当包含在设计期包而不是运行期包中。建议注册单元这样命名:
xxxReg.pas
其中,xxx为3个字符前缀,以标识公司、个人或其他实体。例如,命名为ddgReg.Pas。
6.2 元件实例的命名规则
元件的名称应当具有描述性。Delphi没有为元件指定默认的名称。元件应当有一个小写的前缀以表明其类型,这是为了便于在Object Inspector和Code Explorer中查找元件。
元件类型前缀是元件类型名变化而成的。下面的规则说明如何定义一个元件类型前缀:
1) 从元件类型名中移去T 前缀。例如TButton变成Button。
2) 除了第一个元音,删去所有元音字母。例如,Button变成Bttn,Edit变成Edt 。
3) 压缩双字母。例如,Bttn变成Btn。
4) 如发生冲突,则在某一元件前缀中加入一个元音。例如在TBatton元件的前缀中加入元音变为batn,以区别TButton的前缀。
6.3 元件性质标识名
元件性质标识名是元件意图的描述。例如,一个用于关闭窗体的TButton元件可命名为btnClose。一个编辑人名的元件可命名为edtFirstName。
6.4 元件的前缀
下面是Delphi5 标准元件的前缀。
6.4.1 standard页
前缀 元件
mm TMainMenu
pm TPopupMenu
mmi TMainMenuItem
pmi TPopupMenuItem
fm TFrame
lbl TLabel edt TEdit
mem TMemo
btn TButton
ck TCheckBox
rb TRadioButton
lb TListBox
cb TComboBox
scb TScrollBar
gb TGroupBox
rg TRadioGroup
pnl TPanel
al TActionList
ac TAction
6.4.2 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
ctrb TControlBar
av TApplicationEvents
cht TChart
6.4.3 win32页
前缀 元件
tbc TTabControl
pgc TPageControl
il TImageList
re TRichEdit
tbr TTrackBar
pb TProgressBar
ud TUpDown
hk THotKey
ani TAnimate
dtp TDateTimePicker
mc TMonthCalendar
tv TTreeView
lv TListView
hc THeaderControl
stb TStatusBar
tb TToolBar
clb TCoolBar
pgs TPageScroller
6.4.4 System页
前缀 元件
tm TTimer
pb TPaintBox
mp TMediaPlayer
olec TOleContainer
ddcc TDDEClientConv
ddci TDDEClientItem
ddsc TDDEServerConv
ddsi TDDEServerItem
6.4.5 Data Access页
前缀 元件
ds TDataSource
tbl TTable
qry TQuery
sp TStoreProce
db TDataBase
ssn TSession
bm TBatchMove
usql TUpdateSQL
nt TNestedTable
6.4.6 Data Controls页
前缀 元件
dbg TDBGrid
dbn TDBNavigator
dbt TDBText
dbe TDBEdit
dbm TDBMemo
dbi TDBImage
dblb TDBListBox
dbcb TDBComboBox
dbck TDBCheckBox
dbrg TDBRadioGroup
dbll TDBLookupListBox
dblc TDBLookupComboBox
dbre TDBRichEdit
dbcg TDBCtrlGrid
dbch TDBChart
6.4.7 ADO页
前缀 元件
adon TADOConnection
adoc TADOCommand
adod TADODataSet
adot TADOTable
adoq TADOQuery
ados TADOStoreProc
rdsn TRDSConnection
6.4.8 Midas页
前缀 元件
prv TProvider
cds TClientDataSet
qcds TQueryClientDataSet
dcom TDCOMConnection
olee TOleEnterpriseConnection
sck TSocketConnection
rms TRemoteServer
mid TMidasConnection
6.4.9 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
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
6.4.10 Decision Cube页
前缀 元件
dcb TDecisionCube
dcq TDecisionQuery
dcs TDecisionSource
dcp TDecisionPivot
dcg TDecisionGrid
dcgr TDecisionGraph
6.4.11 QReport页
前缀 元件
qr TQuickReport
qrsd TQRSubDetail
qrb TQRBand
qrcb TQRChildBand
rqg 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
6.4.12 Dialogs页
对话框元件实际是以元件形式封装的Form,因此它遵循Form的命名规则。其类型经由元件的名称定义了。实例的名称与类型的名称相同,但没有前缀T。
前缀 元件
OpenDialog TOpenDialog
SaveDialog TSaveDialog
OpenPicturedialog TOpenPictureDialog
SavePictureDialog TSavePictureDialog
FonDialog TFontDialog
ColorDialog TColorDialog
PrintDialog TPrintDialog
PrintSetupDialog TPrinterSetupDialog
FindDialog TFindDialog
ReplaceDialog TReplaceDialog
6.4.13 Win31页
前缀 元件
dbll TDBLookupList
dblc TDBLookupCombo
ts TTabSet
ol TOutline
tnb TTabbedNoteBook
nb TNoteBook
hdr THeader
flb TFileListBox
dlb TDirectoryListBox
dcb TDirveComboBox
fcb TfilterComboBox
6.4.14 Samples页
前缀 元件
gg TGauge
cg TColorGrid
spb TSpinButton
spe TSpinEdit
dol TDirectoryOutline
cal TCalendear
ibea TIBEventAlerter
6.4.15 ActiveX页
前缀 元件
cfx TChartFx
vsp TVSSpell
flb TF1Book
vtc TVTChart
正在阅读:
Delphi编程规范06-01
电力行业周报:青海出台电力储能项目补贴方案,利好储能产业发展07-25
可行性研究报告-非煤矿山建设项目安全设施可行性研究报告审查审批12-18
《口袋侦探》第四关攻略图文08-06
第6章设备管理习题及答案09-28
车间噪声防治措施.doc04-08
2017年上海大学影视艺术技术学院626艺术学理论考研冲刺密押题08-26
电大机考2344建筑工程项目管理09-21
2019年帮扶单位脱贫攻坚蹲点调研报告02-23
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 规范
- 编程
- Delphi
- lync常见问题答疑(文档v2.0)
- 《工程设计文件质量特性和质量评定 - 指南》(建设部建设1
- 浅谈中小企业应收账款问题的探究
- 14体育传播效果与测量
- 高考数学中的绝对值问题
- 秦山三核检修厂房附属仓库建安工程施工组织设计
- 浅谈青年民警成才培养途径与方法
- 元件封装大全的速记
- 混凝土工程质量缺陷修补方案
- 普通植物病理学试题题库
- 数感的认识
- 钢箱梁制造加工技术总结(杜欣遥) - 图文
- 17年英语专八真题附上minilecture和改错的题目较完整
- 30个经典劳动争议仲裁案例
- 口腔解剖生理学前半部分总结
- 第11周周末练习(学生版):基本不等式
- 三年级下册9-20 - 图文
- 级配碎石基层施工技术交底
- 鲁教版初中六年级上册数学第三单元第三节解答题练习题
- 人教新目标 - 七年级上册英语期末复习提纲