解决方案 »

  1.   

    开发步骤
    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第四阶段,最好找开始做调研的人中的一两个负责测试的主要工作(当然,测试不可能
    只用一两个人,但这一两个人是总体把握什么是对的即符合用户要求的)既然测试,总会
    有些问题的,所以,此时,也应该留几个开发人员跟着,(这几个开发人员的水平可以平一
    一些,锻炼队伍嘛),有问题及时修改,没有问题,一起做测试
    其实在开发过程中,总会有一些不太协调的地方,所以,一个项目的成败,还必须有两点
    特别提出的,一是这个项目的负责人必须能够调动项目组中的每一项可利用资源(包括
    员和其它各方面的东西)二是项目客户必须有一个说话可以算数的人当对项目挂名负责
    真的,这两点真的很重要.
    说了这么多废话,不知有没有什么用处,真的,有些算是教训吧,有些可以算是不太成熟
    的经验,有没有用我实在也无从知道,因为才做过一两个比较大的项目而已 
      

  2.   

    1.规范简介
    本规范主要规定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
      

  3.   

    .4.4 数组类型
    数组类型的名字必须有意义并且类型的名字之前要加前缀‘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删除代码行
    删除代码行的前后用注释行说明。
    //修改人,修改时间,修改说明
    //
      

  4.   

    可以参考一下
    《delphi 5开发人员指南》
    http://www.ronggui.com/images/newimage/song.htm
      

  5.   

    已经发给你了,是PB、Delphi编码规范
      

  6.   

    谢谢各位,呵呵,分都不够了,这样吧,本贴分数给u2m(随波逐流,漂泊一生)和ilang(中雨),我另外开贴,请amiao(努力学习,天天向上) ,winder_008(风中追沙),doctor5(大夫) 来领分,每人100(说了就要算吗(:)
      

  7.   

    分别见:
    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
      

  8.   

    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字句,然后是其它的包含声明或别的指示符:
    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。在文件系统中,它作为这个文件的入口。
      

  9.   

    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标识符应当使用驼峰式格式,即每个标识符开头字母要大写,内嵌单词的首字母也要大写,只取首字母的缩写词也一样。
    MyIdentifier
    MyFTPClass
        对此规则主要的例外是头文件翻译的情况,应当遵循在原头文件中的命名习惯。例如:
        WM_LBUTTONDOWN,不要写成wm_LButtonDown.
     除了头文件翻译外,不要使用下划线分割单词。类名应当是名词或名词短语。接口或类的名称依赖于接口的显而易见的目的、用途。好的名字:
        AddressForm, ArrayIndexOutOfBoundsException
    低劣的名字:
        ManageLayout            //使用动词短语
        delphi_is_new_to_me     //使用下划线
      

  10.   

    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) 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