|
为前缀,且声明在类型声明之前。例如:
type PCycleArray = ^TCycleArray; TCycleArray=array[1..100] of integer;
实际上,数组类型的变量实例与类型名称相同,但没有“T”前缀。
2). 记录类型
记录类型名应表达出记录的用途。类型名必须加字母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(TObject); ICustomer = interface; TCustomerClass = class of TCustomer ECustomerException = class(Exception);
类的实例名称通常与类名相同,只不过没有前缀“T”。
var Customer: TCustomer;
注意:关于元件的命名,请参阅“元件类型”。
2).字段
(1) 命名与格式
字段的命名遵循与变量相同的规则,只不过要加前缀F ,表示这是字段。
(2) 可见性
所有字段必须为私有。如果要在类的作用域之外访问字段,可借助于类的属性来实现。
3).方法
(1) 命名与格式
方法的命名遵循与过程和函数相同的规则。
(2) 静态方法
当你不希望一个方法被派生类覆盖时,应当使用静态方法。
(3) 虚拟方法(virtual)与动态方法(dynamic)
当你希望一个方法能被派生类覆盖,应当使用虚拟方法(virtual)。如果类的方法要被多个派生类直接或间接地使用,则应当用动态方法(dynamic)。例如,某一个类含有一个被频繁覆盖的方法,并有100个派生类,则应将方法定义为动态的,这样可以减少内存的开销。
(4) 抽象方法(abstract)
如果一个类要创建实例,则不要使用抽象方法。抽象方法只能在那些从不创建实例的基类中使用。
(5) 属性访问方法
所有属性访问方法应当定义在类的私有或保护部分。属性访问方法遵循与过程和函数相同的规则。用于读的方法应当加“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;
尽管不是必须,但还是建议你使用写访问方法来访问代表私有字段属性。
4).属性
属性作为私有字段的访问器,遵循与字段相同的命名规则,只不过没有F前缀。属性名应为名词,而不是动词。属性是数据,而方法是动作。数组属性名应当是复数,而一般的属性应当是单数。
3.3.4.元件类型
1). 元件类型的命名标准
元件的命名与类的命名类似,只不过当它与其它元件名称冲突时,你可以加上3个字符的前缀,用以标识公司、个人或其他实体。例如,一个时钟元件可以这样声明:
TddgClock = class(TComponent)
注意,作为前缀的3 个字符要小写。
2). 元件实例的命名规则
元件实例的名称应当能够描述其实际意义,这里命名规则使用了一个变更的匈牙利前缀命名规范。使用前缀而不使用后缀的原因是在搜寻时,在对象检查器和代码探索器中搜寻构件的名字比搜寻构件的类型更容易。在这个标准中,元件实例名包括两个部分:前缀和性质标识名。
(1). 元件的前缀
元件的前缀多是表现元件类型的字母缩写。参见下面表中的元件前缀:
元件类名
元件前缀
TActionList, TAction表示动作的列表项
act
TButton, TSpeedButton, TBitBtn等所有的按钮类
btn
TCheckBox, TDBCheckBox等所有的检查框
chk
TRadioButton单选按钮类
rdo
TToolBar工具条
tb
TMainMenu所有的主菜单类
mm
TMainMenuItem所有的菜单项类
mi
TPopupMenu所有的弹出式菜单类
pm
TPopupMenuItem所有的弹出式菜单项类
pmi
TLabel, TStaticText等所有用来显示的标签类
lbl
TPanel等所有的面板类
pnl
TPageControl等所有的页式控件类
pgc
TEdit, TMaskEdit等所有的单行编辑框类
edt
TMemo, TRichEdit等所有的多行编辑框类
mmo
TDrawGrid, TStringGrid等所有的网格类
grd
TAnimate等所有的动画类
ani
TImageList等所有的图片列表类
il
TImage等图片类
img
TChart图表类
cht
TComboBox, TDBComboBox等所有的下拉式列表框类
cbo
TListBox, TDBList等所有的列表框类
lst
TTreeView
tv
TListView
lv
THotKey
hk
TSplitter等所有的分隔符类
spt
TOpenDialog等所有的对话框元件类
dlg
TTable等所有的数据表类
tbl
TQuery等所有的SQL查询类元件
qry
TClientDataSet所有的客户数据集元件
cds
TDataSource
ds
TDatabase
db
TSockConnection,TDCOMConnection等连接元件类
con
TQuickRep, TFastReport等所有的报表元件类
rpt
TDDEClientConv,TDDEClientItem等所有的DDE元件类
dde
TMonthCalendar等所有的日历类
cal
TGroupBox等控件类
grp
如上所示,元件类型前缀是从分析描述元件的类型性质而来的。通常情况下,下面的规则描述如何定义一个元件类型前缀:
- 从元件类型名中移去T前缀。例如TButton变成Button。
- 除了第一个元音,删去所有元音字母。例如,Button变成bttn,Edit变成edt。
- 压缩双字母。例如,bttn变成btn。
- 如发生冲突,则在某一元件前缀中加入一个元音。例如在TBatton元件的前缀中加入元音变为batn,以区别TButton的前缀。
- 不过,上述规则首先得保证前缀名称必须符合习惯,做到见名知意,如:TDDEClientConv控件的前缀就是一个例外。
注意:元件的前缀是为了表示出元件的类型,是按钮,还是标签等等,因此没有必要为每一个特别元件类建立一个元件前缀,如: TMyButton的元件前缀仍为btn。
(2). 元件性质标识名
元件性质标识名是元件意图的描述。例如,一个用于关闭窗体的TButton元件实例可命名为btnClose。一个编辑姓名的元件实例可命名为edName。
3.3.5.窗体与对话框类型
1). 窗体类型的命名标准
窗体或对话框类型的名称应当表达出窗体的用途,如果是窗体要加“Tfrm”前缀,如果是对话框要加“Tdlg”,后跟描述性名。例如,About窗体类型名称为:
TfrmAbout = class(TForm)
主窗体的类型名称为:
TfrmMain = class(TForm)
客户登录窗体的类型名称为:
TfrmCustomerEntry = class(TForm)
登陆对话框的类型名称为:
TdlgLogin = class(TForm)
2). 窗体实例的命名标准
窗体实例的名称与相应的类型名称相同,但没有前缀T 。例如,前面提到的窗体类型与实例的名称为:
类型名
实例名
TfrmAbout
frmAbout
TfrmMain
frmMain
TfrmCustomerEntry
frmCustomerEntry
TdlgLogin
dlgLogin
3). 自动创建的窗体
除非特别原因,只有主窗体才自动生成。其他所有窗体必须从Project Options对话框的自动生成列表中删除。更进一步信息,请参阅后面几节。
4). 模式窗体实例化函数
所有窗体单元都应当含有实例化函数,用于创建、设置、模式显示和释放窗体。这个函数将返回由窗体返回的模式结果。传递给这个函数的参数遵循参数传递的规则。之所以要这样封装,是为了便于代码的重用和维护。
窗体的变量应当从单元中移走,改在窗体实例化函数中作为局部变量定义(注意,要求从Project Options对话框的自动生成列表中移走该窗体。请看前面的内容。
例如,下面的单元文件演示了GetUserData的实例化函数。
Unit UserDataFrm;
Interface
Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
Type
TfrmUserData = 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 frmUserData: TfrmUserData; begin frmUserData := TfrmUserData.Create(Application); frmUserData.Caption:=''''Getting User Data'''' ; Result : = frmUserData.ShowModal; if Result=mrOK then begin aUserName := frmUserData.edtUserName.Text; aUserID := StrToInt(frmUserData.edtUserID.Text); end; finally frmUserData.Free; end; end;
End.
5).窗体框架与复合窗体
如果一个窗体结构过于复杂,就必须将其分化成为一个主窗体框架以及嵌入到主窗体框架的若干子窗体框架。如:
TfrmMainFrame: TfrmInfoFrame,TfrmEditorFrame
使用窗体框架,主要是为了解决界面和代码复用问题,以及提高单元代码的内聚力(划分后,每一个窗体框架为一个独立单元),从而提高软件工程质量。你必须提炼出界面关联代码(可复用的)和应用关联代码(不能复用的)。
3.3.6.数据模块类型
1). 数据模块的命名标准
数据模块类型名称应表达出它的用途,且要加前缀“Tdm”,后跟描述性名称。例如,Customer数据模块的类型名称为:
TdmCustomer = class(TDataModule)
Orders 数据模块的类型名称为:
TdmOrder = class(TDataModule)
2). 数据模块实例的命名标准
数据模块实例的名称应当与相应的类型名称相同,但没有前缀T 。例如,前面的数据模块类型、实例名称如下:
类型名称
实例名
TdmCustomer
dmCustomer
TdmOrder
dmOrder
3.4.文件
建议在所有源文件、项目文件和单元文件使用结构化的文件头信息。一个文件头至少应包含以下信息:
{ Copyright @ Year by Authors }
3.4.1.项目文件
项目文件的名称应当具有描述意义。例如,“The Delphi 5 Developer’s Guide Bug Manager ”的项目名称为DDGBugs.dpr,一个系统信息程序的名称为SysInfo.dpr。
3.4.2.窗体文件
窗体文件的名称应当表达出窗体的用途,且具有Frm后缀。例如,About窗体的文件名叫AboutFrm.dfm,主窗体的文件名叫MainFrm.dfm。
3.4.3.数据模块文件
数据模块文件的名称应当表达出数据模块的作用,且具有DM后缀。例如,Customers数据模块的文件名叫CustomersDM.dfm。
3.4.4.远程数据模块文件
远程数据模块文件的名称应当表达出远程数据模块的用途。名称后要加RDM后缀。例如,Customers远程数据模块的文件叫CustomersRDM.dfm。
3.4.5.单元文件
1). 普通单元
(1) 单元名
单元的名称应当有描述性。例如,应用程序的主窗体单元叫MaimFrm.pas。
(2) Uses 子句
Interface部分的Uses子句应当只包含该部分需要的单元。不要包含可能由Delphi自动添加的单元名。Implementation部分的Uses子句应当只包含该部分需要的单元,不要有多余的单元。
(3) Interface 部分
Interface部分应当只包含需要被外部单元访问的类型、变量、过程与函数的声明。而且,这些声明应当在Implementation部分之前。
(4) Implementation 部分
Implementation部分包括本单元私有的类型、变量、过程与函数的实现。
(5) Initialization 部分
不要在Initialization部分放置花费时间很多的代码。否则,将导致应用程序启动时显得很慢。
(6) Finalization 部分
确保释放所有在Initialization部分中分配的资源。
2).窗体单元
窗体单元文件的名称与相应的窗体名称相同,只是要将前缀变成后缀。例如,About窗体的单元名称叫AboutFrm.pas。主窗体的单元文件名称叫MainFrm.pas。
3).数据模块单元
数据模块单元文件的名称与相应的数据模块名称相同。例如,数据模块单元的名称叫CustomersDM.pas。
4).通用单元
通用单元的名称应当表达出它的用途,名称前要加“u”前缀。例如,一个实用调试工具单元的名称叫uDebugUtilities.pas,包含全局变量的单元名称叫uCustomerGlobals.pas。
注意,一个项目中单元名称必须是唯一的。通用单元名不能重名。
5).元件单元
(1). 命名
元件单元应放在单独的路径中,以表明它们是定义元件的单元。它们一般与项目不放在同一路径下。单元文件名称应表达出其内容。
注意,有关元件命名标准的更多信息,请参阅“元件类型的命名标准”。
元件单元只能含有一个主要元件,这是指出现在元件选项板上的元件。其他辅助性的元件或对象也可以包含在同一单元中。
(2). 注册单元
元件的注册过程应当从元件单元中移走,放在一个单独的单元中。这个注册单元用于注册所有元件、属性编辑器、元件编辑器、向导等。
元件注册应当在设计期包中进行。因此,注册单元应当包含在设计期包而不是运行期包中。建议注册单元这样命名:
xxxReg.pas
其中,xxx字符前缀,以标识元件包名称或公司、个人、其他实体。例如,注册单元命名为xxxReg.pas。
6).包文件(.dpk)命名规则
(1). 运行期包与设计期包
运行期包中应当只包含所需要的单元。那些属性编辑器和元件编辑器的单元应当放在设计期包中。注册单元也应当放在设计期包中。
(2). 文件命名标准
包的命名遵循下列模式:
dcliiiDescvvCn.pkg —设计期包 iiiDescvvCn.pkg —运行期包
其中,iii代表一个2-3字符的前缀,用于标识公司、个人或其他需要标识的事情,也可不要;Desc表示该控件包的简短描述;vv代表包的版本号,你可以根据需要取舍;前缀“dcl”表示设计期包,没有该前缀表示运行期包;字母“Cn”表示编译器类型与编译器版本号,如:Delphi5 上一页 [1] [2] [3] 下一页 [Delphi程序]Delphi代码标准文档
|