谁有delphi的开发规范,100相赠!! EMail:[email protected] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 开发步骤1)先做应用分析,直到你和用户都明白他想要你作什么,这是最重要的.2)用文档的方式记录下来3)做总体系统逻辑分析.4)做总体系统应用分析.5)划分模块,并分配人手,6)每队再做分析,并建立原型,修改原型.如果和他人的接口部分要改动,必须由三方同意商定.7)接口联合调试8)系统调试9)文档,用户说明.--以上每一步的文档都要清楚,并由各模块负责人负责.原则上编码的工作量视,如果应用模型细,就少些,反之就多些,还要看实现技术是否容易.团队精神很重要,要让所有人都觉得自己很有价值. 我觉得如果想将项目做得好,要做到一下几点,除非您特别牛:) 1 : 首先要熟悉用户的业务流程,明确需求,做好充分的可行性分析. 这一点我觉得非常重要,直接决定以后工作的进度和质量.我做得第一个项目就是没有重视这一点,需求没完全明确,到用户要求改的时候,sigh...我们几个人没日没夜的改,还是一大堆bug在里头,痛苦,往事不堪回首:). 了解用户的业务流程最为辛苦,或则编码对于我们程序员来说不是什么大问题,但了解业务流程绝对是难解决的,要有耐心,不完全搞清楚不要匆匆忙忙的进行系统设计,了解也是个渐进的过程,多点和用户交流,了解他们在现行系统上面的工作情况和工作概要时非常重要的.这一部分的工作我觉得起码要1-2周.如果项目很大,还要更久. 可行性的分析包括了经济上的,技术上的,社会上的等等方面的因素,要了解到用户提出的要求是不是真的能够完成,经济上有问题吗?技术上是不是不可行?都要知道得清清楚楚. 2 : 上面的内容了解完了,可以进行系统的设计了,按照上面所得的资料,确定一个系统的概要.最好能用建模工具如Rose将模块划分好,再按工作量具体分工.如果系统涉及到数据库的(大多数都是这样的拉),数据库各个表的定义及优化要讨论清楚,争取一步到位,不要等做着做着发现表的定义有问题,要改,sigh...可能工作量就大了 3 : 要具体编码了,严格控制进度是应该的,结合测试来完成,写代码的时候尽量能加上注释.我个人认为测试时非常重要的,偏偏中国不重视这个,很多公司都没有专门的测试人员,没办法,只要交叉测试了. 4 : 文档要齐全!特别是对大型的系统来说,这个尤为重要.文档包括一开始的需求报告,可行性报告,系统设计的总结,模块划分的纪录,在各个阶段测试结果的纪录,用户手册,软件说明书等等,甚至程序员在编码的时候写的注释,可以在整个软件开发的过程中起到知道的作用. 我的看法就那么多,不知道对不对,如有不对,请大家指出//thx:) ************说点我认为实用的罢做一个项目,始终是人在做,书上的东西是死的,而人是活的,有了好的方法,不一定会有好的效果.我认为做一个项目,有以下几点注意的,当然,做一个项目不会只有这些:1.前其人员不用太多,找几个(具体几个,看业务大小和这几个人的人员素质而定,其实有时,也与客户的要求有关)对业务熟悉的人员(当然,也必须是熟悉开发工具的)进行前其的调研,设计文档,此时,尚未进入编码阶段呢2第二阶段,此时不应该是大量人员投入的阶段,而应该是找几个(也许是一两个)比较有实力的人,做出系统的框架(如果有Delphi的话,就应该将系统总控模块做好,同时做好各模块的接口部分)与此同时,再找一两个人做一些基础数据的维护界面(例如人员信息维护等)3第三阶段,此时,投入大量人员,(此时,应该是整个项目中时间最短的部分)分模块开发,记住,开发必须是在前面定义好的接口之下,同时必须在主框架中调试4第四阶段,最好找开始做调研的人中的一两个负责测试的主要工作(当然,测试不可能只用一两个人,但这一两个人是总体把握什么是对的即符合用户要求的)既然测试,总会有些问题的,所以,此时,也应该留几个开发人员跟着,(这几个开发人员的水平可以平一一些,锻炼队伍嘛),有问题及时修改,没有问题,一起做测试其实在开发过程中,总会有一些不太协调的地方,所以,一个项目的成败,还必须有两点特别提出的,一是这个项目的负责人必须能够调动项目组中的每一项可利用资源(包括员和其它各方面的东西)二是项目客户必须有一个说话可以算数的人当对项目挂名负责真的,这两点真的很重要.说了这么多废话,不知有没有什么用处,真的,有些算是教训吧,有些可以算是不太成熟的经验,有没有用我实在也无从知道,因为才做过一两个比较大的项目而已 1.规范简介本规范主要规定Delphi源程序在书写过程中所应遵循的规则及注意事项。编写该规范的目的是使公司软件开发人员的源代码书写习惯保持一致。这样做可以使每一个组员都可以理解其它组员的代码,以便于源代码的二次开发记忆系统的维护。2.一般格式规范2.1缩进缩进就是在当源程序的级改变时为增加可读性而露出的两个空格。缩进的规则为每一级缩进两个空格。不准许使用Tab。因为Tab会因为用户所作的设置不同而产生不同的效果。当遇到begin 或进入判断、循环、异常处理、with语句、记录类型声明、类声明等的时侯增加一级, 当遇到end或退出判断、循环、异常处理、with语句、记录类型声明、类声明等的时侯减少一级。例如:if TmpInt <> 100 thenTmpInt := 100;2.2 Begin..Endbegin语句和end语句在源程序中要独占一行,例如:for I := 0 to 10 do begin //不正确的用法end;for I := 0 to 10 do //正确的用法beginend;2.3空格在操作符及逻辑判断符号的两端添加空格,例如:I := I + 1;,a and b 等,但添加括号时不需要空格。例如:if ( a > b ) then //错误的用法If (a > b) then //正确的用法又例如:procedure Test(Param1: integer; Param3: string);3. Object Pascal语法书写格式规范3.1保留字Object Pascal 语言的保留字或关键词应全部使用小写字母。 3.2过程和函数3.2.1命名及格式过程和函数的名称应全部使用有意义的单词组成,并且所有单词的第一个字母应该使用大写字母。例如:procedure formatharddisk;//不正确的命名procedure FormatHardDisk;//正确的命名设置变量内容的过程和函数,应使用Set作为前缀,例如:procedure SetUserName;读取变量内容的过程和函数,应使用Get作为前缀,例如:function GetUserName: string;3.2.2 过程和函数的参数 3.2.2.1命名统一类型的参数写在同一句中:procedure Foo(Param1, Param2, Param3: Integer; Param4: string);3.2.2.2命名所有参数必须是有意义的;并且当参数名称和其它属性名称重了的时候,加一个前缀‘A’, 例如:procedure SomeProc(AUserName: string; AUserAge: integer);3.2.2.3命名冲突当使用的两个unit中包括一个重名的函数或过程时, 那幺当你引用这一函数或过程时,将执行在use 子句中后声明的那个unit中的函数或过程。为了避免这种‘uses-clause-dependent’需要在引用函数或过程时,写完整函数或过程的出处。例如:SysUtils.FindClose(SR);Windows.FindClose(Handle); 3.3 变量3.3.1 变量命名及格式首先所有变量必须起有意义的名字,使其它组员可以很容易读懂变量所代表的意义,变量命名可以采用同义的英文命名,可使用几个英文单词,但每一单词的首字母必须大写。例如:varWriteFormat::string;同时对于一些特定类型可采用一定的简写如下:指针类型P纪录类型Rec数组类型Arr类Class循环控制变量通常使用单一的字符如:i, j, 或 k。 另外使用一个有意义的名字例如:UserIndex ,也是准许的。3.3.2 局部变量在过程中使用局部变量遵循所有其它变量的命名规则。3.3.3 全局变量尽量不使用全局变量,如必须使用全局变量则必须加前缀‘g’,同时应在变量名称中体现变量的类型。例如:gprecUserCount: point;//名称为UserCount的全局变量,其类型为指向一结构的指针但是在模块内部可以使用全局变量。所有模块内全局变量必须用‘F’为前缀。如果几个模块之间需要进行资料交换,则需要通过声明属性的方法来实现。例如:typeTFormOverdraftReturn = class(TForm)private{ Private declarations }FuserName: string;FuserCount: Integer;Procedure SetUserName(Value: string);Function GetUserName: string;public{ Public declarations }property UserName: string read GetUserName write SetUserName;property UserCount: Integer read FuserCount write FuserCount;end; 3.4类型3.4.1 大小写协议保留字的类型名称必须全部小写。Win32 API 的类型通常全部大写,对于其它类型则首字母大写,其余字母小写,例如:varMyString: string; // reserved wordWindowHandle: HWND; // Win32 API typeI: Integer; // type identifier introduced in System unit3.4.2 浮点类型尽量不使用 Real 类型,他只是为了和旧的Pascal代码兼容,尽量使用Double 类型。Double 类型是对处理器和数据总线做过最优化的并且是IEEE定义的标准数据结构。当数值超出Double的范围时,使用Extended 。但Extended不被Jave支持。但使用其它语言编写的DLL时可能会使用Single 类型。3.4.3 枚举类型枚举类型的名字必须有意义并且类型的名字之前要加前缀‘T’。枚举类型的内容的名字必须包含枚举类型名称的简写,例如:TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);3 .4.4 数组类型数组类型的名字必须有意义并且类型的名字之前要加前缀‘T’。如果声明一个指向数组类型的指针必须在该类型的名字之前加前缀‘P’,例如:typePCycleArray = ^TCycleArray;TCycleArray = array[1..100] of integer; 3.4.5记录类型记录类型的名字必须有意义并且类型的名字之前要加前缀‘T’。如果声明一个指向数组类型的指针必须在该类型的名字之前加前缀‘P’,例如:typePEmployee = ^TEmployee;TEmployee = recordEmployeeName: stringEmployeeRate: Double;end;3.5类3.5.1 命名及格式类的名字必须有意义并且类型的名字之前要加前缀‘T’。例如:typeTCustomer = class(TObject)类实例的名字通常是去掉‘T’的类的名字。例如:varCustomer: TCustomer;3.5.2 类中的变量 3.5.2.1命名及格式类的名字必须有意义并且类型的名字之前要加前缀‘F’。所有的变量必须是四有的。如果需要从外部访问此变量则需要声明一属性3.5.3 方法3.5.3.1命名及格式同函数和过程的命名及格式。3.5.3.2 属性访问方法所有的属性访问方法必须出现在private 或 protected 中。属性访问方法的命名同函数和过程的命名另外读方法(reader method)必须使用前缀‘Get’. 写方法(writer method)必须使用前缀‘Set’。写方法的参数必须命名为‘Value’,其类型同所要写的属性相一致。例如:TSomeClass = class(TObject)privateFSomeField: Integer;protectedfunction GetSomeField: Integer;procedure SetSomeField( Value: Integer);publicproperty SomeField: Integer read GetSomeField write SetSomeField;end;3.6属性3.6.1 命名及格式同其用操作的,出去前缀‘F’的类的变量的名称相一致 。3.7文件3.7.1项目文件3.7.1.1项目目录结构程序主目录--Bin(应用程序所在路径)-Dbs(本地数据库所在路径)-Doc(文档所在路径)-Help(帮助文件所在路径)-Backup(备份路径)-Tmp(临时文件路径)-Reports (报表文件路径) -DnLoad (通讯文件接收路径) -Upload (通讯文件发送路径) -Images (图形图象图表图标路径) -Sounds (声音文件路径) -Animates ( 动画影视文件路径) -Html (超文本路径) -Sql (SQL文件路径) -Setup (安装系统文件路径) -Class (自定义类库路径) -Activex (Activex发布路径) -Source (源代码路径) -Obj (obj文件路径) -Resource (资源文件路径) 3.7.1.2命名项目文件必须使用一个有意义的名字。例如: Delphi中系统信息的项目文件被命名为 SysInfo.dpr。3.7.2 Form 文件3.7.2.1命名同Form的名称相一致:例如:Form的名称为FrmMain则Form文件的名称就为UFrmMain.frm。3.7.3 Data Module 文件3.7.3.1命名data module文件的命名应该有意义,并且使用‘DM’作为前缀。例如: 用户data module 被命名为‘DMCustomers.dfm’。 3.7.4 Remote Data Module 文件3.7.4.1 命名remote data module文件的命名应该有意义,并且使用‘RDM’作为前缀。例如:用户remote data module 被命名为‘RDMCustomers.dfm’。3.7.5 Unit文件3.7.5.1普通 Unit 3.7.5.1.1 Unit文件命名unit文件的命名应该有意义,并且使用‘U’作为前缀。例如: 通用unit 被命名为‘UGeneral’。 3.7.5.2 Form Units 3.7.5.2.1命名Form unit 文件的名字必须和Form的名称保持一致。例如:主窗体叫FrmMain.pas 则Form Unit文件的名字为:UFrmMain。3.7.5.3 Data Module Units 3.7.5.3.1命名Data Module unit 文件的名字必须和Data Module的名称保持一致。例如:主Data Module叫DMMain.pas 则Data Module Unit文件的名字为:UDMMain。3.7.5.4 文件头在所有文件的头部应写上此文件的用途,作者,日期及输入和输出。例如:{修改日期:作者: 用途:本模块结构组成: }3.7.6 Forms和Data Modules Forms3.7.6.1 Form类1. Form类命名标准Forms类的命名应该有意义,并且使用‘TForm’作为前缀。例如: About Form类的名字为:TAboutForm = class(TForm)主窗体的名字为TMainForm = class(TForm)2. Form类实例的命名标准Form 的类实例的名字应同期掉‘T’的Form类的名字相一致。例如: Type NameInstance NameTaboutFormAboutFormTmainFormMainFormTCustomerEntryFormCustomerEntryForm3.7.6.2 Data Modules Form3.7.6.2.1. Data Module Form 命名标准Data Modules Forms类的命名应该有意义,并且使用‘TDM’作为前缀。例如: TDMCustomer = class(TDataModule)TDMOrders = class(TDataModule)3.7.6.2.2. Data Module 实例命名标准Data Module Form 的类实例的名字应同期掉‘T’的Data Module Form类的名字相一致。例如:Type NameInstance NameTCustomerDataModuleCustomerDataModuleTordersDataModuleOrdersDataModule3.8控件3.8.1 控件实例的命名控件的实例应使用去掉‘T’该控件类的名称作为前缀,例如:输入用户姓名的Tedit的名字为:EditUserName。3.8.2 控件的简写控件的名称可使用以下简写:3.8.2.1 Standard Tab mm TMainMenupm TPopupMenummi TMainMenuItempmi TPopupMenuItemlbl TLabeledt TEditmem TMemobtn TButtoncb TCheckBoxrb TRadioButtonlb TListBoxcb TComboBoxscb TScrollBargb TGroupBoxrg TRadioGrouppnl TPanelcl TCommandList3.8.2.2 Additional Tab bbtn TBitBtnsb TSpeedButtonme TMaskEditsg TStringGriddg TDrawGridimg TImageshp TShapebvl TBevelsbx TScrollBoxclb TCheckListboxspl TSplitterstx TStaticTextcht TChart3.8.2.3 Win32 Tab tbc TTabControlpgc TPageControlil TImageListre TRichEdittbr TTrackBarprb TProgressBarud TUpDownhk THotKeyani TAnimatedtp TDateTimePickertv TTreeViewlv TListViewhdr THeaderControlstb TStatusBartlb TToolBarclb TCoolBar3.8.2.4 System Tab tm TTimerpb TPaintBoxmp TMediaPlayerolec TOleContainerddcc TDDEClientConvddci TDDEClientItemddsc TDDEServerConvddsi TDDEServerItem3.8.2.5 Internet Tab csk TClientSocketssk TServerSocketwbd TWebDispatcherpp TPageProducertp TQueryTableProducerdstp TDataSetTableProducernmdt TNMDayTimenec TNMEchonf TNMFingernftp TNMFtpnhttp TNMHttpnMsg TNMMsgnmsg TNMMSGServnntp TNMNNTPnpop TNMPop3nuup TNMUUProcessorsmtp TNMSMTPnst TNMStrmnsts TNMStrmServntm TNMTimenudp TNMUdppsk TPowerSockngs TNMGeneralServerhtml THtmlurl TNMUrlsml TSimpleMail3.8.2.6 Data Access Tab ds TDataSourcetbl TTableqry TQuerysp TStoredProcdb TDataBasessn TSessionbm TBatchMoveusql TUpdateSQL3.8.2.7 Data Controls Tab dbg TDBGriddbn TDBNavigatordbt TDBTextdbe TDBEditdbm TDBMemodbi TDBImagedblb TDBListBoxdbcb TDBComboBoxdbch TDBCheckBoxdbrg TDBRadioGroupdbll TDBLookupListBoxdblc TDBLookupComboBoxdbre TDBRichEditdbcg TDBCtrlGriddbch TDBChart3.8.2.8 Decision Cube Tab dcb TDecisionCubedcq TDecisionQuerydcs TDecisionSourcedcp TDecisionPivotdcg TDecisionGriddcgr TDecisionGraph3.8.2.9 QReport Tab qr TQuickReportqrsd TQRSubDetailqrb TQRBandqrcb TQRChildBandqrg TQRGroupqrl TQRLabelqrt TQRTextqre TQRExprqrs TQRSysDataqrm TQRMemoqrrt TQRRichTextqrdr TQRDBRichTextqrsh TQRShapeqri TQRImageqrdi TQRDBMImageqrcr TQRCompositeReportqrp TQRPreviewqrch TQRChart3.8.2.10 Dialogs TabOpenDialog TOpenDialog SaveDialog TSaveDialog OpenPictureDialog TOpenPictureDialog SavePictureDialog TSavePictureDialog FontDialog TFontDialog ColorDialog TColorDialog PrintDialog TPrintDialog PrinterSetupDialog TPrintSetupDialog FindDialog TFindDialog ReplaceDialog TReplaceDialog 3.8.2.11 Win31 Tab dbll TDBLookupListdblc TDBLookupCombots TTabSetol TOutlinetnb TTabbedNoteBooknb TNoteBookhdr THeaderflb TFileListBoxdlb TDirectoryListBoxdcb TDriveComboBoxfcb TFilterComboBox3.8.2.12 Samples Tab gg TGaugecg TColorGridspb TSpinButtonspe TSpinEditdol TDirectoryOutlinecal TCalendaribea TIBEventAlerter3.8.2.13 ActiveX Tab cfx TChartFXvsp TVSSpellf1b TF1Bookvtc TVTChartgrp TGraph3.8.2.14 Midas Tab prv TProvidercds TClientDataSetqcds TQueryClientDataSetdcom TDCOMConnectionolee TOleEnterpriseConnectionsck TSocketConnectionrms TRemoteServermid TmidasConnection4.修改规范本规则所做的规定仅适用于已经纳入配置管理的程序。在这类修改中,要求保留修改前的内容、并标识出修改和新增的内容。并在文件头加入修改人、修改日期、修改说明等必要的信息。4.1修改历史记录对源文件进行经过批准的修改时,修改者应在程序文件头加入修改历史项。在以后的每一次修改时,修改者都必须在该项目中填写下列信息:修改人修改时间修改原因修改说明即如何修改4.2新增代码行新增代码行的前后应有注释行说明。// 修改人,修改时间,修改说明新增代码行// 修改结束4.3删除代码行删除代码行的前后用注释行说明。//修改人,修改时间,修改说明// 可以参考一下《delphi 5开发人员指南》http://www.ronggui.com/images/newimage/song.htm 已经发给你了,是PB、Delphi编码规范 谢谢各位,呵呵,分都不够了,这样吧,本贴分数给u2m(随波逐流,漂泊一生)和ilang(中雨),我另外开贴,请amiao(努力学习,天天向上) ,winder_008(风中追沙),doctor5(大夫) 来领分,每人100(说了就要算吗(:) 分别见:http://www.csdn.net/expert/topic/1014/1014575.xml?temp=.9685785http://www.csdn.net/expert/topic/1014/1014562.xml?temp=.1518061http://www.csdn.net/expert/topic/1014/1014552.xml?temp=.3169062 Delphi编程通则 1.0 介绍 本文不是为Object Pascal语言定义语法规则的一种尝试。例如:在else前面放置封号”;”是违法的;编译器不允许这种用法。所以我不会在本文中展示语法规则。本文旨在在语言提供选择的地方定义适当的行为习惯。我通常在只有一种控制方法的地方保持沉默。1.1 背景 在本文出现的指导方针基于Delphi源代码的一部分。Delphi源代码恰好遵循这些指导方针。如果你发现了违反这些原则的情况,那么应该是这些原则而不是那些不确定的源代码成为你的指导方针。然而,你可以使用这些原代码作为这些原则的补充,至少它可以帮助你得到关于你自己的代码的形式的一般看法。1.2 感谢 本文这些格式是基于已完成的为Java语言定义的风格标准的工作的。Java在规则上对格式化Object Pascal源代码是没有任何影响的,但在Sun网站上的文档是本文的基础。 在某些特殊的地方本文的风格和格式受到”A Coding Style Guide for Java WorkShop and Java Studio Programming”(Achut Reddy, 《Java车间和Java工作室的编码向导》)的很大启发。该文章可在该URL找到:http://www.sun.com/workshop/java/wp-coding Delphi小组为本文的完成做出了重大贡献,事实上,如果没有它们的帮助,本文是无法完成的。2.0 源文件 Object Pascal源代码主要被分成单源文件和项目文件,他们都遵从相同的习惯。Delphi项目文件有一个.DPR的扩展名。它是项目的主文件。任何在项目中使用的单元文件都有一个.PAS的扩展名。其它的文件,象批处理文件、HTML文件或者DLLs也可以在项目中扮演一个角色,但本文只涉及项目文件和单元文件。2.1 源文件命名 Object Pascal支持长文件名。如果你使用几个单词来形成一个单一的名称,那么最好是为每个单词使用大写的开头字母:MyFile.pas。这被认为是插入式大写或驼峰式大写。扩展名应当使用小写形式。由于历史原因,Delphi源代码经常使用8:3式命名模式,但开发人员不必为上述规则所限制而转向Delphi小组的用法。 如果你正在翻译一个C/C++头文件,那么你翻译的Pascal文件要与C/C++头文件保持相同的主文件名,扩展名用.PAS。例如:Windows.h -> Windows.pas。如果Pascal语法强迫你将几个头文件组合到一个单一的单元文件中,那么包含其他头文件的那个头文件的文件名将作为新单元文件的名称。例如:Windows.h包含了WinBase.h文件,则新的单元文件名为Windows.pas.2.2 源文件组织 所有的Object Pascal单元文件应当按照以下的顺序包含下列元素:版权/标识块注释单元名接口段实现部分一个结束符”end.”每个部分之间至少空一行。其它的元素应当被结构化成你认为最适当的顺序。但版权应当出现在文件的最开始,然后是单元名,然后是任何条件定义、编译器指示符或包含语句,然后是uses字句:{*******************************************************}{ }{ Borland Delphi Visual Component Library }{ }{ Copyright (c) 1995,98 Inprise Corporation }{ }{*******************************************************}unit Buttons;{$S-,W-,R-}{$C PRELOAD}interfaceuses Windows, Messages, Classes, Controls, Forms, Graphics, StdCtrls, ExtCtrls, CommCtrl;如果你将type段放到const段之前,或者将它们两者混合,那是没有什么影响的。实现部分需要首先将implementation写出来,然后是uses字句,然后是其它的包含声明或别的指示符:implementationuses Consts, SysUtils, ActnList, ImgList;{$R BUTTONS.RES}2.2.1 版权/标识块注释 每一个源文件都应当以一个包含版本信息和标准版权布告块注释开始。版本信息可以象下面这样:{*******************************************************}{ }{ Widgets Galore }{ }{ Copyright (c) 1995,98 Your Company }{ }{*******************************************************}版权布告至少需要包含以下行: 版权所有(C) 年份 版权所有者如果你是为Borland开发软件的第三方,你可以在版权的最后加入你自己的名字:{*******************************************************}{ }{ Borland Delphi Visual Component Library }{ Copyright (c) 1995,99 Borland International }{ Created by Project JEDI }{ }{*******************************************************}2.2.2 unit声明 每一个单元文件要有一个unit声明。unit是一个保留字,因此它需要小写。单元的名称可以是大小写混合的,但必须和单元文件的文件名相同。例如:unit MyUnit;则单元文件的名称应当为MyUnit.pas。在文件系统中,它作为这个文件的入口。 2.2.3 uses声明 在单元内部,uses声明应当使用小些的uses引导。被引用的单元名要遵循在他自己的单元中被定义时使用的大写习惯:uses MyUnit; 每一个单元名被一个逗号同其相邻的单元名分开,最后一个单元名后面跟一个分号:uses Windows, SysUtils, Classes, Graphics, Controls, Forms, TypInfo; 在uses的下一行开始加入单元名和在uses后面直接加入单元名同样都是正确的。uses Windows, SysUtils, Classes, Graphics, Controls, Forms, TypInfo; 你可以格式化你的单元名列表,可以在80个字符限制下换行,或者每个单元名一行。2.2.4 类和接口定义 类的定义以两个空格开始,然后是一个前缀”T”。 前缀要大写,每个内嵌的单词要大写开头。不要在Object Pascal源代码中使用制表符”Tab”。例:TMyClass 在标识符之后接一个空格,然后是等号,然后是class单词,class要小写: TMyClass = class 如果你的类是从祖先继承来的,则需要加入包含着祖先类的左右括号: TMyClass = class(TObject) 范围指示符离页边两个空格,并以下面的顺序出现: TMyClass = clss(TObject) private protect public published end; 数据通常只在private段声明,并且它们的标识符以”F”开始。所有此类的声明离页边4个空格: TMyClass = class(TObject) private FMyDate: Integer; function GetDate: Integer; procedure SetData(Value: Integer); public published property MyData: Integer read GetData write SetData; end; 接口遵从同类相同的规则,除了你应当忽略范围指示符和私有数据,并且使用interface单词代替class单词。 命名习惯 除了保留字和指示符是小写外,所有的Pascal标识符应当使用驼峰式格式,即每个标识符开头字母要大写,内嵌单词的首字母也要大写,只取首字母的缩写词也一样。MyIdentifierMyFTPClass 对此规则主要的例外是头文件翻译的情况,应当遵循在原头文件中的命名习惯。例如: WM_LBUTTONDOWN,不要写成wm_LButtonDown. 除了头文件翻译外,不要使用下划线分割单词。类名应当是名词或名词短语。接口或类的名称依赖于接口的显而易见的目的、用途。好的名字: AddressForm, ArrayIndexOutOfBoundsException低劣的名字: ManageLayout //使用动词短语 delphi_is_new_to_me //使用下划线 3.1 单元命名 参见单元声明3.2 类/接口命名 参见类/接口声明3.3 域/字段命名 使用驼峰式格式。以大写的”F”开始,并且在private中声明所有的数据,使用属性或获取者(getter)和安装者(setter)来提供公共的存取操作。例如:使用名字GetSomething来命名一个返回内部域/字段值的函数,使用SetSomething来命名一个设置域/字段值的过程。 不要在const段全部使用大写,除非是头文件翻译的需要。 Delphi是在加利福尼亚开发的,所有我们阻止记号的使用,除非是头文件翻译的需要。正确: FMyString: string;不正确: lpstrMyString: string;当然在枚举类型定义中保留了匈牙利命名法: TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose, bkAbort, bkRetry, bkignore, bkAll); 在这种情况下字符bk被插入到这个枚举类型的每一个元素前。bk意味着ButtonKind。 在考虑命名习惯时,要避免使用单个字符的名称,但零时变量和循环变量除外。 避免使用”l”(L)变量,因为它和”1”(one)无论在打印机还是在显示器上都难以分辨。3.4 方法命名 方法命名也使用驼峰格式。方法命名习惯同非常量域的命名方法是相同的,但可以从上下文区分它们。方法命名应当强制使用动词或动词短语。例如://好的方法命名:ShowStatus, DrawCircle, AddLayoutComponent//差的方法命名:MouseButton //名词短语,没有描述功能drawCircle //以小写字母开头add_layout_component //使用了下划线//以下方法的功能不够明确。它是开始运行一个服务呢(更好:StartServer)还是判断一个服务是否在运行(更好:IsServerRunning)?ServerRunning //动词短语,但不是命令 一个获取或者设置一些类属性的方法应当分别被称为GetProperty或者SetProperty,Property代表该属性的名称。例如:GetHeight, SetHeight 一个测试类的布尔属性的方法应当被命名为IsVisible,Visible代表属性的名称。例如: IsResizable, IsVisible3.5 局部变量命名 除了不使用”F”外,局部变量的命名规则同域/字段的命名规则一样。参见3.3节。3.6 保留字 保留字和指示符要全部小写。这有时有些混乱。例如:Integer是一个标识符,并且以首字母大写出现。而string保留字则全部小写。3.7 类型声明 所有类型名称声明以字母T开始,接下来和类的命名相同。4.0 空白用法 4.1 空白行 空白行可以通过将逻辑相关的代码段分组来提高可读性。一个空白行也可以在下列地方使用: 在版权注释块之后,包声明(package),导入段(import)。 类声明之间。 方法声明之间。 4.2 空格 Object Pascal是一种非常清晰易读的语言。通常,你不需要在代码里加入很多空格来分隔行。以下几条提供了一些原则该如何使用空格: 4.2.2 不应当使用空格: 在方法名和左括号之间; 在.(dot)操作符之前或之后; 在一元操作符和它的操作数之间; 在一个类型和被它强制转换的表达式之间; 在左括号之后和右括号之前; 在左方括号之后和右方括号之前; 在一个封号前; 例如: //正确用法: function TMyClass.MyFunc(var Value: Integer); MyPointer := @MyRecord; MyClass := TMyClass(MyPointer); MyInteger := MyIntegerArray[5]; //错误用法: function TMyClass.MyFunc( var Value: Integer ) ; MyPointer := @ MyRecord; MyClass := TMyClass ( MyPointer ) ; MyInteger := MyIntegerArray [ 5 ] ;4.3 缩进 你应当总是为所有的缩进层次缩进两个空格。换句话说就是,第一层缩进两个空格,第二层缩进四个空格,第三层缩进六个空格……。不要使用制表符Tab。 当然,仍然有少量的例外。保留字象unit, uses, type, interface, implementation, initialization 和finalization总是顶格的。单元的最后一个end标识符也是顶格的。在项目文件中,program和主begin、end也是顶格的。在主begin..end块内则需要缩进至少两个空格。4.4 续行 行应当限制在80列以内。超过80列的行应当被分成多个连续的行。所有的后续行应当排列在该声明的第一行之后,并且缩进两个字符的空格。 例如://正确:function CreateWindowEx(dwExStyle: DWORD; lpClassName: PChar; lpWindowName: PChar; dwStyle: DWORD; X, Y, nWidth, nHeight: Integer; hWndParent: HWND; hMenu: HMENU; hInstance: HINST; lpParam: Pointer): HWND; stdcall;if ((X = Y) or (Y = X) or (Z = P) or (F = J) thenbegin S := J;end; 不要在参数和它的类型之间换行,除非列表是由逗号分隔,那样的话要在最后一个参数前换行,这样类型名就在下一行开头了。冒号和它的变量之间不应该有空格,而冒号和类型名之间要有一个空格。//正确:procedure Foo(Param1: Integer; Param2: Integer);//错误:procedure Foo( Param :Integer; Param2:Integer); 一个后续行不应以一个二进制操作符开始。避免在通常不出现空白的地方割断一行,比如在方法名和它的左括号之间,或者在一个数组名和它的左方括号之间。如果你必须在上述情况下割断行,那么应当在左括号或左方括号之后换行。不要把begin放在其它代码的同一行。例如://错误:while (LongExpression1 or LongExpression2) do begin //DoSomething //DoSomethingElse;end;//正确while (LongExpression1 or longExpression2) dobegin //DoSomething //DoSomethingElse;end;if (LongExpressiong1) or (LongExpression2) or (LongExpression3) then 如何在后台打开一个网页 一起探讨“胜天财务进销存管理系统”!!! 当用户修改IP地址后,触发一个事件,如何实现呢~!? 我想作一个像Delphi那种界面的程序,请教各位高手。 在线等到帮助!! 一个关于报表打印问题,大家关注:可能大家都比较容易碰到的问题。 怎么样把运行程序时需要的dll编译进exe? 有关interface和dispinterface 奇怪啊!query控件中的sql语句的问题? geliang(太阳的光芒),请来拿分! 100分求一篇全面的软件程序设计书,收到即给分!! 用install shield 制作安装程序如何将access数据库加入到安装程序中!指教
1)先做应用分析,直到你和用户都明白他想要你作什么,这是最重要的.
2)用文档的方式记录下来
3)做总体系统逻辑分析.
4)做总体系统应用分析.
5)划分模块,并分配人手,
6)每队再做分析,并建立原型,修改原型.如果和他人的接口部分要改动,必须由
三方同意商定.
7)接口联合调试
8)系统调试
9)文档,用户说明.
--以上每一步的文档都要清楚,并由各模块负责人负责.
原则上编码的工作量视,如果应用模型细,就少些,反之就多些,还要看实现技术是否
容易.
团队精神很重要,要让所有人都觉得自己很有价值.
我觉得如果想将项目做得好,要做到一下几点,除非您特别牛:)
1 : 首先要熟悉用户的业务流程,明确需求,做好充分的可行性分析. 这一点我觉得
非常重要,直接决定以后工作的进度和质量.我做得第一个项目就是没有重视这一点,
需求没完全明确,到用户要求改的时候,sigh...我们几个人没日没夜的改,还是一大堆
bug在里头,痛苦,往事不堪回首:).
了解用户的业务流程最为辛苦,或则编码对于我们程序员来说不是什么大问题,
但了解业务流程绝对是难解决的,要有耐心,不完全搞清楚不要匆匆忙忙的进行系统
设计,了解也是个渐进的过程,多点和用户交流,了解他们在现行系统上面的工作情况
和工作概要时非常重要的.这一部分的工作我觉得起码要1-2周.如果项目很大,还要
更久.
可行性的分析包括了经济上的,技术上的,社会上的等等方面的因素,要了解到
用户提出的要求是不是真的能够完成,经济上有问题吗?技术上是不是不可行?都要知道
得清清楚楚.
2 : 上面的内容了解完了,可以进行系统的设计了,按照上面所得的资料,确定一个
系统的概要.最好能用建模工具如Rose将模块划分好,再按工作量具体分工.如果系统
涉及到数据库的(大多数都是这样的拉),数据库各个表的定义及优化要讨论清楚,争取
一步到位,不要等做着做着发现表的定义有问题,要改,sigh...可能工作量就大了
3 : 要具体编码了,严格控制进度是应该的,结合测试来完成,写代码的时候尽量能
加上注释.我个人认为测试时非常重要的,偏偏中国不重视这个,很多公司都没有专门的
测试人员,没办法,只要交叉测试了.
4 : 文档要齐全!特别是对大型的系统来说,这个尤为重要.文档包括一开始的需求
报告,可行性报告,系统设计的总结,模块划分的纪录,在各个阶段测试结果的纪录,用户
手册,软件说明书等等,甚至程序员在编码的时候写的注释,可以在整个软件开发的过
程中起到知道的作用.
我的看法就那么多,不知道对不对,如有不对,请大家指出//thx:)
************
说点我认为实用的罢
做一个项目,始终是人在做,书上的东西是死的,而人是活的,有了好的方法,
不一定会有好的效果.
我认为做一个项目,有以下几点注意的,当然,做一个项目不会只有这些:
1.前其人员不用太多,找几个(具体几个,看业务大小和这几个人的人员素质而定,
其实有时,也与客户的要求有关)对业务熟悉的人员(当然,也必须是熟悉开发工具的)
进行前其的调研,设计文档,此时,尚未进入编码阶段呢
2第二阶段,此时不应该是大量人员投入的阶段,而应该是找几个(也许是一两个)比较
有实力的人,做出系统的框架(如果有Delphi的话,就应该将系统总控模块做好,同时
做好各模块的接口部分)
与此同时,再找一两个人做一些基础数据的维护界面(例如人员信息维护等)
3第三阶段,此时,投入大量人员,(此时,应该是整个项目中时间最短的部分)分模块
开发,记住,开发必须是在前面定义好的接口之下,同时必须在主框架中调试
4第四阶段,最好找开始做调研的人中的一两个负责测试的主要工作(当然,测试不可能
只用一两个人,但这一两个人是总体把握什么是对的即符合用户要求的)既然测试,总会
有些问题的,所以,此时,也应该留几个开发人员跟着,(这几个开发人员的水平可以平一
一些,锻炼队伍嘛),有问题及时修改,没有问题,一起做测试
其实在开发过程中,总会有一些不太协调的地方,所以,一个项目的成败,还必须有两点
特别提出的,一是这个项目的负责人必须能够调动项目组中的每一项可利用资源(包括
员和其它各方面的东西)二是项目客户必须有一个说话可以算数的人当对项目挂名负责
真的,这两点真的很重要.
说了这么多废话,不知有没有什么用处,真的,有些算是教训吧,有些可以算是不太成熟
的经验,有没有用我实在也无从知道,因为才做过一两个比较大的项目而已
本规范主要规定Delphi源程序在书写过程中所应遵循的规则及注意事项。编写该规范的目的是使公司软件开发人员的源代码书写习惯保持一致。这样做可以使每一个组员都可以理解其它组员的代码,以便于源代码的二次开发记忆系统的维护。2.一般格式规范
2.1缩进
缩进就是在当源程序的级改变时为增加可读性而露出的两个空格。缩进的规则为每一级缩进两个空格。不准许使用Tab。因为Tab会因为用户所作的设置不同而产生不同的效果。当遇到begin 或进入判断、循环、异常处理、with语句、记录类型声明、类声明等的时侯增加一级, 当遇到end或退出判断、循环、异常处理、with语句、记录类型声明、类声明等的时侯减少一级。例如:
if TmpInt <> 100 then
TmpInt := 100;
2.2 Begin..End
begin语句和end语句在源程序中要独占一行,例如:
for I := 0 to 10 do begin //不正确的用法
end;
for I := 0 to 10 do //正确的用法
begin
end;
2.3空格
在操作符及逻辑判断符号的两端添加空格,例如:I := I + 1;,a and b 等,但添加括号时不需要空格。例如:if ( a > b ) then //错误的用法
If (a > b) then //正确的用法
又例如:procedure Test(Param1: integer; Param3: string);3. Object Pascal语法书写格式规范
3.1保留字
Object Pascal 语言的保留字或关键词应全部使用小写字母。
3.2过程和函数
3.2.1命名及格式
过程和函数的名称应全部使用有意义的单词组成,并且所有单词的第一个字母应该使用大写字母。例如:
procedure formatharddisk;//不正确的命名
procedure FormatHardDisk;//正确的命名
设置变量内容的过程和函数,应使用Set作为前缀,例如:
procedure SetUserName;
读取变量内容的过程和函数,应使用Get作为前缀,例如:
function GetUserName: string;
3.2.2 过程和函数的参数
3.2.2.1命名
统一类型的参数写在同一句中:
procedure Foo(Param1, Param2, Param3: Integer; Param4: string);
3.2.2.2命名
所有参数必须是有意义的;并且当参数名称和其它属性名称重了的时候,加一个前缀‘A’, 例如:
procedure SomeProc(AUserName: string; AUserAge: integer);
3.2.2.3命名冲突
当使用的两个unit中包括一个重名的函数或过程时, 那幺当你引用这一函数或过程时,将执行在use 子句中后声明的那个unit中的函数或过程。为了避免这种‘uses-clause-dependent’需要在引用函数或过程时,写完整函数或过程的出处。例如:
SysUtils.FindClose(SR);
Windows.FindClose(Handle);
3.3 变量
3.3.1 变量命名及格式
首先所有变量必须起有意义的名字,使其它组员可以很容易读懂变量所代表的意义,变量命名可以采用同义的英文命名,可使用几个英文单词,但每一单词的首字母必须大写。例如:
var
WriteFormat::string;
同时对于一些特定类型可采用一定的简写如下:
指针类型
P纪录类型
Rec数组类型
Arr类
Class循环控制变量通常使用单一的字符如:i, j, 或 k。 另外使用一个有意义的名字例如:UserIndex ,也是准许的。
3.3.2 局部变量
在过程中使用局部变量遵循所有其它变量的命名规则。
3.3.3 全局变量
尽量不使用全局变量,如必须使用全局变量则必须加前缀‘g’,同时应在变量名称中体现变量的类型。例如:
gprecUserCount: point;//名称为UserCount的全局变量,其类型为指向一结构的指针
但是在模块内部可以使用全局变量。所有模块内全局变量必须用‘F’为前缀。如果几个模块之间需要进行资料交换,则需要通过声明属性的方法来实现。例如:
type
TFormOverdraftReturn = class(TForm)
private
{ Private declarations }
FuserName: string;
FuserCount: Integer;
Procedure SetUserName(Value: string);
Function GetUserName: string;
public
{ Public declarations }
property UserName: string read GetUserName write SetUserName;
property UserCount: Integer read FuserCount write FuserCount;
end;
3.4类型
3.4.1 大小写协议
保留字的类型名称必须全部小写。Win32 API 的类型通常全部大写,对于其它类型则首字母大写,其余字母小写,例如:
var
MyString: string; // reserved word
WindowHandle: HWND; // Win32 API type
I: Integer; // type identifier introduced in System unit
3.4.2 浮点类型
尽量不使用 Real 类型,他只是为了和旧的Pascal代码兼容,尽量使用Double 类型。Double 类型是对处理器和数据总线做过最优化的并且是IEEE定义的标准数据结构。当数值超出Double的范围时,使用Extended 。但Extended不被Jave支持。但使用其它语言编写的DLL时可能会使用Single 类型。
3.4.3 枚举类型
枚举类型的名字必须有意义并且类型的名字之前要加前缀‘T’。枚举类型的内容的名字必须包含枚举类型名称的简写,例如:
TSongType = (stRock, stClassical, stCountry, stAlternative, stHeavyMetal, stRB);
3
数组类型的名字必须有意义并且类型的名字之前要加前缀‘T’。如果声明一个指向数组类型的指针必须在该类型的名字之前加前缀‘P’,例如:
type
PCycleArray = ^TCycleArray;
TCycleArray = array[1..100] of integer;
3.4.5记录类型
记录类型的名字必须有意义并且类型的名字之前要加前缀‘T’。如果声明一个指向数组类型的指针必须在该类型的名字之前加前缀‘P’,例如:
type
PEmployee = ^TEmployee;
TEmployee = record
EmployeeName: string
EmployeeRate: Double;
end;
3.5类
3.5.1 命名及格式
类的名字必须有意义并且类型的名字之前要加前缀‘T’。例如:
type
TCustomer = class(TObject)
类实例的名字通常是去掉‘T’的类的名字。例如:
var
Customer: TCustomer;
3.5.2 类中的变量
3.5.2.1命名及格式
类的名字必须有意义并且类型的名字之前要加前缀‘F’。所有的变量必须是四有的。如果需要从外部访问此变量则需要声明一属性
3.5.3 方法
3.5.3.1命名及格式
同函数和过程的命名及格式。
3.5.3.2 属性访问方法
所有的属性访问方法必须出现在private 或 protected 中。属性访问方法的命名同函数和过程的命名另外读方法(reader method)必须使用前缀‘Get’. 写方法(writer method)必须使用前缀‘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;
3.6属性
3.6.1 命名及格式
同其用操作的,出去前缀‘F’的类的变量的名称相一致 。
3.7文件
3.7.1项目文件
3.7.1.1项目目录结构
程序主目录--Bin(应用程序所在路径)
-Dbs(本地数据库所在路径)
-Doc(文档所在路径)
-Help(帮助文件所在路径)
-Backup(备份路径)
-Tmp(临时文件路径)
-Reports (报表文件路径)
-DnLoad (通讯文件接收路径)
-Upload (通讯文件发送路径)
-Images (图形图象图表图标路径)
-Sounds (声音文件路径)
-Animates ( 动画影视文件路径)
-Html (超文本路径)
-Sql (SQL文件路径)
-Setup (安装系统文件路径)
-Class (自定义类库路径)
-Activex (Activex发布路径)
-Source (源代码路径)
-Obj (obj文件路径)
-Resource (资源文件路径)
3.7.1.2命名
项目文件必须使用一个有意义的名字。例如: Delphi中系统信息的项目文件被命名为 SysInfo.dpr。
3.7.2 Form 文件
3.7.2.1命名
同Form的名称相一致:例如:Form的名称为FrmMain则Form文件的名称就为UFrmMain.frm。
3.7.3 Data Module 文件
3.7.3.1命名
data module文件的命名应该有意义,并且使用‘DM’作为前缀。例如: 用户data module 被命名为‘DMCustomers.dfm’。
3.7.4 Remote Data Module 文件
3.7.4.1 命名
remote data module文件的命名应该有意义,并且使用‘RDM’作为前缀。例如:用户remote data module 被命名为‘RDMCustomers.dfm’。
3.7.5 Unit文件
3.7.5.1普通 Unit
3.7.5.1.1 Unit文件命名
unit文件的命名应该有意义,并且使用‘U’作为前缀。例如: 通用unit 被命名为‘UGeneral’。
3.7.5.2 Form Units
3.7.5.2.1命名
Form unit 文件的名字必须和Form的名称保持一致。例如:主窗体叫FrmMain.pas 则Form Unit文件的名字为:UFrmMain。
3.7.5.3 Data Module Units
3.7.5.3.1命名
Data Module unit 文件的名字必须和Data Module的名称保持一致。例如:主Data Module叫DMMain.pas 则Data Module Unit文件的名字为:UDMMain。
3.7.5.4 文件头
在所有文件的头部应写上此文件的用途,作者,日期及输入和输出。例如:
{
修改日期:
作者:
用途:
本模块结构组成:
}
3.7.6 Forms和Data Modules Forms
3.7.6.1 Form类
1. Form类命名标准
Forms类的命名应该有意义,并且使用‘TForm’作为前缀。例如: About Form类的名字为:
TAboutForm = class(TForm)
主窗体的名字为
TMainForm = class(TForm)
2. Form类实例的命名标准
Form 的类实例的名字应同期掉‘T’的Form类的名字相一致。例如:
Type Name
Instance NameTaboutForm
AboutFormTmainForm
MainFormTCustomerEntryForm
CustomerEntryForm
3.7.6.2 Data Modules Form
3.7.6.2.1. Data Module Form 命名标准
Data Modules Forms类的命名应该有意义,并且使用‘TDM’作为前缀。例如:
TDMCustomer = class(TDataModule)
TDMOrders = class(TDataModule)
3.7.6.2.2. Data Module 实例命名标准
Data Module Form 的类实例的名字应同期掉‘T’的Data Module Form类的名字相一致。例如:
Type Name
Instance NameTCustomerDataModule
CustomerDataModuleTordersDataModule
OrdersDataModule3.8控件
3.8.1 控件实例的命名
控件的实例应使用去掉‘T’该控件类的名称作为前缀,例如:
输入用户姓名的Tedit的名字为:EditUserName。
3.8.2 控件的简写
控件的名称可使用以下简写:
3.8.2.1 Standard Tab
mm TMainMenu
pm TPopupMenu
mmi TMainMenuItem
pmi TPopupMenuItem
lbl TLabel
edt TEdit
mem TMemo
btn TButton
cb TCheckBox
rb TRadioButton
lb TListBox
cb TComboBox
scb TScrollBar
gb TGroupBox
rg TRadioGroup
pnl TPanel
cl TCommandList
3.8.2.2 Additional Tab
bbtn TBitBtn
sb TSpeedButton
me TMaskEdit
sg TStringGrid
dg TDrawGrid
img TImage
shp TShape
bvl TBevel
sbx TScrollBox
clb TCheckListbox
spl TSplitter
stx TStaticText
cht TChart
3.8.2.3 Win32 Tab
tbc TTabControl
pgc TPageControl
il TImageList
re TRichEdit
tbr TTrackBar
prb TProgressBar
ud TUpDown
hk THotKey
ani TAnimate
dtp TDateTimePicker
tv TTreeView
lv TListView
hdr THeaderControl
stb TStatusBar
tlb TToolBar
clb TCoolBar
3.8.2.4 System Tab
tm TTimer
pb TPaintBox
mp TMediaPlayer
olec TOleContainer
ddcc TDDEClientConv
ddci TDDEClientItem
ddsc TDDEServerConv
ddsi TDDEServerItem
3.8.2.5 Internet Tab
csk TClientSocket
ssk TServerSocket
wbd TWebDispatcher
pp TPageProducer
tp TQueryTableProducer
dstp TDataSetTableProducer
nmdt TNMDayTime
nec TNMEcho
nf TNMFinger
nftp TNMFtp
nhttp TNMHttp
nMsg TNMMsg
nmsg TNMMSGServ
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
3.8.2.6 Data Access Tab
ds TDataSource
tbl TTable
qry TQuery
sp TStoredProc
db TDataBase
ssn TSession
bm TBatchMove
usql TUpdateSQL
3.8.2.7 Data Controls Tab
dbg TDBGrid
dbn TDBNavigator
dbt TDBText
dbe TDBEdit
dbm TDBMemo
dbi TDBImage
dblb TDBListBox
dbcb TDBComboBox
dbch TDBCheckBox
dbrg TDBRadioGroup
dbll TDBLookupListBox
dblc TDBLookupComboBox
dbre TDBRichEdit
dbcg TDBCtrlGrid
dbch TDBChart
3.8.2.8 Decision Cube Tab
dcb TDecisionCube
dcq TDecisionQuery
dcs TDecisionSource
dcp TDecisionPivot
dcg TDecisionGrid
dcgr TDecisionGraph
3.8.2.9 QReport Tab
qr TQuickReport
qrsd TQRSubDetail
qrb TQRBand
qrcb TQRChildBand
qrg 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
3.8.2.10 Dialogs Tab
OpenDialog TOpenDialog
SaveDialog TSaveDialog
OpenPictureDialog TOpenPictureDialog
SavePictureDialog TSavePictureDialog
FontDialog TFontDialog
ColorDialog TColorDialog
PrintDialog TPrintDialog
PrinterSetupDialog TPrintSetupDialog
FindDialog TFindDialog
ReplaceDialog TReplaceDialog
3.8.2.11 Win31 Tab
dbll TDBLookupList
dblc TDBLookupCombo
ts TTabSet
ol TOutline
tnb TTabbedNoteBook
nb TNoteBook
hdr THeader
flb TFileListBox
dlb TDirectoryListBox
dcb TDriveComboBox
fcb TFilterComboBox
3.8.2.12 Samples Tab
gg TGauge
cg TColorGrid
spb TSpinButton
spe TSpinEdit
dol TDirectoryOutline
cal TCalendar
ibea TIBEventAlerter
3.8.2.13 ActiveX Tab
cfx TChartFX
vsp TVSSpell
f1b TF1Book
vtc TVTChart
grp TGraph
3.8.2.14 Midas Tab
prv TProvider
cds TClientDataSet
qcds TQueryClientDataSet
dcom TDCOMConnection
olee TOleEnterpriseConnection
sck TSocketConnection
rms TRemoteServer
mid TmidasConnection4.修改规范
本规则所做的规定仅适用于已经纳入配置管理的程序。在这类修改中,要求保留修改前的内容、并标识出修改和新增的内容。并在文件头加入修改人、修改日期、修改说明等必要的信息。
4.1修改历史记录
对源文件进行经过批准的修改时,修改者应在程序文件头加入修改历史项。在以后的每一次修改时,修改者都必须在该项目中填写下列信息:
修改人
修改时间
修改原因
修改说明即如何修改
4.2新增代码行
新增代码行的前后应有注释行说明。
// 修改人,修改时间,修改说明
新增代码行
// 修改结束
4.3删除代码行
删除代码行的前后用注释行说明。
//修改人,修改时间,修改说明
//
《delphi 5开发人员指南》
http://www.ronggui.com/images/newimage/song.htm
http://www.csdn.net/expert/topic/1014/1014575.xml?temp=.9685785
http://www.csdn.net/expert/topic/1014/1014562.xml?temp=.1518061
http://www.csdn.net/expert/topic/1014/1014552.xml?temp=.3169062
1.0 介绍
本文不是为Object Pascal语言定义语法规则的一种尝试。例如:在else前面放置封号”;”是违法的;编译器不允许这种用法。所以我不会在本文中展示语法规则。本文旨在在语言提供选择的地方定义适当的行为习惯。我通常在只有一种控制方法的地方保持沉默。
1.1 背景
在本文出现的指导方针基于Delphi源代码的一部分。Delphi源代码恰好遵循这些指导方针。如果你发现了违反这些原则的情况,那么应该是这些原则而不是那些不确定的源代码成为你的指导方针。然而,你可以使用这些原代码作为这些原则的补充,至少它可以帮助你得到关于你自己的代码的形式的一般看法。
1.2 感谢
本文这些格式是基于已完成的为Java语言定义的风格标准的工作的。Java在规则上对格式化Object Pascal源代码是没有任何影响的,但在Sun网站上的文档是本文的基础。 在某些特殊的地方本文的风格和格式受到”A Coding Style Guide for Java WorkShop and Java Studio Programming”(Achut Reddy, 《Java车间和Java工作室的编码向导》)的很大启发。该文章可在该URL找到:http://www.sun.com/workshop/java/wp-coding
Delphi小组为本文的完成做出了重大贡献,事实上,如果没有它们的帮助,本文是无法完成的。
2.0 源文件
Object Pascal源代码主要被分成单源文件和项目文件,他们都遵从相同的习惯。Delphi项目文件有一个.DPR的扩展名。它是项目的主文件。任何在项目中使用的单元文件都有一个.PAS的扩展名。其它的文件,象批处理文件、HTML文件或者DLLs也可以在项目中扮演一个角色,但本文只涉及项目文件和单元文件。
2.1 源文件命名
Object Pascal支持长文件名。如果你使用几个单词来形成一个单一的名称,那么最好是为每个单词使用大写的开头字母:MyFile.pas。这被认为是插入式大写或驼峰式大写。扩展名应当使用小写形式。由于历史原因,Delphi源代码经常使用8:3式命名模式,但开发人员不必为上述规则所限制而转向Delphi小组的用法。
如果你正在翻译一个C/C++头文件,那么你翻译的Pascal文件要与C/C++头文件保持相同的主文件名,扩展名用.PAS。例如:Windows.h -> Windows.pas。如果Pascal语法强迫你将几个头文件组合到一个单一的单元文件中,那么包含其他头文件的那个头文件的文件名将作为新单元文件的名称。例如:Windows.h包含了WinBase.h文件,则新的单元文件名为Windows.pas.
2.2 源文件组织
所有的Object Pascal单元文件应当按照以下的顺序包含下列元素:
版权/标识块注释
单元名
接口段
实现部分
一个结束符”end.”每个部分之间至少空一行。其它的元素应当被结构化成你认为最适当的顺序。但版权应当出现在文件的最开始,然后是单元名,然后是任何条件定义、编译器指示符或包含语句,然后是uses字句:
{*******************************************************}
{ }
{ Borland Delphi Visual Component Library }
{ }
{ Copyright (c) 1995,98 Inprise Corporation }
{ }
{*******************************************************}unit Buttons;{$S-,W-,R-}
{$C PRELOAD}interfaceuses
Windows, Messages, Classes,
Controls, Forms, Graphics,
StdCtrls, ExtCtrls, CommCtrl;
如果你将type段放到const段之前,或者将它们两者混合,那是没有什么影响的。
实现部分需要首先将implementation写出来,然后是uses字句,然后是其它的包含声明或别的指示符:
implementation
uses
Consts, SysUtils, ActnList,
ImgList;{$R BUTTONS.RES}2.2.1 版权/标识块注释
每一个源文件都应当以一个包含版本信息和标准版权布告块注释开始。版本信息可以象下面这样:
{*******************************************************}
{ }
{ Widgets Galore }
{ }
{ Copyright (c) 1995,98 Your Company }
{ }
{*******************************************************}版权布告至少需要包含以下行:
版权所有(C) 年份 版权所有者
如果你是为Borland开发软件的第三方,你可以在版权的最后加入你自己的名字:
{*******************************************************}
{ }
{ Borland Delphi Visual Component Library }
{ Copyright (c) 1995,99 Borland International }
{ Created by Project JEDI }
{ }
{*******************************************************}
2.2.2 unit声明
每一个单元文件要有一个unit声明。unit是一个保留字,因此它需要小写。单元的名称可以是大小写混合的,但必须和单元文件的文件名相同。例如:
unit MyUnit;则单元文件的名称应当为MyUnit.pas。在文件系统中,它作为这个文件的入口。
在单元内部,uses声明应当使用小些的uses引导。被引用的单元名要遵循在他自己的单元中被定义时使用的大写习惯:
uses MyUnit; 每一个单元名被一个逗号同其相邻的单元名分开,最后一个单元名后面跟一个分号:
uses
Windows, SysUtils, Classes, Graphics, Controls, Forms,
TypInfo;
在uses的下一行开始加入单元名和在uses后面直接加入单元名同样都是正确的。
uses Windows, SysUtils, Classes, Graphics, Controls, Forms,
TypInfo; 你可以格式化你的单元名列表,可以在80个字符限制下换行,或者每个单元名一行。
2.2.4 类和接口定义
类的定义以两个空格开始,然后是一个前缀”T”。 前缀要大写,每个内嵌的单词要大写开头。不要在Object Pascal源代码中使用制表符”Tab”。例:
TMyClass
在标识符之后接一个空格,然后是等号,然后是class单词,class要小写:
TMyClass = class
如果你的类是从祖先继承来的,则需要加入包含着祖先类的左右括号:
TMyClass = class(TObject)
范围指示符离页边两个空格,并以下面的顺序出现:
TMyClass = clss(TObject)
private
protect
public
published
end;
数据通常只在private段声明,并且它们的标识符以”F”开始。所有此类的声明离页边4个空格:
TMyClass = class(TObject)
private
FMyDate: Integer;
function GetDate: Integer;
procedure SetData(Value: Integer);
public
published
property MyData: Integer read GetData write SetData;
end;
接口遵从同类相同的规则,除了你应当忽略范围指示符和私有数据,并且使用interface单词代替class单词。
命名习惯
除了保留字和指示符是小写外,所有的Pascal标识符应当使用驼峰式格式,即每个标识符开头字母要大写,内嵌单词的首字母也要大写,只取首字母的缩写词也一样。
MyIdentifier
MyFTPClass
对此规则主要的例外是头文件翻译的情况,应当遵循在原头文件中的命名习惯。例如:
WM_LBUTTONDOWN,不要写成wm_LButtonDown.
除了头文件翻译外,不要使用下划线分割单词。类名应当是名词或名词短语。接口或类的名称依赖于接口的显而易见的目的、用途。好的名字:
AddressForm, ArrayIndexOutOfBoundsException
低劣的名字:
ManageLayout //使用动词短语
delphi_is_new_to_me //使用下划线
参见单元声明3.2 类/接口命名
参见类/接口声明3.3 域/字段命名
使用驼峰式格式。以大写的”F”开始,并且在private中声明所有的数据,使用属性或获取者(getter)和安装者(setter)来提供公共的存取操作。例如:使用名字GetSomething来命名一个返回内部域/字段值的函数,使用SetSomething来命名一个设置域/字段值的过程。
不要在const段全部使用大写,除非是头文件翻译的需要。
Delphi是在加利福尼亚开发的,所有我们阻止记号的使用,除非是头文件翻译的需要。
正确:
FMyString: string;
不正确:
lpstrMyString: string;
当然在枚举类型定义中保留了匈牙利命名法:
TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp,
bkYes, bkNo, bkClose, bkAbort, bkRetry,
bkignore, bkAll); 在这种情况下字符bk被插入到这个枚举类型的每一个元素前。bk意味着ButtonKind。
在考虑命名习惯时,要避免使用单个字符的名称,但零时变量和循环变量除外。
避免使用”l”(L)变量,因为它和”1”(one)无论在打印机还是在显示器上都难以分辨。3.4 方法命名
方法命名也使用驼峰格式。方法命名习惯同非常量域的命名方法是相同的,但可以从上下文区分它们。方法命名应当强制使用动词或动词短语。例如:
//好的方法命名:
ShowStatus, DrawCircle, AddLayoutComponent
//差的方法命名:
MouseButton //名词短语,没有描述功能
drawCircle //以小写字母开头
add_layout_component //使用了下划线//以下方法的功能不够明确。它是开始运行一个服务呢(更好:StartServer)还是判断一个服务是否在运行(更好:IsServerRunning)?
ServerRunning //动词短语,但不是命令 一个获取或者设置一些类属性的方法应当分别被称为GetProperty或者SetProperty,Property代表该属性的名称。例如:
GetHeight, SetHeight 一个测试类的布尔属性的方法应当被命名为IsVisible,Visible代表属性的名称。例如:
IsResizable, IsVisible3.5 局部变量命名
除了不使用”F”外,局部变量的命名规则同域/字段的命名规则一样。参见3.3节。3.6 保留字
保留字和指示符要全部小写。这有时有些混乱。例如:Integer是一个标识符,并且以首字母大写出现。而string保留字则全部小写。3.7 类型声明
所有类型名称声明以字母T开始,接下来和类的命名相同。4.0 空白用法
4.1 空白行
空白行可以通过将逻辑相关的代码段分组来提高可读性。一个空白行也可以在下列地方使用:
在版权注释块之后,包声明(package),导入段(import)。
类声明之间。
方法声明之间。
4.2 空格
Object Pascal是一种非常清晰易读的语言。通常,你不需要在代码里加入很多空格来分隔行。以下几条提供了一些原则该如何使用空格:
4.2.2 不应当使用空格:
在方法名和左括号之间;
在.(dot)操作符之前或之后;
在一元操作符和它的操作数之间;
在一个类型和被它强制转换的表达式之间;
在左括号之后和右括号之前;
在左方括号之后和右方括号之前;
在一个封号前;
例如:
//正确用法:
function TMyClass.MyFunc(var Value: Integer);
MyPointer := @MyRecord;
MyClass := TMyClass(MyPointer);
MyInteger := MyIntegerArray[5];
//错误用法:
function TMyClass.MyFunc( var Value: Integer ) ;
MyPointer := @ MyRecord;
MyClass := TMyClass ( MyPointer ) ;
MyInteger := MyIntegerArray [ 5 ] ;
4.3 缩进
你应当总是为所有的缩进层次缩进两个空格。换句话说就是,第一层缩进两个空格,第二层缩进四个空格,第三层缩进六个空格……。不要使用制表符Tab。
当然,仍然有少量的例外。保留字象unit, uses, type, interface, implementation, initialization 和finalization总是顶格的。单元的最后一个end标识符也是顶格的。在项目文件中,program和主begin、end也是顶格的。在主begin..end块内则需要缩进至少两个空格。4.4 续行
行应当限制在80列以内。超过80列的行应当被分成多个连续的行。所有的后续行应当排列在该声明的第一行之后,并且缩进两个字符的空格。
例如:
//正确:
function CreateWindowEx(dwExStyle: DWORD;
lpClassName: PChar; lpWindowName: PChar;
dwStyle: DWORD; X, Y, nWidth, nHeight: Integer;
hWndParent: HWND; hMenu: HMENU; hInstance: HINST;
lpParam: Pointer): HWND; stdcall;if ((X = Y) or (Y = X) or
(Z = P) or (F = J) then
begin
S := J;
end; 不要在参数和它的类型之间换行,除非列表是由逗号分隔,那样的话要在最后一个参数前换行,这样类型名就在下一行开头了。冒号和它的变量之间不应该有空格,而冒号和类型名之间要有一个空格。
//正确:
procedure Foo(Param1: Integer; Param2: Integer);//错误:
procedure Foo( Param :Integer; Param2:Integer); 一个后续行不应以一个二进制操作符开始。避免在通常不出现空白的地方割断一行,比如在方法名和它的左括号之间,或者在一个数组名和它的左方括号之间。如果你必须在上述情况下割断行,那么应当在左括号或左方括号之后换行。不要把begin放在其它代码的同一行。
例如:
//错误:
while (LongExpression1 or LongExpression2) do begin
//DoSomething
//DoSomethingElse;
end;//正确
while (LongExpression1 or longExpression2) do
begin
//DoSomething
//DoSomethingElse;
end;if (LongExpressiong1) or
(LongExpression2) or
(LongExpression3) then