发表于:2009/8/7 17:41:35
#0楼
有关开发习惯的一些想法,如鲠在喉,不吐不快。究其发贴动机,当然不排除有骗取参与分的可能,但另一方面,也希望能给同行(念xing)者提供一些建议,或者参考(希望不是误人子弟)。同时,也希望各位能够就我的这些陋习,发表一点看法,给出批评和指正的意见。谢谢。
一.建立工程目录
首先,第一步要做的,当然是给新项目建一个单独的目录(别笑)。目录名称与项目名称同名,或者另取一个也可,只要清楚、简练。然后,在此目录中创建以下各个目录: [separator]
doc:用来存放该项目相关的开发文档(需求说明,概要设计,详细设计等等等等);
source:用来存放delphi源程序中的”.dpr”,”.pas”,”.dfm”等文件;
dcu:该目录中存放”.dcu”文件,将’.pas’与’.dcu’文件分开存放只是为了让source目录的内容更加清楚一些;
bin:存放工程的输出文件,比如”.exe”,”.dll”或者”.ocx”等等;
log:用来存放日志文件;通常在这个目录中我会放一个”程序员日志.txt”文件。
images:当然是存放工程中用到的图片的目录了。一般情况下,这个目录是少不了的。假如还用到其他资源,那么也一样建立各自的目录,比如wav,比如avi等等。//博主个人以为,images 放在 bin 下面更合理!
二.设置工程选项
在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: ulogin, form: login,而且最好把各窗体单元中的全局窗体变量定义语句删除,在需要用到的地方定义它,或者有时根本无须定义窗体变量,如: tlogin.create(nil).showmodal;
在unit的头部添加本单元的注释,注释的格式可以参照delphi的源码,但是至少应当包含以下几项:功能描述;作者;版权;创建时间;最后修改时间;修改历史等等。
将新创建好的form的caption设置为该form类的名称,而不是使用delphi默认的。比如,将form1更名为frmlogin后,此时我们获得了tfrmlogin这个新的窗体类,并且delphi自动将窗体的caption更新为frmlogin’。依我看,该caption应当为’tfrmlogin’才是,因为我们在设计的是一个窗体类tfrmlogin,而不是仅仅对frmlogin进行操作。
//个人感觉这个好像有点校枉过正了
向tfrmlogin这样功能明确的窗体类,许多人都有在设计期就将其caption设置为诸如“操作员登录”这种名称的习惯。我的习惯是,象“操作员登录”这样的常量,通常存放在untconsts.pas中,用resourcestring来定义,或者用const来定义。至于窗体的caption的命名,应当属于运行期的工作。所以,我往往在tform.oncreate事件触发之时才对caption进行操作,比如:
[codes=delphi]procedure tfrmlogin.formcreate(sender: tobject);
begin
caption := cslogintitle;
....
end;[/codes]
五.关于format函数的使用
有iyear,imonth,iday三个数据,要显示诸如“生日:1976/3/18”这样的信息,你通常怎么做?使用[codes=delphi]s := ‘生日:’+inttostr(iyear)+’.’+inttostr(imonth)+’.’+inttostr(iday); [/codes]吗?这样实在是太累了。我的习惯是,在untconsts.pas中增加一个常量[codes=delphi]csbirthdayformat = ‘生日:%d/%d/%d’[/codes]来保存显示格式,然后使用[codes=delphi]s := format(csbirthdayformat, [iyear, imonth, iday]);[/codes]这样的语句完成数据的拼装。这么做的好处显而易见,那就是你只需在一个地方维护数据的显示格式。
format函数功能强大,我对它很是推崇,你呢?
六.关于注册表或者ini文件的存储
原先访问注册表我通常使用tregistry,而访问ini文件通常使用tinifile。这两个类的使用方法各不相同,因此想要使用相同的代码既能访问注册表又能访问ini文件几乎是不可能的。真头疼啊!
终于我发现了救星!那就是tregistryinifile类。查看registry单元,我们发现,tregistryinifile继承自tcusominifile。而tinifile也是继承于tcusominifile。因此,使用抽象类tcusominifile来实现对注册表或者ini文件的访问便是一举两得了。比如:
[codes=delphi]var
csminifile: tcusominifile;
begin
if bluseinifile then//如果使用ini文件
csminifile:= tinifile.create(csrootkey)
else
csminifile:= tregistryinifile.create(csrootkey);
//接着就可以使用csminifile对ini文件进行访问,
//或者用类似访问ini文件的方式访问注册表。
[/codes]
七.关于tstream流以及tfilestream,tmemorystream等等
tfilestream和tmemorystream都继承自抽象类tstream,这意味着我们可以使用一套代码完成对文件和内存的存取操作。因此,定义一些接口的时候,我往往倾向于将参数的类型定义为抽象类,而不是具体类。比如,要完成保存功能的一个函数,定义成
[codes=delphi]function save(astream: tstream): boolean;[/codes]
就比定义成
[codes=delphi]function save(astream: tfilestream): boolean;[/codes]
要灵活的多。
前一个定义是具有前瞻性的,因为它可以适用于以后可能出现的新型态的流。而后一个定义只适用于tfilestream这种流(当然包括tfilestream的子类),呆板多了。
我的习惯:如果存在抽象类,那么尽量将参数定义为抽象类的类型,毕竟,我们无法预见未来。
八.多使用taction
delphi 4以后引入了action的概念,并且在standard组件栏中增加tactionlist组件。使用action的好处是,控件状态同步的烦恼从此一扫而空!
<
<
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=96473&Name=mahuaqiang
一.建立工程目录
首先,第一步要做的,当然是给新项目建一个单独的目录(别笑)。目录名称与项目名称同名,或者另取一个也可,只要清楚、简练。然后,在此目录中创建以下各个目录: [separator]
doc:用来存放该项目相关的开发文档(需求说明,概要设计,详细设计等等等等);
source:用来存放delphi源程序中的”.dpr”,”.pas”,”.dfm”等文件;
dcu:该目录中存放”.dcu”文件,将’.pas’与’.dcu’文件分开存放只是为了让source目录的内容更加清楚一些;
bin:存放工程的输出文件,比如”.exe”,”.dll”或者”.ocx”等等;
log:用来存放日志文件;通常在这个目录中我会放一个”程序员日志.txt”文件。
images:当然是存放工程中用到的图片的目录了。一般情况下,这个目录是少不了的。假如还用到其他资源,那么也一样建立各自的目录,比如wav,比如avi等等。//博主个人以为,images 放在 bin 下面更合理!
二.设置工程选项
在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: ulogin, form: login,而且最好把各窗体单元中的全局窗体变量定义语句删除,在需要用到的地方定义它,或者有时根本无须定义窗体变量,如: tlogin.create(nil).showmodal;
在unit的头部添加本单元的注释,注释的格式可以参照delphi的源码,但是至少应当包含以下几项:功能描述;作者;版权;创建时间;最后修改时间;修改历史等等。
将新创建好的form的caption设置为该form类的名称,而不是使用delphi默认的。比如,将form1更名为frmlogin后,此时我们获得了tfrmlogin这个新的窗体类,并且delphi自动将窗体的caption更新为frmlogin’。依我看,该caption应当为’tfrmlogin’才是,因为我们在设计的是一个窗体类tfrmlogin,而不是仅仅对frmlogin进行操作。
//个人感觉这个好像有点校枉过正了
向tfrmlogin这样功能明确的窗体类,许多人都有在设计期就将其caption设置为诸如“操作员登录”这种名称的习惯。我的习惯是,象“操作员登录”这样的常量,通常存放在untconsts.pas中,用resourcestring来定义,或者用const来定义。至于窗体的caption的命名,应当属于运行期的工作。所以,我往往在tform.oncreate事件触发之时才对caption进行操作,比如:
[codes=delphi]procedure tfrmlogin.formcreate(sender: tobject);
begin
caption := cslogintitle;
....
end;[/codes]
五.关于format函数的使用
有iyear,imonth,iday三个数据,要显示诸如“生日:1976/3/18”这样的信息,你通常怎么做?使用[codes=delphi]s := ‘生日:’+inttostr(iyear)+’.’+inttostr(imonth)+’.’+inttostr(iday); [/codes]吗?这样实在是太累了。我的习惯是,在untconsts.pas中增加一个常量[codes=delphi]csbirthdayformat = ‘生日:%d/%d/%d’[/codes]来保存显示格式,然后使用[codes=delphi]s := format(csbirthdayformat, [iyear, imonth, iday]);[/codes]这样的语句完成数据的拼装。这么做的好处显而易见,那就是你只需在一个地方维护数据的显示格式。
format函数功能强大,我对它很是推崇,你呢?
六.关于注册表或者ini文件的存储
原先访问注册表我通常使用tregistry,而访问ini文件通常使用tinifile。这两个类的使用方法各不相同,因此想要使用相同的代码既能访问注册表又能访问ini文件几乎是不可能的。真头疼啊!
终于我发现了救星!那就是tregistryinifile类。查看registry单元,我们发现,tregistryinifile继承自tcusominifile。而tinifile也是继承于tcusominifile。因此,使用抽象类tcusominifile来实现对注册表或者ini文件的访问便是一举两得了。比如:
[codes=delphi]var
csminifile: tcusominifile;
begin
if bluseinifile then//如果使用ini文件
csminifile:= tinifile.create(csrootkey)
else
csminifile:= tregistryinifile.create(csrootkey);
//接着就可以使用csminifile对ini文件进行访问,
//或者用类似访问ini文件的方式访问注册表。
[/codes]
七.关于tstream流以及tfilestream,tmemorystream等等
tfilestream和tmemorystream都继承自抽象类tstream,这意味着我们可以使用一套代码完成对文件和内存的存取操作。因此,定义一些接口的时候,我往往倾向于将参数的类型定义为抽象类,而不是具体类。比如,要完成保存功能的一个函数,定义成
[codes=delphi]function save(astream: tstream): boolean;[/codes]
就比定义成
[codes=delphi]function save(astream: tfilestream): boolean;[/codes]
要灵活的多。
前一个定义是具有前瞻性的,因为它可以适用于以后可能出现的新型态的流。而后一个定义只适用于tfilestream这种流(当然包括tfilestream的子类),呆板多了。
我的习惯:如果存在抽象类,那么尽量将参数定义为抽象类的类型,毕竟,我们无法预见未来。
八.多使用taction
delphi 4以后引入了action的概念,并且在standard组件栏中增加tactionlist组件。使用action的好处是,控件状态同步的烦恼从此一扫而空!
<
<
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=96473&Name=mahuaqiang