Delphi编码标准资料_第1页
Delphi编码标准资料_第2页
Delphi编码标准资料_第3页
Delphi编码标准资料_第4页
Delphi编码标准资料_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Delphi编码标准.

一、序言

本文档详述了在Delphi4开发者指南下进行编程的代码编写标准.在通常情况下.

本文档遵循“取消”式格式的指引方针,该方针由Borland国际通过一些例外来使用。

在Delphi4开发者指南中包含本文档的目的在于阐述一种方法,通过该方法,开发小组

可以在他们所编写的代码中保持一贯的风格。这样做的目的是使在开发小组中的每一

个程序员都可以明白其他程序员的代码。这有助于提高代码编写的可读性和使用的一

贯性。

本文档并不意味着包含了所有存在于代码中的标准。但是,它的内容已足够帮你起

个好头。你可以自由的增加修改这些标准来满足你的需要。我们不赞成你偏离这些由

Borland开发人员所使用的标准太远。我们推荐这么做是因为一旦有新的程序员加入到

你的开发小组中,而他们最喜欢和最熟悉的是Borland的标准。象大多数代码标准文档,

本文档也会根据需要进行改动。因此,你可以到中找到最新的更新版本。本文档不包括

用户接口标准。本文档是独立的但也是同样重要的。已经有足够的第三方书籍和

Microsoft文档包括了另外一些指导方针,而我们决定并不复制这些信息,但我们会指引

你到MicrosoftDevelopersNetwork和一些资源,在那儿可以找到你所需的信息。

二、通用源代码格式规则

2.1缩格

缩格是指在每一级有两个空格。不要在源代码中保留tab字符,这是因为tab字符

会随着不同用户的不同设置和不同的资源管理工具(打印、文档、版本控制等)而代表

不同的宽度。

你可以通过关闭Environment诜项对话框中Editor页上的"Usetabcharacter”

和MOptimalfill”检查框(通过ToolsIEnvironment)来禁止保存tab字符。

2.2页边空格

页边空格会被设置成80字符宽。通常,源码不会超出这个边界,但这个方针会有一

些弹性。不管是否有可能,那些超出到另一行的语句会在一个逗号或其他操作符之后与

前面的语句相连。当一个语句被打断相连时,它应比原来的那一行语句缩进两个字符。

2.3Begin...End配对

Begin子句应写在独立的一行。例如,下面第一行是错误的写法而第二行是正确的

O

forI:=0to10dobegin〃错误,begin同for在同一行

forI:=0to10do〃正确,begin出现在独立的一行

begin

这个规则的例外是当begin子句的出现是作为一个else子句的一部分-参考例子:

ifsomestatementthen

begin

end

elsebegin

someOtherStatement;

end;

end语句永远出现在独立的一行。

当begin语句不是一个else子句的一部分时,相应的end语句永远缩进到与begin

部分相对应的位置。

ObjectPascal

3.1括号

永远不要在括号与括号之间的字符中间留下空格。下面的例子示范了错误的与正

确地使用括号中的空格:

CallProc(Aparameter);〃错误

CallProc(Aparameter);〃正确

永远不要在一个语句中使用不必要的括号。括号只应在源代码中需要的地方使用

。以下的例子示范了错误和正确的使用:

if(I=42)then〃错误-多余的括号

if(I=42)or(J=42)then〃正确-需要括号

3.2保留字和关键字

ObjectPascal保留字和关键字永远是全部小写.

3.3过程和函数(例程)

3.3.1命名/格式化

例程的名字永远应该以大写的字母开头并且中间错落分明以便于可读性。下面是

一个不正确格式的过程名称:

procedurethisisapoorlyformattedroutinename;

下面是一个合适的大小写例程名称的例子:

procedureThisisMuchMoreReadab1eRoutineName;

例程的名称应该同它的内容相符。一个会导致某个行为的例程应以动词开头。例

如:

procedureFormatllardDrivc;

一个用于设置输入参数的例程应以单词set作为前缀,例如:

procedureSetUserName;

一个用来接收某个值的例程应以单词get作为前缓,例如:

的参数的代码。

而例程中另外一些非变参数也可常量来传送。尽管这样做没有产生任何效果和提

高效率,这将会给调用例程的使用者提供更多的信息。

33.2.5名称的冲突

当使用拥有两个名称相同的例程的两个单元时,如果你调用该例程时,在uses子句

中排在后面的单元中的例程将会被调用。为了解决这种“在uses子句上的模糊”冲突,

要在调用该例程时写上相关的单元的前缀,例如:

sysUtile.FindClose(SR);

windows.FindClose(Hcindle);

3.4变量

3.4.1变量的命名和格式

变量的命名应以使用它们的目的相符

循环控制变量应采用一个单独的字符作为名字,匕如I,J,或K,也可以采用更加有

意义的名字,比如Userindex。

逻辑变量的名字应能充分表达准确的真或假的意思。

3.4.2局部变量

一个过程中的局部变量应遵循所有其它变量的使用和命名约定。临时变量的取名

应合理。

如果必须的话,在一进入例程就应初始化局部变量。局部的AnsiString变量会自

动初始化为一个空的字符串。

局部接口和派分接口类型变量将会自动初始化为nil,并且局部变数和ole变数类

型变量会自动初始化为Inassigned

3.4.3全局变量的使用

使用全局变量是不推荐的。但是,在某些时候还是必须使用,而且它们也只应在必

须使用的时候才使用。在这种时候,你应努力只在一段上下文范围内使用全局变量。例

如,一个全局变量只应在一个单元的implemntation部分内是全局的。如果打算在多个

单元类使用全局数据,你应将它们移到一个公共的单元中然后被其它所有单元使用.

全局变量可以在var子句中直接初始化为一个值。记住,所有的全局数据会自动初

始化为0,因此不要将全局变量初始化为一个“空”值比如0、nil、''、Unassigned

、等等。这样做的一个理由是因为零一初始化的全局数据在exe文件中不会占据任何空

间。零-初始化数据被存储在一个虚拟的数据段,它在应用程序启动后被分配在一段内

存中。非零-初始化的全局数据在硬盘的exe文件占用空间。

3.5类型

3.5.1大写约定

如果类型的名字是保留字,那么它应全部小写CWin32API类型通常全部大写,并且

你必须遵循在Windows.pas或其他API单元中的详细类型名称的约定。对于其他变量名

字,地一个字母应为大写,而其他字母应错落有致。下面是一些例子:

MyString:string;〃保留字

WindowHaiidlt!:HWND;“Win32API类型

I:Integer;〃在System单元中引进的类型标识符

浮点指针类型

不推荐使用Real类型,因为它的存在只是为了向前兼容早期的Pascal代码。在通

常情况下用Double来实现浮点指针的需要。并且,Double对处理器和总线而言是做了

最优化处理的,它也是IEEE中定义的标准数据格式。只有当需要的范围超出Double所

定义的范围时才使用Extended。Extended是intel定义的类型且在Java中不支持。只

有当浮点指针变量的实恒字节大小有其意义时才使用Single。(比如当使用另一种语言

的DLLs时)。

枚举类型

枚举类型的名字需符合使用该类型的目的。该类型的名字需以字符T为前缀,以表

明这是一个类型。枚举类型中的标识符列表必须包含两个或三个字符的前缀来对应于

该枚举类型的名字-例如:

TsongType=(stRock,stClassical,stCountry.stAlternative,stHeavyMetal,

stRB);

一个枚举类型的实例的名字应与不要前缀的枚举类型(SongType)相同,除非有更好

的原因来赋予该变量更特殊的名字,比如:FavoriteSongTypel,FavoriteSongType2等

等。

变数和。Ie变数类型

通常不建议使用变数和Ole变数类型。但在只有运行时刻才能知道数据类型的程

序中必须使用该类型,这种情形多出现在COM和数据库开发中。Ole变数使用在以COM

为基础的编程中例如自动化和ActiveX控制,而变数使用在非COM的编程中,这是因为变

数可以十分有效地存储本地Delphi字符串(同一个字符串变量一样),但Ole变数会将所

有的字符串转换为Ole字符串(WideChar字符串)并且并不实例运算-它们永远拷贝。

3.5.2结构类型

数组类型

数组类型的名字需符合它们使用的目的。该类型的名字必须加以前缀T。如果须声

明该数组类型的指针,那么该指针需加以前缀P而且应立即声明在该数组声明的前面。

例如:

type

PCycleArray=TCycleArray;

TCycleArray=array[l-*-100]ofinteger;

在实际应用中,数组的变量实例的名称应是其类型的名字去掉前缀T。

记录类型

记录类型的名字应符合使用它们的目的。其类型妁声明应加以前缀T。如果要声明

该记录类型的指针,就应加以前缀P并且应紧靠在类型声明的前面声明。例如:

type

PEmployee=TEmployee;

TEmployee=record

EmployeeName:string;

EmployeeRate:Double;

end;

3.6语句

3.6.1if语句

在if/thcn/cls。语句中最常发生的行为应放在then子句中,而其它发生可能性较

小的行为应放在else子句中。

尽量避免使用嵌套的if语句,在这种情形下应用多个if语句来判断各种可能.

不要使用if嵌套超过五级深度。应使代码编写得更加清晰、明了。

不要在if语句中使用不必要的圆括号。

如果在if语句中有多个条件需测试,这些条件反按计算强度由少到多的顺序从左

到右排列。这样做能使编译器在编译代码时获得布尔估算逻辑的捷径,从而使你的代码

获得最佳的优化。举例来说,如果条件1快过条件2,而条件2快过条件3,那么在if语

句中的排列应是:

if条件1and条件2and条件3then

3.6.2case语句

一般性话题

在一个case语句中的各个独立的单元应以数字或字母顺序排列。

每一个case单元的动作行为应保持简单而不应该超过四到五行代码。如果所要执

行的动作过于复杂应采用独立的过程或函数。

Case语句中的else子句只有当需要缺省行为或处理错误时才使用。

3.G2.2格式

case语句应遵循其它结构的缩格和命名约定。

3.6.3while语句

在一个whilo语句中不建议使用exit过程来跳出循环,尽量仅使用循环条件来跳出

循环。

在一个while循环中所用的初始化代码应紧靠在进入while循环前面出现而不要被

其它不相关的语句隔开。

任何结束后的处理应在循环之后立即进行。

3.6.4for语句

for语句只有当循环次数已知的情况下才能取代while语句使用。

3.6.5repeat语句

repeat语句的使用同while语句一样,并且遵循同样的通用方针。

3.6.6with语句

一般话题

with语句应节省使用,并且带有大量的警告。避免过度使用with语句并且在with

语句中小心使用多个对象、记录等等。例如:

withRecordI,Record2do

这些事情会使程序员感到困惑并难以发现问题所在。

格式

With语句遵循本文档所说明的命名约定和缩格的格式规则。

3.7结构异常处理

3.7.1一般话题

异常的处理大量地使用在错误纠正和资源保护方面。这就是说一旦资源被分配,一

个try…finally必需加以使用来保证该资源被正确的释放。这种异常的保护也是指在

一个单元的initializition/finalization或一个对象的constructor/destructor中

进行资源的分配和释放。

3.7.2try…finally的使用

任何情形下,每一次的分配都应跟随一个Sy…finally。举例来说,下面的代码会

造成可能的错误:

SomeClassl:=TsomeClass.Create;

SomeClass2;=TsomeClass.Create;

try

{dosomecode)

finally

SomeClassl.Free;

SomeClass2.Free;

end;

一个更安全更合适的分配过程应是:

SomeClassl:=TSomeClass.Creeite;

try

SomeClass2:二TsomeClass.Create;

{dosomecode}

finally

SomeClass2.Free;

end;

finally

SomeClassl.Free;

end;

3.73try...except的使用

只有当在异常被触发而你想执行一些任务时才使用try…except。通常,你没有必

要为了只是简单地在屏寨上显示一个错误信息而使用try-except语句,因为这会被

Application对象自动执行。如果你想在except子句中执行完一些任务之后调用缺省

的异常处理,使用raise来重新触发异常到下一个句柄。

3.7.4try...except...else的使用

try-exccpt中的else子句不建议使用,因为它会打断所有的异常包括那些你没有

准备的异常。

3.8类类型

3.8.1命名和格式

类类型的名称应符合使用它们的目的。类型名字应加以前缀T以表明这是一个类

型的定义-例如:

type

Tcustomer=class:T0bject)

类型的实例通常是没有前缀T的类型的名字-例如:

var

Customer:Tcustomer;

注意:查阅“构件类型的命名标准”来获得更多有关构件命名的信息。

3.8.2域

命名/格式

类的域名遵循与变量标识符同样的约定除了它们应以F为前缀,来表明这是一个域

的名称。

可视化

所有的域都必需是私有的。想在类的范围之外存取域得通过属性来使用。

3.8.3方法

3.83.1命名/格式

方法的命名应遵循本文档中有关过程和函数的约定叙述。

3.83.2使用静态的方法

如果使用一个静态的方法,那么该方法就不能被该类的后代类所继承。

3.8.3.3使用虚拟/动态的方法

如果你打算该类的方法能被后代的类所继承就得使用虚拟的方法。只有在该方法

有多个继承时(直接的或间接的)才使用动态的方法。例如,一个类类型包含一个可继承

的方法,而100个后代类要继承这种方法,那么这个方法就会动态地产生为100个后代类

使用的内存。

3.83.4使用抽象的方法

如果在一个类中使用抽象的方法,该类就不能被创建。只有在那些永远不会被创建

的类中使用抽象的方法。

3.83.5属性存取方法

所有存取类的方法都只能出现在类的private或protected部分。属性存取方法的

命名应遵循过程和函数的约定规则。读取存取方法(万法读取器)必需以单词Get为前

缀。写入存取方法(方法写入器)必需以单词Set为前缓。方法写入器的参数的名字应

为Value,并且它的类型应是它所操作的属性的类型。例如:

TSompClass=class(TObject.)

private

FsomeField:Integer;

protected

functionGetSomcField:Integer;

procedureSetSomeField(Value:Integer);

public

propertySomcField:IntegerreadGetSomeFicldwriteSetSomeField;

end;

3.8.4属性

3.8.4.1命名/格式

属性如果是表示为一个私有域的存取器的话,那么它的名字应是它们所操作的域的

名字除去解释符F。

属性的名字应是名词,不是动词。属性表示的是数据,而方法表示的是行为。

数组类型的名称应为复数。一般情况下属性的名称应为单数。

3.8.4.2使用存取的方法

尽管没有要求,但还是建议尽量少地为一个表示私有域的属性而使用写入存取方法

四、文件

4.1工程文件

4.1.1命名

工程文件应取个描述性的名字。例如,Delphi4开发者指南错误管理器的工程名

字是:DDGBugs.dpr。一个有关系统信息的程序的名字就应象Syslnfo.dpr0

4.2窗体文件

4.2.1命名

一个窗体文件的取名应可以描述使用该窗体的目的,并加以后缀frmo例如,一个

“关于”的窗体的文件名应是Aboutfrm.dpr。主窗体的文件名应是Mainfrm.dpr。

4.3数据模板文件

4.3.1命名

数据模板的取名应能表示使用该数据模板的目的,它的名称应加以两个字符的后缀

DM。例如,自定义数据模板的文件名字应为CustomersDM.dfm0

4.4远端数据模板文件

4.4.1命名

远端数据模板的取名应能表示使用该远端数据模板的目的,它的名称应加以三个字

符的后缀RDM。例如,自定义远端数据模板的文件名字应为CustomersRDM.dfm。

4.5Unit文件

4.5.1通用Unit结构

unit的名字

Unit文件应取一个可描述性的名字。例如,包含应用程序主窗体的单元应叫做

Mainfrm.pas。

uses子句

在interface部分的uses子句应包含在interface部分中的代码所需要的单元。

去掉那些Delphi可以自动加入到程序中的单元。

在implementation部分的uses子句应只包含在implementation部分中的代码所

需要的单元的名字。去捏不必要的单元。

interface部分

interface部分应包含只那些其它单元所需要存取类型的定义、变量、过程/函数

的预定义等等。否则,就应放在implementation部分定义。

implementation部分

implementation部分应包含那些只在本单元中私用的类型定义、变量、过程/函数

定义等等。

initialization部分

不要在initialization部分放入耗时长的代码,这将使程序的第一个界面出现

得比较缓慢。

finalization部分

在这里要保证释放你在Initialization部分所分配的任何资源。

4.5.2窗体单元

命名

一个窗体的单元文件应拥有与它所对应的窗体文件同样的名称。例如,“关于”窗

体的单元名称应为Aboutfrm.pas,而主窗体的单元名称应为Mainfrm.pas0

4.5.3数据模板单元

4.53.1命名

一个数据模板的单元文件应拥有与它所对应的数据模板文件同样的名称。例如,一

个自定义数据模板单元的名称应为CustomersDM.pas。

4.5.4一股目的单元

命名

一般目的单元的取名应符合使用该单元的目的。例如,一个实用程序单元取名为

BugUtilities.paso一个包含全局变量的单元取名为CustomerGlobals.paso

注意,该单元的名字不能与它的工程中所使用的所有包中的单元的名字相同。不赞

成使用一般的或通用的单元名字。

4.5.5构件单元

命名

构件单元应放在独立的目录,以将它们同定义构件组或构件集合的单元区分开来。

它们要永远同工程在不同的目录。单元名字应同它们的内容相符。

注意:查阅“用户定义的构件”部分来获得更多有关构件命名标准的信息。

4.6文件头

建议在所有源文件、工程文件、单元等等中使后信息化文件头。一个良好的文件

头应包含以下信息:

{

版权…著作的年、月、日…

}

五、窗体和数据模板

5.1窗体

5.1.1窗体类型命名标准

窗体类型的取名应能表达使用该窗体的目的。类型定义应加以前缀Tfrmo前缀后

面跟随着描述性的名字。例如,一个“关于”的窗体的类型的名字应为:

TfrmAbout=class;TForm);

主窗体的定义为:

TfrmMain=class(TForm);

一个用户接入窗体的名字应象:

TfrmCustomcrEntry=class(TForm);

5.1.2窗体实例命名标准

窗体实例应是没有带前缀T的相应类的名字。例如,对应于前面窗体类型而言,其

实例的名字应为:

类型名称实例名称

TfrmAboutfrmAbout

TfrmMainfrmMain

TfrmCustomcrEntryfrmCustomerEntry

5.1.3自动创建窗体

只有主窗体可以是目动创建的除非有其它更好的理由不这样做。所有其它的窗体

必需从工程选项对话框中的自动创建列表中移走。查阅以下部分来获得更多的信息。

5.1.4模式窗体实例化函数

所有的窗体单元都应包含一个窗体实例化函数,该函数用来创建、设置、模式地显

示窗体,并释放窗体。该函数应返回窗体的模式结果。该函数要传递的参数应遵循本文

档指定的“参数传递”标准。通过这种方式封装的函数性有助于代码的再利用和维护。

该窗体的变量要从单元中移走,并再窗体实例的函数中进行本地式地定义。注意,

这就意味着该窗体必需从工程/选项对话框中的自动创建列表中剔除。参考本文档后面

的“自动创建窗体”。

例如,下面的单元展示了再GetUserData窗体中的一个函数。

unitUserDatafrm;

interface

uses

windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,

Dialogs,StdCtrls;

type

TfrmUserData=class(TForm)

edtUserXame:TEdit;

edtUserlD:TEdit;

private

{Privatedeclarations)

public

{Publicdeclarations}

end;

functionGetUserData(varaUserName:String;varaUserlD:Integer):

Word;

implementation

{$R*.DFM}

functionGetUserData(varallserNamc:String;varaUserTD:Integer):

word;

var

frmUserData:TfrmuscrData;

begin

frmUserData:=Tfrmusei'Dcita.Create(Application);

try

frmUserData.Caption:='GellingUserData,;

Result:=frmUserData.ShowModal;

if(Result=mrOK)then

begin

aUserXame:=frmUserData.edtUserName.Text;

alserlD:=StrToInt(frmUserData.edtUserlD.Text);

end;

finally

frmUserData.Free;

end;

end;

end.

5.2数据模板

5.2.1数据模板命名标准

数据模板的取名要符合使用该数据模板的目的。类型的定义应加以前缀T,后面紧

接着描述性的名字,最后要加以后缀单词“DataModuS"。例如,一个自定义的数据模

板有时候应该象:

TCustomerDataModu1e=class(TDataModu1e)

一个命令式的数据模板的名字应象:

TOrdersDataModule=class(TDataModu1e)

5.2.2数据模板实例命名标准

数据模板实例的名称应是对应不带前缀T的类型的名称。例如,对于前面的窗体类

型而言,其实例的名称应为:

类型名称实例名称

TCustomerDataModu1eCustomerDataModule

TOrdersDataModuleOrdersDataModule

六、包

6.1使用运行包和设计包的比较

运行时刻的包应只包含其它构件包所要求的单元或构件。另外,包含属性/构件编

辑器和其它只为设计的代码应放入到设计时刻包中。注册单元应放在设计包中。

6.2文件命名标准

包的名称应依照下面的例子:

“iiilibw.pkg”-设计时刻包

“iiistdw.pkg”-运行时刻包

字符“iii”表示一个3字符标识前缀。这个前缀用来表明公司、个人或其它有标

识意义的实体。

字符“vv”表示为该包想要对应Delphi某个版本的包的版本号。

注意,包的名字中包含“lib”或“std”的意思是表明这是一个设计时刻包还是一

个运行时刻包。

如果既是设计时刻包乂是运行时刻包,该文件的命名是同上面一样的,例如,为

Delphi4开发者指南做的包的名称应为:

DdgLib40.pkg-设计时刻包

DdgStd40.pkg-运行时刻包

七、构件

7.1用户自定义构件

在标准构件中命名出来的构件的名称同在“类类型”部分定义中的一样定义成一

个类类型,不同的是它们有一个3字符的指示前缀,这个前缀可以表示公司、个人或其

它实体。例如,一个为Delphi4开发者指南编写的时钟构件的名称定义为:

TddgClock=class:TComponent)

注意,那三个前缀字符是小写的。

7.2构件单元

构件单元应只包含一个主要的构件,一个主要的枸件是指出现在构件栏中的构件。

主要构件的辅助构件/对象应放入到同一个单元中。

7.3使用注册单元

构件的注册过程应从构件本身的单元中剔除,并放入到一个独立的单元中。这个注

册单元可以用来注册任何构件、属性编辑器、构件编辑器、专家器等。

构件的注册只应在设计时刻包中进行,注册单元反包含在设计时刻包中而不应放在

运行时刻包中。

推荐使用的注册单元的名称是:

X某某Reg.pas

上面的3个前缀字符“X某某”用来表示一个公司、个人或任何其它的实体。例如,

在Delphi4开发者指南中的注册单元的名称应为DdgReg.pas。

7.4构件实例命名约定

所有的构件都应取个描述性的名称。由Delphi创建的缺省名的构件不会被遗弃。

在设计构件类型时应设计一个小写的前缀。使用前缀而不使用后缀的原因是在搜寻时,

在对象检查器和代码探索器中搜寻构件的名字比搜寻构件的类型更容易实现。

7.5构件的前缀

以下构件的前缀可以用来设计Delphi4中的标准构件。请在此列表中加入第三方

构件的前缀。

7.6Standard页

前缀构件

mmTMainMenu

pmTPopupMenu

mmiTMainMenuItem

pmiTPopupMenuItern

前缀构件

IblTLabel

edtTEdit

memTMemo

btnTButton

cbTCheckBox

rbTRadioBox

lbTListBox

ebbTComboBox

sebTScrollBar

gbTGroupBox

rgTRadioGroup

pnlTPanel

cmdlTCommandList

7.7Additional页

bbtnTBitBtn

sbtnTSpeedButton

medtTMaskEdit

sgTStringGrid

dgTDrawGrid

imgTImage

shpTShape

bvlTBevel

sbxTScrollBox

clbTCheckListbox

splTSplitter

stxTStciticText

chtTChart

7.8Win32页

tbcTTabControl

pgcTPageControl

imglTTmageList

redtTRichEdit

thrTTrackBar

prbTProgressBar

udTUpDuwn

hkTHotKcy

aniTAnimate

dtpTDateTimePicker

tvTTreeView

IvTListView

hdrTHcadcrControl

前缀构件

stbTStatusBar

tlbTToolBar

clbTCoolBar

7.9System页

tmTTimer

pbTPaintBox

mpTMediaPlayer

olecTOleContainer

ddccTDDEClientltem

ddciTDDEC1lentItem

ddscTDDEServerConv

ddsiTDDESei'verltem

7.10Internet页

cskTCIieiilSuukel

sskTScrvcrSocket

wbdTWebDispatcher

PPTPageProducer

tpTQueryTableProducer

dstpTDataSetTableProducer

nmdtTNMDayTime

necTNMEcho

nfTNMFinger

nftpTNMFtp

nhttpTNMHttp

nMsgTNMMsg

nmsgTNMMSGServ

nntpTNMNNTP

npopTNMPop3

nuupTNMUUProcessor

smtpTNMSMTP

nstTNMStrm

nstsTNMStrmServ

ntmTNMTime

nudpTNMUdp

pskTPowerSock

ngsTNMGeneralServer

htmlTHtml

urlTNMUrl

smlTSinip1eMail

7.11DataAccess页

前缀构件

dsTDataSource

tblTTable

qryTQuery

spTStoredProc

dbTDataBase

ssnTSession

bmTBatchMove

usqlTUpdateSQL

7.12DataControls页

dbgTDBGrid

dbnTDBNavigator

dbtTDBText

dbeTDBEdit

dbmTDBMemo

dbiTDBImage

dblbTDBListBox

dbcbTDBComboBox

dbchTDBCheckBox

dbrgTDBRadioGroup

dbllTDBLookupListBox

db1cTDBLookupComboBox

dbreTDBRichEdit

dbcgTDBCtrlGrid

dbchTDBChart

7.13DecisionCube页

debTDecisionCube

deqTDecisionQuery

desTDecisionSource

depTDecisionPivot

degTDecisionGrid

degrTDecisionGrtiph

7.14QReport页

qrTQuickReport

qrsdTQRSubDetail

qrbTQRBand

qrcbTQRChildBciiid

qrgTQRGi'oup

qrlTQRLabel

前缀构件

qrtTQRText

qreTQRExpr

qrsTQRSysData

qrmTQRMemo

qrrtTQRRichText

qrdrTQRDBRichText

qrshTQRShape

qriTQRTmage

qrdiTQRDBMImage

qrcrTQRCompositeReport

qrpTQRPreview

qrchTQRChart

7.15Dialogs页

对话框构件是由构件封装的真正的窗体,因此,它们应遵循窗体的命名约定。类型

已由构件的名称定义。它的实例的名称是Delphi自动生成的类型实例名字去掉数字后

缀。举例如下:

类型实例名字

TOpenDialogOpenDialog

TSaveDialogSaveDialog

TOpenPictureDialogOpenPictureDialog

TSavePictureDialogSavePicturcDialog

TFontDialogFontDialog

TColorDialugColoiDialog

TPrintSetupDialogPrintSetupDialog

TFindDialogFindDialog

TReplaceDialogRoplaceDialog

7.16Win3.1页

dbllTDBLookupList

dblcTDBLookupCombo

tsTTabSet

olTOutline

tnbTTabbedNoteBook

nbTNoteBook

hdrTHeader

fibTFileListBox

dlbTDirectoryListBox

debTDriveComboBox

febTFliterComboBox

7.17Samples页

88TGuuge

前缀构件

egTColorGrid

spbTSpinEdit

speTSpinEdit

dolTDirectoryOutline

calTCalendar

ibeaTIBEventAlerter

7.18ActiveX页

cfxTChartFX

vspTVSSpell

fibTFIBook

vtcTVTChart

grpTGraph

7.19Midas页

prvTProvider

cdsTClientDataSet

qcdsTQueryClientDataSet

dcomTDCOMConnection

oleeTOleEnterpriseConnection

sckTSocketConnection

misTReiuuleSeivei

midTMidasConncction

8.注释

8.1序言性注释

序言性注释加在单元、工程的开头处,非常重要,主要内容如下:

程序名称作者创建日期最近一次修改日期

功能概述

输入数据或入口参数输出数据或出口参数

主要处理流程和主要算法描述主要的数据结构

利用的子程序相关的全程变量、局部变量的含义

调用时注意的问题

8.2程序块注释

数据结构算法或欠理流程注意问题

8.3指令级注释

语句功能实现技巧变量含义

以上三种注释的重要性依次递降,侧重与序言性注释和程序块注释。

9.注意事项及建议

9.1代码执行效率:

在编写代码时(特别是数据库方面的代码时),要考虑执行效率。尽量避免使用

Table,DBGrid等与数据库联系紧密的控件。避免使用RecordCount之类影响执行效率

的语句。在对数据库进行操作时,尽量使用Query控件直接用SQL语句进行操作。减少

全局变量的定义和使用。

9.2风格的统一:

在设计界面时,要保持风格的统一性,使相类似界面的控件分布、窗体大小、字体

大小等方面要一致。提示信息时统一使用MessageBox()o提示信息和按钮等要尽量遵

循Windows标准。提示信息要明确、友好。

9.3函数和过程:

若超过两处的代码要使用类似的功能模块,要将该功能模块设计为函数或过程。该

函数或过程的代码至少要有一定的代码数量,否则没有必要并且会增加阅读代码的难度

。在程序中自定义的函数或过程不宜太多太大。

9.4异常处理:

在可能出现异常的地方要编写代码("y…Except)处理出现的异常,这样会避免意

想不到的错误。还可以对异常做进一步处理。

9.5输入的控制:

确定比较恰当的TabOrder顺序,在不用鼠标的情况下也可以完成操作。在输入时,

要控制输入的合法性(如数字),在输入前就要加以控制以避免不合法的数据。

9.6支持多数据库:

因为软件要适用多数据库,因此在代码编写时要注意尽量使用标准SQL语句,尽量

避免使用数据库提供的函数。必要时按数据库类型分情况处理。请参看附录:多数据库

支持分析。

附录:

多数据库支持分析

一、目的与任务

1、形成一套支持多数据库的解决方案,在各细小的问题上都要力求清楚透彻,使程

序员在写程序时有据可查。

2、提供访问各数据库的底层公用程序。

3、负责程序员开发过程中的数据库问题咨询。

4、检查软件对多数据库的支持程度和效果,监督程序员支持多数库的开发过程。

二、支持的数据库

1、MSSQLServer6.5

2、Oracle7.x

3、DB25.0

4、SybaseSQLServer11.5

5、SybaseSQLAnywhere5.5

三、对各数据库的详细分析

以下的分析内容,是以SYBASE数据库作为标准进行比较的。因为我们的程序员对

SYBASE的各方面都很熟悉了,其他数据库在各方面同SYBASE存在有哪些异同点,对于不

同的方面如何变通实现等,是以下要主要分析解决的。

1、标准SQL语法列表(SQL92)

2、各数据库SQL语句/子句之间的差别,如何实现相互替代或以标准语句实现。

SELECT:

SYBASE

SELECT[ALL|DISTINCT]select_list

[INTO[[database.]owner.]table_name]

[FROM[[database.]owner.]{table_name|view_name)[HOLDLICK]]

[WHEREsearch_conditions]

[GROUPBY[ALL]aggregates_free_expression[HAVINGsearch_conditions]]

[ORDERBY{[[database.]owner.]{table_name|viewname}}

column_nameIselect_list_numberexpression)"ASCIDESC]]

[COMPUTErow_aggregate(column_name)[rrow_aggregate

(column_name)]...

[BYcolumn_name[,column_name]...]]

[FORBROWSE]

其中:selectlist,

search_conditions,

ORACLE格式:

SELECT[ALL|DISTINCT]select_list

[INTO:variable]

[FROM[[database.]owner.]{tablename|viewname)]

[WHEREsearch_conditions]

[CONNECTBYcondition]

[GROUPBYexpression][HAVINGscarchconditions]

[{UNIONIINTERSECTIMINUS)SELECT-]

[ORDERBY{expression|position}[ASC|DESC]•,,]

[FORUPDATE[OF[table|view].column...]]

[NOWAIT]

其中:select」ist,

search_conditions,

MSSqlServer格式同Sybase格式:

DB2格式:

SELECT[ALL|DISTINCT]select_list

[FROM[owner.](tablename|viewname}]

[WHEREsearch_conditions]

[GROUPBY[ALL]aggregates_free_expression[HAVINGsearchconditions].

[ORDERBY{[owner.]{table_nameIview_name:}

column_nameIexpression)[ASCDESC]]

注:在SQL中不能用数据库名,即一条SQL语名只能从一个数据库中取数。

在DB2中不能使用"F_1=F_2+F_3”只能用"F_2+F_3ASF_l",所有规定在

SELECT语句中只用格式“F_2+F_3AsF_l”(尤其是在数据窗口中的计算列)。

INSERT:

INSERTINTO列1,列2...

{VALUES(值1,值2……))

INSERTINTO列1,列2{子查询}

INSERTSSYBASE.ORACLE.MSSqlServer.DB2中是相同的。

UPDATE:

UPDATE用户名。表名。列名。一

SET列名二表达式,列名二表达式。。。

[WHERE条件]

UPDATE用户名。表名。列名。一

SET(列名,列名。。。)=(查询)。。。

[WHERE条件]

UPDATE在SYBASE、ORACLE、MSSqlServer中是相同的;

UPDATE在DB2中没有FROM子句,因此在UPDATE中只能通过子直询来实现。

DELETE:

DELETE[FROM]用户名。表名。别名

[WHERE条件]

DELETESSYBASE.ORACLE.MSSqlServer中是相同的;

DELETE在DB2中必须有FROM子句,因此在UPDATE中只能通过子直询来实

3.Function之间的差别,用法,举例,如何实现相互替代或以标准函数实现。

函数SybaseMsSqlOracleDB2

Server

系统函数:

CoLnameCobjJd.colJd有

)

Col」ength("objname有

“/colname")

Datalength(expression有

)

Db_id([“db_name"])有

Db_name([db_id])有

Host_id()有

Host_name()有

Index_col(Mobjnamef,有

,index_id,key#)

Isnull(expression,value有

)

Object_id(Mobjname,,有

)

Object_name(obj_id)有

Suser_id(["loginname有

”])

Suser_namA([servpr_us有

er_id])

User_id([°namejn_db有

“】)

User_name([user_id])有

数学函数:

Abs(n)有有有有

Floor(n)有有有有

Power(m,n)育有育有

Round()有有有有

Sign(n)有有有有

Sqrt(n)有有有有

Ceiling(n)有有自定义有

ceiling(n)

字符串函数:

Ascii(char_expr)有有有有

Ltrim(char_expr)有有函数多了一个参有

数,Ltrim(char_e

xpr,[/sef])f

set省略时,表示

删除左边空格

Rtrim(char_expr)有有函数多了一个参

数,Rtrim(char_

expr,[;sef])

,set省略时,表

示删除右边空格.

Char(n)有有Chr(n)有

Datalength(/string,)有有自定义自定义

Datalength('sDatalength(,str

tringf)ing')

Charindex('sub'p有有自定义自定义

Charindex('subCharindex('sub'

arenf)

'.'parent'),'parent*)

Patindex(,f%pattern%有有自定义patindex自定义patindex

('sub','pare('sub'parent

.expression)

nt'),)

不可用通配符不可用通配符

Replicate(char_expr,int有有自定义自定义Replicate()

eger_expr)Replicate()

Space(integer_expr)有有自定义Space。有

Right(char_expr,intege有有自定义right。有

r-expr)

Str(float_expr[,length[,有有可用可用cast(double

To_char(numberasvarcharO)代替

dccima]])

)

代替

Stuff(char_exprl,start.l有有可用Replace自定义

(*Parent','

ength,char_expr2)Stuff(char_exprl

find,replac

startjength,cha

e,)r

r_expr2)

代替

Sub

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论