zoukankan      html  css  js  c++  java
  • 一名Delphi程序员的开发习惯

     一名Delphi程序员的开发习惯

    有关开发习惯的一些想法,如鲠在喉,不吐不快。究其发贴动机,当然不排除有骗取参与分的可能,但另一方面,也希望能给同行(念Xing)者提供一些 建议,或者参考(希望不是误人子弟)。同时,也希望各位能够就我的这些陋习,发表一点看法,给出批评和指正的意见。谢谢。

    一.建立工程目录

           首先,第一步要做的,当然是给新项目建一个单独的目录(别笑)。目录名称与项目名称同名,或者另取一个也可,只要清楚、简练。然后,在此目录中创建以下各 个目录:

           <Doc>:用来存放该项目相关的开发文档(需求说明,概要设计,详细设计等等等等);

           <Source>:用来存放Delphi源程序中的”.Dpr”,”.Pas”,”.Dfm”等文件;

           <Dcu>:该目录中存放”.Dcu”文件,将’.Pas’与’.Dcu’文件分开存放只是为了让Source目录的内容更加清楚一些;

           <Bin>:存放工程的输出文件,比如”.Exe”,”.Dll”或者”.Ocx”等等;

           <Log>:用来存放日志文件;通常在这个目录中我会放一个”<项目名称>程序员日志.Txt”文件。

           <Images>:当然是存放工程中用到的图片的目录了。一般情况下,这个目录是少不了的。假如还用到其他资源,那么也一样建立各自的目录, 比如Wav,比如Avi等等。

    二.设置工程选项

          在Delphi中创建一个新的工程,将此工程保存到Source目录中,同时:

    a. 选一个耐看的,与项目有些联系的图标作为这个工程的图标。当然,这个图标可能只是临时用用的,但是总要比Delphi默认的那个难看的要好才行,要不然, 怎么对得起自己?

    b.将Project Options -> Directories/Conditionals页面中的Output Directory设置为Bin目录;

    c.将Unit output Directory设置为Dcu目录。

    三.添加常量单元

          添加一个新的Unit,另存为“unt<工程名> Consts.Pas”,用来保存工程中用到的常量。

    四.有关窗体(Form)及单元(Unit)

          按照匈牙利命名法则给Form命名,则一个用来登录的窗体可以命名为’FrmLogin’,而其单元名可以为’untLogin’。通常,两个对应的 Form和Unit的名称在除去’Frm’或’unt’的缩写后应当保持一致。

          在Unit的头部添加本单元的注释,注释的格式可以参照Delphi的源码,但是至少应当包含以下几项:功能描述;作者;版权;创建时间;最后修改时间; 修改历史等等。

          将新创建好的Form的Caption设置为该Form类的名称,而不是使用Delphi默认的。比如,将Form1更名为FrmLogin 后,此时我们获得了TFrmLogin这个新的窗体类,并且Delphi自动将窗体的Caption更新为'FrmLogin’。依我看,该 Caption应当为’TFrmLogin’才是,因为我们在设计的是一个窗体类TFrmLogin,而不是仅仅对FrmLogin进行操作。

          向TFrmLogin这样功能明确的窗体类,许多人都有在设计期就将其Caption设置为诸如“操作员登录”这种名称的习惯。我的习惯是,象“操作员登 录”这样的常量,通常存放在unt<工程名>Consts.Pas中,用ResourceString来定义,或者用Const 来定义。至于窗体的Caption的命名,应当属于运行期的工作。所以,我往往在TForm.OnCreate事件触发之时才对Caption进行操作, 比如:

    procedure TFrmLogin.FormCreate(Sender: TObject);
    begin 
           Caption := csLoginTitle; 
           ....
    end;

    五.关于Format函数的使用
           有iYear,iMonth,iDay三个数据,要显示诸如“生日:1976/3/18”这样的信息,你通常怎么做?使用s := ‘生日:’+IntToStr(iYear)+’.’+IntToStr(iMonth)+’.’+IntToStr(iDay); 吗?这样实在是太累了。我的习惯是,在unt<工程名>Consts.Pas中增加一个常量csBirthDayFormat = ‘生日:%d/%d/%d’来保存显示格式,然后使用s := Format(csBirthDayFormat, [iYear, iMonth, iDay]);这样的语句完成数据的拼装。这么做的好处显而易见,那就是你只需在一个地方维护数据的显示格式。
           Format函数功能强大,我对它很是推崇,你呢?
    六.关于注册表或者Ini文件的存储
          原先访问注册表我通常使用TRegistry,而访问Ini文件通常使用TIniFile。这两个类的使用方法各不相同,因此想要使用相同的代码既能访问 注册表又能访问Ini文件几乎是不可能的。真头疼啊!
          终于我发现了救星!那就是TRegistryIniFile类。查看Registry单元,我们发现,TRegistryIniFile继承自 TCusomIniFile。而TIniFile也是继承于TCusomIniFile。因此,使用抽象类TCusomIniFile来实现对注册表或者 Ini文件的访问便是一举两得了。比如:

    var
      csmInifile: TCusomIniFile;
    begin
      if blUseIniFile then//如果使用Ini文件
        csmInifile:= TIniFile.Create(csRootKey)
      else
        csmInifile:= TRegistryIniFile.Create(csRootKey);
      //接着就可以使用csmIniFile对Ini文件进行访问,
      //或者用类似访问Ini文件的方式访问注册表。

    七.关于TStream流以及TFileStream,TMemoryStream等等
           TFileStream和TMemoryStream都继承自抽象类TStream,这意味着我们可以使用一套代码完成对文件和内存的存取操作。因此,定 义一些接口的时候,我往往倾向于将参数的类型定义为抽象类,而不是具体类。比如,要完成保存功能的一个函数,定义成

    function Save(AStream: TStream): Boolean;
    就比定义成
    function Save(AStream: TFileStream): Boolean;


    要灵活的多。
    前一个定义是具有前瞻性的,因为它可以适用于以后可能出现的新型态的流。而后一个定义只适用于TFileStream 这种流(当然包括TFileStream的子类),呆板多了。
    我的习惯:如果存在抽象类,那么尽量将参数定义为抽象类的类型,毕竟,我们无法预见 未来。
    八.多使用TAction
           Delphi 4以后引入了Action的概念,并且在Standard组件栏中增加TActionList组件。使用Action的好处是,控件状态同步的烦恼从此一 扫而空!

  • 相关阅读:
    linux软件安装方式
    docker 安装 jenkins touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
    [ERR] Node goodsleep.vip:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    Linux 常用命令 服务器间scp 用户 export 创建文件、软连接
    redis 安装 集群 主从 哨兵 docker
    WPF密码框中禁止复制、粘贴
    Application 统计在线人数
    【转义字符】HTML 字符实体&lt; &gt: &amp;等
    SQL语句统计每天的数据
    正则表达式计算代码数
  • 原文地址:https://www.cnblogs.com/karkash/p/3491423.html
Copyright © 2011-2022 走看看