可能的情况,每个资源分配应当与:try…finally结构匹配。例如,下面代码可能导致错误:
SomeClassl := TSomeClass.Create;
SomeClass2 := TSomeClass.Create; try
{do some code} finally
SomeClass1.Free; SomeClass2.Free; end;
上述资源分配的一个安全途径是:
SomeClass1 := TSomeClass.Create; try
SomeClass2 := TSomeClass.Create; try
{do some code} finally
SomeClass2.Free; end; finally
SomeClass1.Free; end;
2.10.3 try…except的用法
如果您希望在发生异常时执行一些任务,可以使用try…except。通常,没有必要为了简单地显示一个错误信息而使用try…except,因为Application对象能够自动根据上下文做到这一点。如果要在except子句中激活默认的异常处理,可以再次触发异常。
2.10.4 try…except…else的用法
不鼓励使用带else子句的try…except,因为这将阻塞所有的异常,包括您没有准备的异常。 2.11 类
2.11.1 命名与格式
类的名称应当表达出类的用途。类名前要加字母T,表示它是一个类型。例如: type
TCustomer = class(TObject);
类的实例名称与类名相同,只不过没有前缀T。 var
Customer: TCustomer;
注意:关于元件的命名,请参阅“元件类型命名标准”部分。
2.11.2 字段
■ 命名与格式
字段的命名遵循与变量相同的规则,只不过要加前缀F,表示这是字段。
■ 可见性
所有字段必须为私有。如果要在类的作用域之外访问字段,可借助于类的特性来实现。
2.11.3 方法
■ 命名与格式
方法的命名遵循与过程和函数相同的规则。
■ 静态方法
当您不希望一个方法被派生类重载时,应当使用静态方法。
■ 虚拟方法与动态方法
当您希望一个方法能被派生类重载,应当使用虚拟方法。如果类的方法要被多个派生类直接或间接地使用,
则应当用动态方法。例如,某一个类含有一个被频繁重载的方法,并有100个派生类,则应将方法定义为动态的,这样,可以减少内存的开销。
■ 抽象方法
如果一个类要创建实例,则不要使用抽象方法。抽象方法只能在那些从不创建实例的基类中使用。
■ 特性访问方法
所有特性访问方法应当定义在类的私有或保护部分。
特性访问方法遵循与过程和函数相同的规则。用于读的方法应当加Get前缀,用于写的方法应当加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;
2.11.4 特性
特性作为私有字段的访问器,遵循与字段相同的命名规则,只不过没有F前缀。
特性名应为名词,而不是动词。特性是数据,而方法是动作。
数组特性名应当是复数,而一般的特性应当是单数。
2.11.5 访问方法的使用
尽管不是必须,但还是建议您使用写访问方法来访问代表私有字段的特性。 3. 文件
3.1 项目文件
项目文件的名称应当具有描述意义。例如,“The Delphi 4 Developer?s Guide Bug Manager”的项目名称为DDGBugs.dpr,一个系统信息程序的名称为SysInfo.dpr。
3.2 Form文件
Form文件的名称应当表达出Form的用途,且具有Frm后缀。例如,About的文件名叫AboutFrm,主Form的文件名叫MainFrm。
3.3 数据模块文件
数据模块文件的名称应当表达出数据模块的作用,且具有DM后缀。例如,Customers数据模块的文件名叫CustomersDM.dfm。
3.4 远程数据模块文件
远程数据模块文件的名称应当表达出远程数据模块的用途。名称后要加RDM后缀。例如,Customers远程数据模块的文件叫CustomersRDM.dfm。
3.5 单元文件
3.5.1 普通单元的结构
■ 单元名
单元的名称应当有描述性。例如,应用程序的主Form单元叫MainFrm.pas。
■ Uses子句
Interface部分的Uses子句应当只包含该部分需要的单元。不要包含可能由Delphi自动添加的单元名。
Implementation部分的Uses子句应当只包含在该部分需要的单元,不要有多余的单元。
■ Interface部分
Interface部分应当只包含需要被外部单元访问的类型、变量、过程与函数的声明。而且,这些声明应当在Implementation部分之前。
■ Implementation部分
Implementation部分包括本单元私有的类型、变量、过程与函数的声明。
■ Initialization部分
不要在单元的Initialization部分放置花费时间很多的代码。否则,将导致应用程序启动时显得很慢。
■ Finalization部分
确保释放所有在Initialization部分中分配的资源。
3.5.2 Form单元
Form单元文件的名称与相应的Form名称相同。例如:About的单元名称叫AboutFrm.pas。主From的单元文件名称叫为MainFrm.pas。
3.5.3 数据模块单元
数据模块单元文件的名称与相应的数据模块名称相同。例如,Customers数据模单元的名称叫CustomersDM.pas。
3.5.4 通用的单元
通用单元的名称应当表达出它的用途。例如,一个实用工具单元的名称叫ugUtilities.pas,包含全局变量的单元名称叫CustomerGlobals.pas。
注意,一个项目中单元名称必须是唯一的。
3.5.5 元件单元
元件单元应放在单独的路径中,以区别于定义元件的单元。它们一般与项目不放在同一路径下。单元文件名称应表达出其内容。
注意,有关元件命名标准的更多信息,请参阅“自定义元件”部分。
3.6 文件头
所有源文件和项目文件都应具有文件头。一个正确的文件头应包含以下信息:
//////////////////////////////////////////////////////////////////////(80 chars)// 创建:Tujh010618 (创建信息:创建者、创建日期)
// 版权:迈特安 (版权)
// 功能: (本文件的主要功能)
// 函数: (主要函数和过程;可省)
//////////////////////////////////////////////////////////////////////
3.7 函数或过程头格式如下