[doc]-软件公司delphi4程序员代码编写标准指南(doc46)-it_第1页
[doc]-软件公司delphi4程序员代码编写标准指南(doc46)-it_第2页
[doc]-软件公司delphi4程序员代码编写标准指南(doc46)-it_第3页
[doc]-软件公司delphi4程序员代码编写标准指南(doc46)-it_第4页
[doc]-软件公司delphi4程序员代码编写标准指南(doc46)-it_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

DELPHI4程序员代码编写标准指南版权所有1998XAVIERPERCHED和STEVETEISEIRA一、序言二、通用源代码格式规则21缩格22页边空格23BEGINEND配对OBJECTPASCAL31括号32保留字和关键字33过程和函数(例程)331命名/格式化332形式参数3321格式化3322命名3323参数的排序3324常量参数3325名称的冲突34变量341变量的命名和格式342局部变量343全局变量的使用35类型351大写约定3511浮点指针类型3512枚举类型3513变数和OLE变数类型352结构类型3521数组类型3522记录类型36语句361IF语句362CASE语句3621一般性话题3622格式363WHILE语句364FOR语句365REPEAT语句366WITH语句3661一般话题3662格式37结构异常处理371一般话题372TRYFINALLY的使用373TRYEXCEPT的使用374TRYEXCEPTELSE的使用38类类型381命名和格式382域3821命名/格式3822可视化383方法3831命名/格式3832使用静态的方法3833使用虚拟/动态的方法3834使用抽象的方法3835属性存取方法384属性3841命名/格式3842使用存取的方法四、文件41工程文件411命名42窗体文件421命名43数据模板文件431命名44远端数据模板文件441命名45UNIT文件451通用UNIT结构4511UNIT的名字4512USES子句4513INTERFACE部分4514IMPLEMENTATION部分4515INITIALIZATION部分4516FINALIZATION部分452窗体单元4521命名453数据模板单元4531命名454一般目的单元4541命名455构件单元4551命名46文件头五、窗体和数据模板51窗体511窗体类型命名标准512窗体实例命名标准513自动创建窗体514模式窗体实例化函数52数据模板521数据模板命名标准522数据模板实例命名标准六、包61使用运行包和设计包的比较62文件命名标准七、构件71用户自定义构件72构件单元73使用注册单元74构件实例命名约定75构件的前缀76STANDARD页77ADDITIONAL页78WIN32页79SYSTEM页710INTERNET页711DATAACCESS页712DATACONTROLS页713DECISIONCUBE页714QREPORT页715DIALOGS页716WIN31页717SAMPLES页718ACTIVEX页719MIDAS页一、序言本文档详述了在DELPHI4开发者指南下进行编程的代码编写标准。在通常情况下,本文档遵循“取消”式格式的指引方针,该方针由BORLAND国际通过一些例外来使用。在DELPHI4开发者指南中包含本文档的目的在于阐述一种方法,通过该方法,开发小组可以在他们所编写的代码中保持一贯的风格。这样做的目的是使在开发小组中的每一个程序员都可以明白其他程序员的代码。这有助于提高代码编写的可读性和使用的一贯性。本文档并不意味着包含了所有存在于代码中的标准。但是,它的内容已足够帮你起个好头。你可以自由的增加修改这些标准来满足你的需要。我们不赞成你偏离这些由BORLAND开发人员所使用的标准太远。我们推荐这么做是因为一旦有新的程序员加入到你的开发小组中,而他们最喜欢和最熟悉的是BORLAND的标准。象大多数代码标准文档,本文档也会根据需要进行改动。因此,你可以到WWWXAPWARECOM/DDG中找到最新的更新版本。本文档不包括用户接口标准。本文档是独立的但也是同样重要的。已经有足够的第三方书籍和MICROSOFT文档包括了另外一些指导方针,而我们决定并不复制这些信息,但我们会指引你到MICROSOFTDEVELOPERSNETWORK和一些资源,在那儿可以找到你所需的信息。二、通用源代码格式规则21缩格缩格是指在每一级有两个空格。不要在源代码中保留TAB字符,这是因为TAB字符会随着不同用户的不同设置和不同的资源管理工具(打印、文档、版本控制等)而代表不同的宽度。你可以通过关闭ENVIRONMENT选项对话框中EDITOR页上的“USETABCHARACTER”和“OPTIMALFILL”检查框(通过TOOLS|ENVIRONMENT)来禁止保存TAB字符。22页边空格页边空格会被设置成80字符宽。通常,源码不会超出这个边界,但这个方针会有一些弹性。不管是否有可能,那些超出到另一行的语句会在一个逗号或其他操作符之后与前面的语句相连。当一个语句被打断相连时,它应比原来的那一行语句缩进两个字符。23BEGINEND配对BEGIN子句应写在独立的一行。例如,下面第一行是错误的写法而第二行是正确的。FORI0TO10DOBEGIN/错误,BEGIN同FOR在同一行FORI0TO10DO/正确,BEGIN出现在独立的一行BEGIN这个规则的例外是当BEGIN子句的出现是作为一个ELSE子句的一部分参考例子IFSOMESTATEMENTTHENBEGINENDELSEBEGINSOMEOTHERSTATEMENTENDEND语句永远出现在独立的一行。当BEGIN语句不是一个ELSE子句的一部分时,相应的END语句永远缩进到与BEGIN部分相对应的位置。OBJECTPASCAL31括号永远不要在括号与括号之间的字符中间留下空格。下面的例子示范了错误的与正确地使用括号中的空格CALLPROCAPARAMETER/错误CALLPROCAPARAMETER/正确永远不要在一个语句中使用不必要的括号。括号只应在源代码中需要的地方使用。以下的例子示范了错误和正确的使用IFI42THEN/错误多余的括号IFI42ORJ42THEN/正确需要括号32保留字和关键字OBJECTPASCAL保留字和关键字永远是全部小写。33过程和函数(例程)331命名/格式化例程的名字永远应该以大写的字母开头并且中间错落分明以便于可读性。下面是一个不正确格式的过程名称PROCEDURETHISISAPOORLYFORMATTEDROUTINENAME下面是一个合适的大小写例程名称的例子PROCEDURETHISISMUCHMOREREADABLEROUTINENAME例程的名称应该同它的内容相符。一个会导致某个行为的例程应以动词开头。例如PROCEDUREFORMATHARDDRIVE一个用于设置输入参数的例程应以单词SET作为前缀,例如PROCEDURESETUSERNAME一个用来接收某个值的例程应以单词GET作为前缀,例如PROCEDUREGETUSERNAMESTRING332形式参数3321格式化如果有的话,相同类型的形参应合并在一个语句中PROCEDUREFOOPARAM1,PARAM2,PARAM3INTEGERPARAM4STRING3322命名所有形参的名字应是十分符合它们所代表的意义,特别是应该以传送到例程中的标志符的名称为基础。一个好的参数名称应以字符A为前缀例如PROCEDURESOMEPROCAUSERNAMESTRINGAUSERAGEINTEGER“A”前缀按约定表示该参数的名称是与类类型中的一个属性或域的名称相对应的。3323参数的排序下面的形参的顺序重点说明了注册者调用约定调用的好处。最常用的参数应放在第一位,其它的参数应按从左到右的顺序排列。输入参数列表应放在输出参数列表的左边。将通用的参数放在特殊参数的左边,例如PROCEDURESOMEPROCAPLANET,ACONTINENT,ACOUNTRY,ASTATE,ACITY排序有可能有些例外,比如事件的处理。类型为TOBJECT的SENDER参数经常放在第一位。3324常量参数当一个参数为记录型、数组类型、SHORTSTRING、或接口类型并且在例程中不被改变时,这些参数应做上常量标记。这样做会让编译器更加有效率的产生有关这些不改变的参数的代码。而例程中另外一些非变参数也可常量来传送。尽管这样做没有产生任何效果和提高效率,这将会给调用例程的使用者提供更多的信息。3325名称的冲突当使用拥有两个名称相同的例程的两个单元时,如果你调用该例程时,在USES子句中排在后面的单元中的例程将会被调用。为了解决这种“在USES子句上的模糊”冲突,要在调用该例程时写上相关的单元的前缀,例如SYSUTILEFINDCLOSESR或WINDOWSFINDCLOSEHANDLE34变量341变量的命名和格式变量的命名应以使用它们的目的相符循环控制变量应采用一个单独的字符作为名字,比如I,J,或K,也可以采用更加有意义的名字,比如USERINDEX。逻辑变量的名字应能充分表达准确的真或假的意思。342局部变量一个过程中的局部变量应遵循所有其它变量的使用和命名约定。临时变量的取名应合理。如果必须的话,在一进入例程就应初始化局部变量。局部的ANSISTRING变量会自动初始化为一个空的字符串。局部接口和派分接口类型变量将会自动初始化为NIL,并且局部变数和OLE变数类型变量会自动初始化为UNASSIGNED343全局变量的使用使用全局变量是不推荐的。但是,在某些时候还是必须使用,而且它们也只应在必须使用的时候才使用。在这种时候,你应努力只在一段上下文范围内使用全局变量。例如,一个全局变量只应在一个单元的IMPLEMNTATION部分内是全局的。如果打算在多个单元类使用全局数据,你应将它们移到一个公共的单元中然后被其它所有单元使用。全局变量可以在VAR子句中直接初始化为一个值。记住,所有的全局数据会自动初始化为0,因此不要将全局变量初始化为一个“空”值比如0、NIL、UNASSIGNED、等等。这样做的一个理由是因为零初始化的全局数据在EXE文件中不会占据任何空间。零初始化数据被存储在一个虚拟的数据段,它在应用程序启动后被分配在一段内存中。非零初始化的全局数据在硬盘的EXE文件占用空间。35类型351大写约定如果类型的名字是保留字,那么它应全部小写。WIN32API类型通常全部大写,并且你必须遵循在WINDOWSPAS或其他API单元中的详细类型名称的约定。对于其他变量名字,地一个字母应为大写,而其他字母应错落有致。下面是一些例子VARMYSTRINGSTRING/保留字WINDOWHANDLEHWND/WIN32API类型IINTEGER/在SYSTEM单元中引进的类型标识符3511浮点指针类型不推荐使用REAL类型,因为它的存在只是为了向前兼容早期的PASCAL代码。在通常情况下用DOUBLE来实现浮点指针的需要。并且,DOUBLE对处理器和总线而言是做了最优化处理的,它也是IEEE中定义的标准数据格式。只有当需要的范围超出DOUBLE所定义的范围时才使用EXTENDED。EXTENDED是INTEL定义的类型且在JAVA中不支持。只有当浮点指针变量的实际字节大小有其意义时才使用SINGLE。(比如当使用另一种语言的DLLS时)。3512枚举类型枚举类型的名字需符合使用该类型的目的。该类型的名字需以字符T为前缀,以表明这是一个类型。枚举类型中的标识符列表必须包含两个或三个字符的前缀来对应于该枚举类型的名字例如TSONGTYPESTROCK,STCLASSICAL,STCOUNTRY,STALTERNATIVE,STHEAVYMETAL,STRB一个枚举类型的实例的名字应与不要前缀的枚举类型(SONGTYPE)相同,除非有更好的原因来赋予该变量更特殊的名字,比如FAVORITESONGTYPE1,FAVORITESONGTYPE2等等。3513变数和OLE变数类型通常不建议使用变数和OLE变数类型。但在只有运行时刻才能知道数据类型的程序中必须使用该类型,这种情形多出现在COM和数据库开发中。OLE变数使用在以COM为基础的编程中例如自动化和ACTIVEX控制,而变数使用在非COM的编程中,这是因为变数可以十分有效地存储本地DELPHI字符串(同一个字符串变量一样),但OLE变数会将所有的字符串转换为OLE字符串(WIDECHAR字符串)并且并不实例运算它们永远拷贝。352结构类型3521数组类型数组类型的名字需符合它们使用的目的。该类型的名字必须加以前缀T。如果须声明该数组类型的指针,那么该指针需加以前缀P而且应立即声明在该数组声明的前面。例如TYPEPCYCLEARRAYTCYCLEARRAYTCYCLEARRAYARRAY1100OFINTEGER在实际应用中,数组的变量实例的名称应是其类型的名字去掉前缀T。3522记录类型记录类型的名字应符合使用它们的目的。其类型的声明应加以前缀T。如果要声明该记录类型的指针,就应加以前缀P并且应紧靠在类型声明的前面声明。例如TYPEPEMPLOYEETEMPLOYEETEMPLOYEERECORDEMPLOYEENAMESTRINGEMPLOYEERATEDOUBLEEND36语句361IF语句在IF/THEN/ELSE语句中最常发生的行为应放在THEN子句中,而其它发生可能性较小的行为应放在ELSE子句中。尽量避免使用嵌套的IF语句,在这种情形下应用多个IF语句来判断各种可能。不要使用IF嵌套超过五级深度。应使代码编写得更加清晰、明了。不要在IF语句中使用不必要的圆括号。如果在IF语句中有多个条件需测试,这些条件应按计算强度由少到多的顺序从左到右排列。这样做能使编译器在编译代码时获得布尔估算逻辑的捷径,从而使你的代码获得最佳的优化。举例来说,如果条件1快过条件2,而条件2快过条件3,那么在IF语句中的排列应是IF条件1AND条件2AND条件3THEN362CASE语句3621一般性话题在一个CASE语句中的各个独立的单元应以数字或字母顺序排列。每一个CASE单元的动作行为应保持简单而不应该超过四到五行代码。如果所要执行的动作过于复杂应采用独立的过程或函数。CASE语句中的ELSE子句只有当需要缺省行为或处理错误时才使用。3622格式CASE语句应遵循其它结构的缩格和命名约定。363WHILE语句在一个WHILE语句中不建议使用EXIT过程来跳出循环,尽量仅使用循环条件来跳出循环。在一个WHILE循环中所用的初始化代码应紧靠在进入WHILE循环前面出现而不要被其它不相关的语句隔开。任何结束后的处理应在循环之后立即进行。364FOR语句FOR语句只有当循环次数已知的情况下才能取代WHILE语句使用。365REPEAT语句REPEAT语句的使用同WHILE语句一样,并且遵循同样的通用方针。366WITH语句3661一般话题WITH语句应节省使用,并且带有大量的警告。避免过度使用WITH语句并且在WITH语句中小心使用多个对象、记录等等。例如WITHRECORD1,RECORD2DO这些事情会使程序员感到困惑并难以发现问题所在。3662格式WITH语句遵循本文档所说明的命名约定和缩格的格式规则。37结构异常处理371一般话题异常的处理大量地使用在错误纠正和资源保护方面。这就是说一旦资源被分配,一个TRYFINALLY必需加以使用来保证该资源被正确的释放。这种异常的保护也是指在一个单元的INITIALIZITION/FINALIZATION或一个对象的CONSTRUCTOR/DESTRUCTOR中进行资源的分配和释放。372TRYFINALLY的使用任何情形下,每一次的分配都应跟随一个TRYFINALLY。举例来说,下面的代码会造成可能的错误SOMECLASS1TSOMECLASSCREATESOMECLASS2TSOMECLASSCREATETRYDOSOMECODEFINALLYSOMECLASS1FREESOMECLASS2FREEEND一个更安全更合适的分配过程应是SOMECLASS1TSOMECLASSCREATETRYSOMECLASS2TSOMECLASSCREATETRYDOSOMECODEFINALLYSOMECLASS2FREEENDFINALLYSOMECLASS1FREEEND373TRYEXCEPT的使用只有当在异常被触发而你想执行一些任务时才使用TRYEXCEPT。通常,你没有必要为了只是简单地在屏幕上显示一个错误信息而使用TRYEXCEPT语句,因为这会被APPLICATION对象自动执行。如果你想在EXCEPT子句中执行完一些任务之后调用缺省的异常处理,使用RAISE来重新触发异常到下一个句柄。374TRYEXCEPTELSE的使用TRYEXCEPT中的ELSE子句不建议使用,因为它会打断所有的异常包括那些你没有准备的异常。38类类型381命名和格式类类型的名称应符合使用它们的目的。类型名字应加以前缀T以表明这是一个类型的定义例如TYPETCUSTOMERCLASSTOBJECT类型的实例通常是没有前缀T的类型的名字例如VARCUSTOMERTCUSTOMER注意查阅“构件类型的命名标准”来获得更多有关构件命名的信息。382域3821命名/格式类的域名遵循与变量标识符同样的约定除了它们应以F为前缀,来表明这是一个域的名称。3822可视化所有的域都必需是私有的。想在类的范围之外存取域得通过属性来使用。383方法3831命名/格式方法的命名应遵循本文档中有关过程和函数的约定叙述。3832使用静态的方法如果使用一个静态的方法,那么该方法就不能被该类的后代类所继承。3833使用虚拟/动态的方法如果你打算该类的方法能被后代的类所继承就得使用虚拟的方法。只有在该方法有多个继承时(直接的或间接的)才使用动态的方法。例如,一个类类型包含一个可继承的方法,而100个后代类要继承这种方法,那么这个方法就会动态地产生为100个后代类使用的内存。3834使用抽象的方法如果在一个类中使用抽象的方法,该类就不能被创建。只有在那些永远不会被创建的类中使用抽象的方法。3835属性存取方法所有存取类的方法都只能出现在类的PRIVATE或PROTECTED部分。属性存取方法的命名应遵循过程和函数的约定规则。读取存取方法(方法读取器)必需以单词GET为前缀。写入存取方法(方法写入器)必需以单词SET为前缀。方法写入器的参数的名字应为VALUE,并且它的类型应是它所操作的属性的类型。例如TSOMECLASSCLASSTOBJECTPRIVATEFSOMEFIELDINTEGERPROTECTEDFUNCTIONGETSOMEFIELDINTEGERPROCEDURESETSOMEFIELDVALUEINTEGERPUBLICPROPERTYSOMEFIELDINTEGERREADGETSOMEFIELDWRITESETSOMEFIELDEND384属性3841命名/格式属性如果是表示为一个私有域的存取器的话,那么它的名字应是它们所操作的域的名字除去解释符F。属性的名字应是名词,不是动词。属性表示的是数据,而方法表示的是行为。数组类型的名称应为复数。一般情况下属性的名称应为单数。3842使用存取的方法尽管没有要求,但还是建议尽量少地为一个表示私有域的属性而使用写入存取方法。四、文件41工程文件411命名工程文件应取个描述性的名字。例如,DELPHI4开发者指南错误管理器的工程名字是DDGBUGSDPR。一个有关系统信息的程序的名字就应象SYSINFODPR。42窗体文件421命名一个窗体文件的取名应可以描述使用该窗体的目的,并加以后缀FRM。例如,一个“关于”的窗体的文件名应是ABOUTFRMDPR。主窗体的文件名应是MAINFRMDPR。43数据模板文件431命名数据模板的取名应能表示使用该数据模板的目的,它的名称应加以两个字符的后缀DM。例如,自定义数据模板的文件名字应为CUSTOMERSDMDFM。44远端数据模板文件441命名远端数据模板的取名应能表示使用该远端数据模板的目的,它的名称应加以三个字符的后缀RDM。例如,自定义远端数据模板的文件名字应为CUSTOMERSRDMDFM。45UNIT文件451通用UNIT结构4511UNIT的名字UNIT文件应取一个可描述性的名字。例如,包含应用程序主窗体的单元应叫做MAINFRMPAS。4512USES子句在INTERFACE部分的USES子句应包含在INTERFACE部分中的代码所需要的单元。去掉那些DELPHI可以自动加入到程序中的单元。在IMPLEMENTATION部分的USES子句应只包含在IMPLEMENTATION部分中的代码所需要的单元的名字。去掉不必要的单元。4513INTERFACE部分INTERFACE部分应包含只那些其它单元所需要存取类型的定义、变量、过程/函数的预定义等等。否则,就应放在IMPLEMENTATION部分定义。4514IMPLEMENTATION部分IMPLEMENTATION部分应包含那些只在本单元中私用的类型定义、变量、过程/函数定义等等。4515INITIALIZATION部分不要在INITIALIZATION部分放入耗时长的代码,这将使程序的第一个界面出现得比较缓慢。4516FINALIZATION部分在这里要保证释放你在INITIALIZATION部分所分配的任何资源。452窗体单元4521命名一个窗体的单元文件应拥有与它所对应的窗体文件同样的名称。例如,“关于”窗体的单元名称应为ABOUTFRMPAS,而主窗体的单元名称应为MAINFRMPAS。453数据模板单元4531命名一个数据模板的单元文件应拥有与它所对应的数据模板文件同样的名称。例如,一个自定义数据模板单元的名称应为CUSTOMERSDMPAS。454一般目的单元4541命名一般目的单元的取名应符合使用该单元的目的。例如,一个实用程序单元取名为BUGUTILITIESPAS。一个包含全局变量的单元取名为CUSTOMERGLOBALSPAS。注意,该单元的名字不能与它的工程中所使用的所有包中的单元的名字相同。不赞成使用一般的或通用的单元名字。455构件单元4551命名构件单元应放在独立的目录,以将它们同定义构件组或构件集合的单元区分开来。它们要永远同工程在不同的目录。单元名字应同它们的内容相符。注意查阅“用户定义的构件”部分来获得更多有关构件命名标准的信息。46文件头建议在所有源文件、工程文件、单元等等中使用信息化文件头。一个良好的文件头应包含以下信息版权著作的年、月、日五、窗体和数据模板51窗体511窗体类型命名标准窗体类型的取名应能表达使用该窗体的目的。类型定义应加以前缀TFRM。前缀后面跟随着描述性的名字。例如,一个“关于”的窗体的类型的名字应为TFRMABOUTCLASSTFORM主窗体的定义为TFRMMAINCLASSTFORM一个用户接入窗体的名字应象TFRMCUSTOMERENTRYCLASSTFORM512窗体实例命名标准窗体实例应是没有带前缀T的相应类的名字。例如,对应于前面窗体类型而言,其实例的名字应为类型名称实例名称TFRMABOUTFRMABOUTTFRMMAINFRMMAINTFRMCUSTOMERENTRYFRMCUSTOMERENTRY513自动创建窗体只有主窗体可以是自动创建的除非有其它更好的理由不这样做。所有其它的窗体必需从工程选项对话框中的自动创建列表中移走。查阅以下部分来获得更多的信息。514模式窗体实例化函数所有的窗体单元都应包含一个窗体实例化函数,该函数用来创建、设置、模式地显示窗体,并释放窗体。该函数应返回窗体的模式结果。该函数要传递的参数应遵循本文档指定的“参数传递”标准。通过这种方式封装的函数性有助于代码的再利用和维护。该窗体的变量要从单元中移走,并再窗体实例的函数中进行本地式地定义。注意,这就意味着该窗体必需从工程/选项对话框中的自动创建列表中剔除。参考本文档后面的“自动创建窗体”。例如,下面的单元展示了再GETUSERDATA窗体中的一个函数。UNITUSERDATAFRMINTERFACEUSESWINDOWS,MESSAGES,SYSUTILS,CLASSES,GRAPHICS,CONTROLS,FORMS,DIALOGS,STDCTRLSTYPETFRMUSERDATACLASSTFORMEDTUSERNAMETEDITEDTUSERIDTEDITPRIVATEPRIVATEDECLARATIONSPUBLICPUBLICDECLARATIONSENDFUNCTIONGETUSERDATAVARAUSERNAMESTRINGVARAUSERIDINTEGERWORDIMPLEMENTATIONRDFMFUNCTIONGETUSERDATAVARAUSERNAMESTRINGVARAUSERIDINTEGERWORDVARFRMUSERDATATFRMUSERDATABEGINFRMUSERDATATFRMUSERDATACREATEAPPLICATIONTRYFRMUSERDATACAPTIONGETTINGUSERDATARESULTFRMUSERDATASHOWMODALIFRESULTMROKTHENBEGINAUSERNAMEFRMUSERDATAEDTUSERNAMETEXTAUSERIDSTRTOINTFRMUSERDATAEDTUSERIDTEXTENDFINALLYFRMUSERDATAFREEENDENDEND52数据模板521数据模板命名标准数据模板的取名要符合使用该数据模板的目的。类型的定义应加以前缀T,后面紧接着描述性的名字,最后要加以后缀单词“DATAMODULE”。例如,一个自定义的数据模板有时候应该象TCUSTOMERDATAMODULECLASSTDATAMODULE一个命令式的数据模板的名字应象TORDERSDATAMODULECLASSTDATAMODULE522数据模板实例命名标准数据模板实例的名称应是对应不带前缀T的类型的名称。例如,对于前面的窗体类型而言,其实例的名称应为类型名称实例名称TCUSTOMERDATAMODULECUSTOMERDATAMODULETORDERSDATAMODULEORDERSDATAMODULE六、包61使用运行包和设计包的比较运行时刻的包应只包含其它构件包所要求的单元或构件。另外,包含属性/构件编辑器和其它只为设计的代码应放入到设计时刻包中。注册单元应放在设计包中。62文件命名标准包的名称应依照下面的例子“IIILIBVVPKG”设计时刻包“IIISTDVVPKG”运行时刻包字符“III”表示一个3字符标识前缀。这个前缀用来表明公司、个人或其它有标识意义的实体。字符“VV”表示为该包想要对应DELPHI某个版本的包的版本号。注意,包的名字中包含“LIB”或“STD”的意思是表明这是一个设计时刻包还是一个运行时刻包。如果既是设计时刻包又是运行时刻包,该文件的命名是同上面一样的,例如,为DELPHI4开发者指南做的包的名称应为DDGLIB40PKG设计时刻包DDGSTD40PKG运行时刻包七、构件71用户自定义构件在标准构件中命名出来的构件的名称同在“类类型”部分定义中的一样定义成一个类类型,不同的是它们有一个3字符的指示前缀,这个前缀可以表示公司、个人或其它实体。例如,一个为DELPHI4开发者指南编写的时钟构件的名称定义为TDDGCLOCKCLASSTCOMPONENT注意,那三个前缀字符是小写的。72构件单元构件单元应只包含一个主要的构件,一个主要的构件是指出现在构件栏中的构件。主要构件的辅助构件/对象应放入到同一个单元中。73使用注册单元构件的注册过程应从构件本身的单元中剔除,并放入到一个独立的单元中。这个注册单元可以用来注册任何构件、属性编辑器、构件编辑器、专家器等。构件的注册只应在设计时刻包中进行,注册单元应包含在设计时刻包中而不应放在运行时刻包中。推荐使用的注册单元的名称是XXXREGPAS上面的3个前缀字符“XXX”用来表示一个公司、个人或任何其它的实体。例如,在DELPHI4开发者指南中的注册单元的名称应为DDGREGPAS。74构件实例命名约定所有的构件都应取个描述性的名称。由DELPHI创建的缺省名的构件不会被遗弃。在设计构件类型时应设计一个小写的前缀。使用前缀而不使用后缀的原因是在搜寻时,在对象检查器和代码探索器中搜寻构件的名字比搜寻构件的类型更容易实现。75构件的前缀以下构件的前缀可以用来设计DELPHI4中的标准构件。请在此列表中加入第三方构件的前缀。76STANDARD页前缀构件MMTMAINMENUPMTPOPUPMENUMMITMAINMENUITEMPMITPOPUPMENUITEM前缀构件LBLTLABELEDTTEDITMEMTMEMOBTNTBUTTONCBTCHECKBOXRBTRADIOBOXLBTLISTBOXCBBTCOMBOBOXSCBTSCROLLBARGBTGROUPBOXRGTRADIOGROUPPNLTPANELCMDLTCOMMANDLIST77ADDITIONAL页BBTNTBITBTNSBTNTSPEEDBUTTONMEDTTMASKEDITSGTSTRINGGRIDDGTDRAWGRIDIMGTIMAGESHPTSHAPEBVLTBEVELSBXTSCROLLBOXCLBTCHECKLISTBOXSPLTSPLITTERSTXTSTATICTEXTCHTTCHART78WIN32页TBCTTABCONTROLPGCTPAGECONTROLIMGLTIMAGELISTREDTTRICHEDITTHRTTRACKBARPRBTPROGRESSBARUDTUPDOWNHKTHOTKEYANITANIMATEDTPTDATETIMEPICKERTVTTREEVIEWLVTLISTVIEWHDRTHEADERCONTROL前缀构件STBTSTATUSBARTLBTTOOLBARCLBTCOOLBAR79SYSTEM页TMTTIMERPBTPAINTBOXMPTMEDIAPLAYEROLECTOLECONTAINERDDCCTDDECLIENTITEMDDCITDDECLIENTITEMDDSCTDDESERVERCONVDDSITDDESERVERITEM710INTERNET页CSKTCLIENTSOCKETSSKTSERVERSOCKETWBDTWEBDISPATCHERPPTPAGEPRODUCERTPTQUERYTABLEPRODUCERDSTPTDATASETTABLEPRODUCERNMDTTNMDAYTIMENECTNMECHONFTNMFINGERNFTPTNMFTPNHTTPTNMHTTPNMSGTNMMSGNMSGTNMMSGSERVNNTPTNMNNTPNPOPTNMPOP3NUUPTNMUUPROCESSORSMTPTNMSMTPNSTTNMSTRMNSTSTNMSTRMSERVNTMTNMTIMENUDPTNMUDPPSKTPOWERSOCKNGSTNMGENERALSERVERHTMLTHTMLURLTNMURLSMLTSIMPLEMAIL711DATAACCESS页前缀构件DSTDATASOURCETBLTTABLEQRYTQUERYSPTSTOREDPROCDBTDATABASESSNTSESSIONBMTBATCHMOVEUSQLTUPDATESQL712DATACONTROLS页DBGTDBGRIDDBNTDBNAVIGATORDBTTDBTEXTDBETDBEDITDBMTDBMEMODBITDBIMAGEDBLBTDBLISTBOXDBCBTDBCOMBOBOXDBCHTDBCHECKBOXDBRGTDBRADIOGROUPDBLLTDBLOOKUPLISTBOXDBLCTDBLOOKUPCOMBOBOXDBRETDBRICHEDITDBCGTDBCTRLGRIDDBCHTDBCHART713DECISIONCUBE页DCBTDECISIONCUBEDCQTDECISIONQUERYDCSTDECISIONSOURCEDCPTDECISIONPIVOTDCGTDECISIONGRIDDCGRTDECISIONGRAPH714QREPORT页QRTQUICKREPORTQRSDTQRSUBDETAILQRBTQRBANDQRCBTQRCHILDBANDQRGTQRGROUPQRLTQRLABEL前缀构件QRTTQRTEXTQRETQREXPRQRSTQRSYSDATAQRMTQRMEMOQRRTTQRRICHTEXTQRDRTQRDBRICHTEXTQRSHTQRSHAPEQRITQRIMAGEQRDITQRDBMIMAGEQRCRTQRCOMPOSITEREPORTQRPTQRPREVIEWQRCHTQRCHART715DIALOGS页对话框构件是由构件封装的真正的窗体,因此,它们应遵循窗体的命名约定。类型已由构件的名称定义。它的实例的名称是DELPHI自动生成的类型实例名字去掉数字后缀。举例如下类型实例名字TOPENDIALOGOPENDIALOGTSAVEDIALOGSAVEDIALOGTOPENPICTUREDIALOGOPENPICTUREDIALOGTSAVEPICTUREDIALOGSAVEPICTUREDIALOGTFONTDIALOGFONTDIALOGTCOLORDIALOGCOLORDIALOGTPRINTSETUPDIALOGPRINTSETUPDIALOGTFINDDIALOGFINDDIALOGTREPLACEDIALOGREPLACEDIALOG716WIN31页DBLLTDBLOOKUPLISTDBLCTDBLOOKUPCOMBOTSTTABSETOLTOUTLINETNBTTABBEDNOTEBOOKNBTNOTEBOOKHDRTHEADERFLBTFILELISTBOXDLBTDIRECTORYLISTBOXDCBTDRIVECOMBOBOXFCBTFLITERCOMBOBOX717SAMPLES页GGTGAUGE前缀构件CGTCOLORGRIDSPBTSPINEDITSPETSPINEDITDOLTDIRECTORYOUTLINECALTCALENDARIBEATIBEVENTALERTER718ACTIVEX页CFXTCHARTFXVSPTVSSPELLF1BTF1BOOKVTCTVTCHARTGRPTGRAPH719MIDAS页PRVTPROVIDERCDSTCLIENTDATASETQCDSTQUERYCLIENTDATASETDCOMTDCOMCONNECTIONOLEETOLEENTERPRISECONNECTIONSCKTSOCKETCONNECTIONRMSTREMOTESERVERMIDTMIDASCONNECTION8注释81序言性注释序言性注释加在单元、工程的开头处,非常重要,主要内容如下程序名称作者创建日期最近一次修改日期功能概述输入数据或入口参数输出数据或出口参数主要处理流程和主要算法描述主要的数据结构利用的子程序相关的全程变量、局部变量的含义调用时注意的问题82程序块注释数据结构算法或处理流程注意问题83指令级注释语句功能实现技巧变量含义以上三种注释的重要性依次递降,侧重与序言性注释和程序块注释。9注意事项及建议91代码执行效率在编写代码时(特别是数据库方面的代码时),要考虑执行效率。尽量避免使用TABLE,DBGRID等与数据库联系紧密的控件。避免使用RECORDCOUNT之类影响执行效率的语句。在对数据库进行操作时,尽量使用QUERY控件直接用SQL语句进行操作。减少全局变量的定义和使用。92风格的统一在设计界面时,要保持风格的统一性,使相类似界面的控件分布、窗体大小、字体大小等方面要一致。提示信息时统一使用MESSAGEBOX()。提示信息和按钮等要尽量遵循WINDOWS标准。提示信息要明确、友好。93函数和过程若超过两处的代码要使用类似的功能模块,要将该功能模块设计为函数或过程。该函数或过程的代码至少要有一定的代码数量,否则没有必要并且会增加阅读代码的难度。在程序中自定义的函数或过程不宜太多太大。94异常处理在可能出现异常的地方要编写代码(TRYEXCEPT)处理出现的异常,这样会避免意想不到的错误。还可以对异常做进一步处理。95输入的控制确定比较恰当的TABORDER顺序,在不用鼠标的情况下也可以完成操作。在输入时,要控制输入的合法性(如数字),在输入前就要加以控制以避免不合法的数据。96支持多数据库因为软件要适用多数据库,因此在代码编写时要注意尽量使用标准SQL语句,尽量避免使用数据库提供的函数。必要时按数据库类型分情况处理。请参看附录多数据库支持分析。附录多数据库支持分析一、目的与任务1、形成一套支持多数据库的解决方案,在各细小的问题上都要力求清楚透彻,使程序员在写程序时有据可查。2、提供访问各数据库的底层公用程序。3、负责程序员开发过程中的数据库问题咨询。4、检查软件对多数据库的支持程度和效果,监督程序员支持多数库的开发过程。二、支持的数据库1、MSSQLSERVER652、ORACLE7X3、DB2504、SYBASESQLSERVER1155、SYBASESQLANYWHERE55三、对各数据库的详细分析以下的分析内容,是以SYBASE数据库作为标准进行比较的。因为我们的程序员对SYBASE的各方面都很熟悉了,其他数据库在各方面同SYBASE存在有哪些异同点,对于不同的方面如何变通实现等,是以下要主要分析解决的。1、标准SQL语法列表(SQL92)2、各数据库SQL语句子句之间的差别,如何实现相互替代或以标准语句实现。SELECTSYBASESELECTALL|DISTINCTSELECT_LISTINTODATABASEOWNERTABLE_NAMEFROMDATABASEOWNERTABLE_NAME|VIEW_NAMEHOLDLICKWHERESEARCH_CONDITIONSGROUPBYALLAGGREGATES_FREE_EXPRESSIONHAVINGSEARCH_CONDITIONSORDERBYDATABASEOWNERTABLE_NAME|VIEW_NAMECOLUMN_NAME|SELECT_LIST_NUMBER|EXPRESSIONASC|DESCCOMPUTEROW_AGGREGATECOLUMN_NAME,ROW_AGGREGATECOLUMN_NAMEBYCOLUMN_NAME,COLUMN_NAMEFORBROWSE其中SELECT_LIST,SEARCH_CONDITIONS,ORACLE格式SELECTALL|DISTINCTSELECT_LISTINTOVARIABLEFROMDATABASEOWNERTABLE_NAME|VIEW_NAMEWHERESEARCH_CONDITIONSCONNECTBYCONDITIONGROUPBYEXPRESSIONHAVINGSEARCH_CONDITIONSUNION|INTERSECT|MINUSSELECTORDERBYEXPRESSION|POSITIONASC|DESCFORUPDATEOFTABLE|VIEWCOLUMNNOWAIT其中SELECT_LIST,SEARCH_CONDITIONS,MSSQLSERVER格式同SYBASE格式DB2格式SELECTALL|DISTINCTSELECT_LISTFROMOWNERTABLE_NAME|VIEW_NAMEWHERESEARCH_CONDITIONSGROUPBYALLAGGREGATES_FREE_EXPRESSIONHAVINGSEARCH_CONDITIONSORDERBYOWNERTABLE_NAME|VIEW_NAMECOLUMN_NAME|EXPRESSIONASC|DESC注在SQL中不能用数据库名,即一条SQL语名只能从一个数据库中取数。在DB2中不能使用“F_1F_2F_3”只能用“F_2F_3ASF_1”,所有规定在SELECT语句中只用格式“F_2F_3ASF_1”(尤其是在数据窗口中的计算列)。INSERTINSERTINTO列1,列2VALUES(值1,值2)INSERTINTO列1,列2子查询INSERT在SYBASE、ORACLE、MSSQLSERVER、DB2中是相同的。UPDATEUPDATE用户名。表名。列名。SET列名表达式,列名表达式。WHERE条件UPDATE用户名。表名。列名。SET(列名,列名。)(查询)。WHERE条件UPDATE在SYBASE、ORACLE、MSSQLSERVER中是相同的;UPDATE在DB2中没有FROM子句,因此在UPDATE中只能通过子查询来实现。DELETEDELETEFROM用户名。表名。别名WHERE条件DELETE在SYBASE、ORACLE、MSSQLSERVER中是相同的;DELETE在DB2中必须有FROM子句,因此在UPDATE中只能通过子查询来实现。3、FUNCTION之间的差别,用法,举例,如何实现相互替代或以标准函数实现。函数SYBASEMSSQLSERVERORACLEDB2系统函数COL_NAMEOBJ_ID,COL_ID有COL_LENGTH“OBJNAME”,”COLNAME”有DATALENGTHEXPRESSION有DB_ID“DB_NAME”有DB_NAMEDB_ID有HOST_ID有HOST_NAME有INDEX_COL“OBJNAME”,INDEX_ID,KEY有ISNULLEXPRESSION,VALUE有OBJECT_ID“OBJNAME”有OBJECT_NAMEOBJ_ID有SUSER_ID“LOGINNAME”有SUSER_NAMESERVER_USER_ID有USER_ID“NAME_IN_DB”有USER_NAMEUSER_ID有数学函数ABSN有有有有FLOORN有有有有POWERM,N有有有有ROUND有有有有SIGNN有有有有SQRTN有有有有CEILINGN有有自定义CEILINGN有字符串函数ASCIICHAR_EXPR有有有有LTRIMCHAR_EXPR有有函数多了一个参数,LTRIMCHAR_EXPR,SET,SET省略时,表示删除左边空格有RTRIMCHAR_EXPR有有函数多了一个参数,RTRIMCHAR_EXPR,SET,SET省略时,表示删除右边空格。有CHARN有有CHRN有DATALENGTHSTRING有有自定义DATALENGTHSTRING自定义DATALENGTHSTRINGCHARINDEXSUB,PARENT有有自定义CHARINDEXSUB,PARENT自定义CHARINDEXSUB,PARENTPATINDEX(“PATTERN”,EXPRESSION)有有自定义PATINDEXSUB,PARENT不可用通配符自定义PATINDEXSUB,PARENT不可用通配符REPLICATECHAR_EXPR,INT

温馨提示

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

评论

0/150

提交评论