📄 delphi编码规范.htm
字号:
<TD width=165>db</TD></TR>
<TR>
<TD width=458>TSockConnection,TDCOMConnection等连接元件类</TD>
<TD width=165>con</TD></TR>
<TR>
<TD width=458>TQuickRep, TFastReport等所有的报表元件类</TD>
<TD width=165>rpt</TD></TR>
<TR>
<TD width=458>TDDEClientConv,TDDEClientItem等所有的DDE元件类</TD>
<TD width=165>dde</TD></TR>
<TR>
<TD width=458>TMonthCalendar等所有的日历类</TD>
<TD width=165>cal</TD></TR>
<TR>
<TD width=458>TGroupBox等控件类</TD>
<TD width=165>grp</TD></TR></TBODY></TABLE>
<P> 如上所示,元件类型前缀是从分析描述元件的类型性质而来的。通常情况下,下面的规则描述如何定义一个元件类型前缀:</P>
<UL>
<LI>从元件类型名中移去T前缀。例如TButton变成Button。
<LI>除了第一个元音,删去所有元音字母。例如,Button变成bttn,Edit变成edt。
<LI>压缩双字母。例如,bttn变成btn。
<LI>如发生冲突,则在某一元件前缀中加入一个元音。例如在TBatton元件的前缀中加入元音变为batn,以区别TButton的前缀。 </LI></UL>
<UL>
<LI>不过,上述规则首先得保证前缀名称必须符合习惯,做到见名知意,如:TDDEClientConv控件的前缀就是一个例外。 </LI></UL>
<P>注意:元件的前缀是为了表示出元件的类型,是按钮,还是标签等等,因此没有必要为每一个特别元件类建立一个元件前缀,如:
TMyButton的元件前缀仍为btn。</P>
<H5>(2). 元件性质标识名</H5>
<P>
元件性质标识名是元件意图的描述。例如,一个用于关闭窗体的TButton元件实例可命名为btnClose。一个编辑姓名的元件实例可命名为edName。</P>
<H3><B>3.3.5.<A name=窗体类型>窗体与对话框类型</A></B></H3>
<H4>1). <A name=窗体类型的命名标准>窗体类型的命名标准</A></H4>
<P>
窗体或对话框类型的名称应当表达出窗体的用途,如果是窗体要加“Tfrm”前缀,如果是对话框要加“Tdlg”,后跟描述性名。例如,About窗体类型名称为:</P>
<BLOCKQUOTE>
<P>TfrmAbout = <B>class</B>(TForm)</P></BLOCKQUOTE>
<P>主窗体的类型名称为:</P>
<BLOCKQUOTE>
<P>TfrmMain = <B>class</B>(TForm)</P></BLOCKQUOTE>
<P>客户登录窗体的类型名称为:</P>
<BLOCKQUOTE>
<P>TfrmCustomerEntry = <B>class</B>(TForm)</P></BLOCKQUOTE>
<P>登陆对话框的类型名称为:</P>
<BLOCKQUOTE>
<P>TdlgLogin = <B>class</B>(TForm)</P></BLOCKQUOTE>
<H4>2). <A name=窗体实例的命名标准>窗体实例的命名标准</A></H4>
<P> 窗体实例的名称与相应的类型名称相同,但没有前缀T 。例如,前面提到的窗体类型与实例的名称为:</P>
<TABLE width="100%" border=1>
<TBODY>
<TR>
<TD>类型名</TD>
<TD>实例名</TD></TR>
<TR>
<TD>TfrmAbout</TD>
<TD>frmAbout</TD></TR>
<TR>
<TD>TfrmMain</TD>
<TD>frmMain</TD></TR>
<TR>
<TD>TfrmCustomerEntry</TD>
<TD>frmCustomerEntry</TD></TR>
<TR>
<TD>TdlgLogin</TD>
<TD>dlgLogin</TD></TR></TBODY></TABLE>
<H4>3). <A name=自动创建的窗体>自动创建的窗体</A></H4>
<P> 除非特别原因,只有主窗体才自动生成。其他所有窗体必须从Project
Options对话框的自动生成列表中删除。更进一步信息,请参阅后面几节。</P>
<H4>4). <A name=模式窗体实例化函数>模式窗体实例化函数</A></H4>
<P>
所有窗体单元都应当含有实例化函数,用于创建、设置、模式显示和释放窗体。这个函数将返回由窗体返回的模式结果。传递给这个函数的参数遵循参数传递的规则。之所以要这样封装,是为了便于代码的重用和维护。</P>
<P> 窗体的变量应当从单元中移走,改在窗体实例化函数中作为局部变量定义(注意,要求从Project
Options对话框的自动生成列表中移走该窗体。请看前面的内容。</P>
<P>例如,下面的单元文件演示了GetUserData的实例化函数。</P>
<P><B>Unit</B> UserDataFrm;</P>
<P><B>Interface</B></P>
<P><B>Uses<BR> </B>Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms,<BR> Dialogs, StdCtrls;</P>
<P><B>Type</B></P>
<P> TfrmUserData = <B>class</B>(TForm)<BR> edtUserName:
TEdit;<BR> edtUserID: TEdit;<BR> <B>private<BR>
</B><I><FONT color=#0000ff>{ Private declarations }</FONT></I><BR>
<B>public<BR> </B><I><FONT color=#0000ff>{ Public declarations
}</FONT></I><BR> <B>end</B>;</P>
<P><B>function</B> GetUserData(<B>var</B> aUserName: <B>String</B>;<B>var</B>
aUserID: Integer): Word;</P>
<P><B>implementation</B></P>
<P><I><FONT color=#0000ff>{$R *.DFM}</FONT></I></P>
<P><B>function</B> GetUserData(<B>var</B> aUserName: <B>String</B>;<B>var</B>
aUserID: Integer): Word;<BR><B>var<BR> </B>frmUserData:
TfrmUserData;<BR><B>begin<BR> </B>frmUserData :=
TfrmUserData.Create(Application);<BR> frmUserData.Caption:='Getting User
Data' ;<BR> Result : = frmUserData.ShowModal;<BR> <B>if
</B>Result=mrOK <B>then<BR> begin<BR> </B>aUserName :=
frmUserData.edtUserName.Text;<BR> aUserID :=
StrToInt(frmUserData.edtUserID.Text);<BR> <B>end</B>;<BR>
<B>finally<BR> </B>frmUserData.Free;<BR>
<B>end</B>;<BR><B>end</B>;</P>
<P><B>End</B>.</P>
<H4>5).<A name=窗体框架与复合窗体>窗体框架与复合窗体</A></H4>
<P> 如果一个窗体结构过于复杂,就必须将其分化成为一个主窗体框架以及嵌入到主窗体框架的若干子窗体框架。如:</P>
<BLOCKQUOTE>
<P>TfrmMainFrame: TfrmInfoFrame,TfrmEditorFrame</P></BLOCKQUOTE>
<P>
使用窗体框架,主要是为了解决界面和代码复用问题,以及提高单元代码的内聚力(划分后,每一个窗体框架为一个独立单元),从而提高软件工程质量。你必须提炼出界面关联代码(可复用的)和应用关联代码(不能复用的)。</P>
<H3>3.3.6.<A name=数据模块类型>数据模块类型</A></H3>
<H4>1). 数据模块的命名标准</H4>
<P> 数据模块类型名称应表达出它的用途,且要加前缀“Tdm”,后跟描述性名称。例如,Customer数据模块的类型名称为:</P>
<BLOCKQUOTE>
<P>TdmCustomer = <B>class</B>(TDataModule)</P></BLOCKQUOTE>
<P>Orders 数据模块的类型名称为:</P>
<BLOCKQUOTE>
<P>TdmOrder = <B>class</B>(TDataModule)</P></BLOCKQUOTE>
<H4>2). 数据模块实例的命名标准</H4>
<P> 数据模块实例的名称应当与相应的类型名称相同,但没有前缀T 。例如,前面的数据模块类型、实例名称如下:</P>
<TABLE width="100%" border=1>
<TBODY>
<TR>
<TD>类型名称</TD>
<TD>实例名</TD></TR>
<TR>
<TD>TdmCustomer</TD>
<TD>dmCustomer</TD></TR>
<TR>
<TD>TdmOrder</TD>
<TD>dmOrder</TD></TR></TBODY></TABLE>
<H2>3.4.<A name=文件>文件</A></H2>
<P> 建议在所有源文件、项目文件和单元文件使用结构化的文件头信息。一个文件头至少应包含以下信息:</P>
<BLOCKQUOTE>
<P><I><FONT color=#0000ff>{<BR>Copyright @ Year by
Authors<BR>}</FONT></I></P></BLOCKQUOTE>
<H3>3.4.1.<A name=项目文件>项目文件</A></H3>
<P> 项目文件的名称应当具有描述意义。例如,“The Delphi 5 Developer’s Guide Bug Manager
”的项目名称为DDGBugs.dpr,一个系统信息程序的名称为SysInfo.dpr。</P>
<H3>3.4.2.<A name=窗体文件>窗体文件</A></H3>
<P>
窗体文件的名称应当表达出窗体的用途,且具有Frm后缀。例如,About窗体的文件名叫AboutFrm.dfm,主窗体的文件名叫MainFrm.dfm。</P>
<H3>3.4.3.<A name=数据模块文件>数据模块文件</A></H3>
<P>
数据模块文件的名称应当表达出数据模块的作用,且具有DM后缀。例如,Customers数据模块的文件名叫CustomersDM.dfm。</P>
<H3>3.4.4.<A name=远程数据模块文件>远程数据模块文件</A></H3>
<P>
远程数据模块文件的名称应当表达出远程数据模块的用途。名称后要加RDM后缀。例如,Customers远程数据模块的文件叫CustomersRDM.dfm。</P>
<H3>3.4.5.<A name=单元文件>单元文件</A></H3>
<H4>1). <A name=普通单元>普通单元</A></H4>
<H5>(1) 单元名</H5>
<P> 单元的名称应当有描述性。例如,应用程序的主窗体单元叫MaimFrm.pas。</P>
<H5>(2) <B>Uses</B> 子句</H5>
<P>
Interface部分的Uses子句应当只包含该部分需要的单元。不要包含可能由Delphi自动添加的单元名。Implementation部分的Uses子句应当只包含该部分需要的单元,不要有多余的单元。</P>
<H5>(3) <B>Interface</B> 部分</H5>
<P>
Interface部分应当只包含需要被外部单元访问的类型、变量、过程与函数的声明。而且,这些声明应当在Implementation部分之前。</P>
<H5>(4) <B>Implementation</B> 部分</H5>
<P><B> </B>Implementation部分包括本单元私有的类型、变量、过程与函数的实现。</P>
<H5>(5) <B>Initialization</B> 部分</H5>
<P> 不要在Initialization部分放置花费时间很多的代码。否则,将导致应用程序启动时显得很慢。</P>
<H5>(6) <B>Finalization</B> 部分</H5>
<P> 确保释放所有在Initialization部分中分配的资源。</P>
<H4>2).<A name=窗体单元>窗体单元</A></H4>
<P>
窗体单元文件的名称与相应的窗体名称相同,只是要将前缀变成后缀。例如,About窗体的单元名称叫AboutFrm.pas。主窗体的单元文件名称叫MainFrm.pas。</P>
<H4>3).<A name=数据模块单元>数据模块单元</A></H4>
<P> 数据模块单元文件的名称与相应的数据模块名称相同。例如,数据模块单元的名称叫CustomersDM.pas。</P>
<H4>4).<A name=通用单元>通用单元</A></H4>
<P>
通用单元的名称应当表达出它的用途,名称前要加“u”前缀。例如,一个实用调试工具单元的名称叫uDebugUtilities.pas,包含全局变量的单元名称叫uCustomerGlobals.pas。</P>
<P>注意,一个项目中单元名称必须是唯一的。通用单元名不能重名。</P>
<H4>5).<A name=元件单元>元件单元</A></H4>
<H5>(1). 命名</H5>
<P> 元件单元应放在单独的路径中,以表明它们是定义元件的单元。它们一般与项目不放在同一路径下。单元文件名称应表达出其内容。</P>
<P>注意,有关元件命名标准的更多信息,请参阅<A
href="http://dev.cq118.com/web/cn/research/softengine/dcs.htm#元件类型的命名标准">“元件类型的命名标准”</A>。</P>
<P> 元件单元只能含有一个主要元件,这是指出现在元件选项板上的元件。其他辅助性的元件或对象也可以包含在同一单元中。</P>
<H5>(2). 注册单元</H5>
<P> 元件的注册过程应当从元件单元中移走,放在一个单独的单元中。这个注册单元用于注册所有元件、属性编辑器、元件编辑器、向导等。</P>
<P> 元件注册应当在设计期包中进行。因此,注册单元应当包含在设计期包而不是运行期包中。建议注册单元这样命名:</P>
<BLOCKQUOTE>
<P>xxxReg.pas</P></BLOCKQUOTE>
<P>其中,xxx字符前缀,以标识元件包名称或公司、个人、其他实体。例如,注册单元命名为xxxReg.pas。</P>
<H4>6).<A name=包文件(.dpk)命名规则>包文件(.dpk)命名规则</A></H4>
<H5>(1). 运行期包与设计期包</H5>
<P> 运行期包中应当只包含所需要的单元。那些属性编辑器和元件编辑器的单元应当放在设计期包中。注册单元也应当放在设计期包中。</P>
<H5>(2). 文件命名标准</H5>
<P> 包的命名遵循下列模式:</P>
<BLOCKQUOTE>
<P>dcl<B>iii</B>Desc<B>vvCn</B>.pkg
—设计期包<BR><B>iii</B>Desc<B>vvCn</B>.pkg —运行期包</P></BLOCKQUOTE>
<P>
其中,iii代表一个2-3字符的前缀,用于标识公司、个人或其他需要标识的事情,也可不要;Desc表示该控件包的简短描述;vv代表包的版本号,你可以根据需要取舍;前缀“dcl”表示设计期包,没有该前缀表示运行期包;字母“Cn”表示编译器类型与编译器版本号,如:Delphi5=D5,
Delphi4=D4, CBuilder3=C3...。</P>
<P>注意包名称中的lib或std分别表示这是设计期包还是运行期包。例如:</P>
<BLOCKQUOTE>
<P>dclrbStdCompsD5.pkg —Delphi
5的设计期包<BR>rbStdCompsD5.pkg —Delphi
5的运行期包</P></BLOCKQUOTE>
<H1>4.<A name=Delphi代码自动格式化工具>Delphi代码自动格式化工具</A></H1>
<P>
尽管大多数的代码自动格式化工具能够帮你重排源程序格式,以及更新保留字和标示符的大小写,但是这最好在使用版本控制前进行,如果你已经使用了版本控制,建议你不要轻易使用代码自动格式化工具,哪怕多一个空格,版本控制工具也会认为该行已被修改,从而给程序管理带来不变。</P>
<H1>5.<A name=代码标准文档更新>代码标准文档更新</A></H1>
<P> 关于Delphi代码标准的最新文档,你可以在 <A
href="http://jediedit.heha.net/">http://jediedit.heha.net/</A> 处获得。</P>
<H1>6.<A name=参考>参考</A></H1>
<P><A href="http://www.xapware.com/ddg" target=_blank>Delphi 程序设计编码规范 For
《Delphi Development Guide》</A>(E)
<P><A
href="http://dev.cq118.com/web/cn/research/softengine/Pascal%20Standards%20FAQ.htm">Pascal
Standards FAQ</A>(E)
<P>Artemis Alliance Delphi Coding Standards (E)
<P>Borland官方Object Pascal书写风格指南 (E) </P></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -