Delphi 初学者应小心的六大陷阱
作者:子夜编译 文章来源:天极网 点击数:210 更新时间:2007-8-16 10:22:55
初学 DelphiI 的人,由于各种原因,对 DelphiI 中的许多概念不能很好的理解,并由此 带来了许多的问题,或者是开发出的程序稳性不好,一会能运行,一会又不能运行;或者是 遇到一个问题久思不得其解,还误以为是
DelphiI 自身的 BUG,等等这些,浪费了我们大量 的时间、精力,也影响了我们的开发效率。 那么如何才能避免这些错误了, 尽量少走弯路了?笔者从事 DelphiI 开发多年, 下面就 把我的经验总结介绍给大家,希望帮助到初学 DelphiI 的朋友。 问题一:对类的概念理解不到位,程序开发中不能灵活运用。请看下面的程序:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, shellApi; type TForm1 = class(TForm) Button1: TButton; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses CommonUni;
在 DelphiI 中新建一个程序,然后添加一个按钮,就得到了下面这段程序。这应该是大 家相当熟悉的一段程序,可也就是这段程序,让许多的人在做开发很长时间后,还不能很好 理解。 该
程序可分为三个个部分:第一部分,单元头(从起始位置到 TYPE 之前);第二部 分(从 TYPE 到 END 的部分),定义了一个从 Tform 继承过来的窗体类,它包含一个 Tbuttt on 类型的成员。最后一部分(Var 到结束的部分),定义了一个 Tform1 类型的变量。问题 就出在这里了, 许多人误以为这最后一段也是窗体类的一部分, 在该窗体类中经常写出这样 的代码,Form1.caption = ’窗体标题’,导致程序运行时得不到所要的结果。其实最后一
部分根本就属于窗体类的定义,它们不过是在同一个 UNIT 中而已,所以代码应该这样写:s elf.caption = ’窗体标题’; 问题二:将释放对象的代码写在窗体的 CLOSE 事件中,导致 ACCESS Violation…的错 误。 一个窗体的关闭(CLOSE)与窗体的析构(Destory),在系统处理上是有区别的,当一 个窗体关闭时,窗体实际上只是隐藏起来了,它占用的资源并未从内存中释放了,我们还是 可访问到窗体中的数据;而当窗体响应 DESTORY 事件时,窗体不仅仅是隐藏起来了,而且占 用的系统资源也释放出来了。因此,如果一个窗体关闭后,我们还想访里面的对象,就应该 将这些对象的 FREE 代码写的窗体的(DESTORY)事件中。 问题三:不加区别地使用 String 与 shortString 数据类型。 String 类型与 shortString 类型是有区别的,在默认的情况下(取决于$H 开关),如 果你将一个变量定义为 string 类型, 那么会
被处理成一个 ANSIString 类型。 这种类型是动 态分配内存的,以 NULL 为结尾,最大长度为 4G,而 shortString 的最大长度是不能超过 2 55 个字符的。由于 ANSIstring 是生存期自管理类型的数据,这意昧着这种类型的数据需要 更多的
系统开销,所以在程序开发中,shortString 能满足要求的话,就尽量使用它,以提 高程序的运行速度。
问题四:进行数据类型转换时处理不当,犯错误最多的就是字符型到数字/浮点型的转 换。 当将一个字符型数据转换为整型时,我们经常这样写 I := StrToInt(aEdit.Text); 表面上看这一句,没有任何问题,函数的使用,格式的写法,都是正确的。可有一种情况我 们却没有考虑到, 如果用户在 aEdit 文本框中输入的不是数字文本的话, 会怎么样呢?调用 还会成功吗?显然是不会的,系统肯定会弹出一个英文的错误,让我们的用户不知所措的。 正确的写法是:I := StrToIntDef(aEdit.Text, 0); 这样当转换不成功时,第二个参数就 会赋给 I。类似的函数还有 strToInt64Def,StrToFloatDef 等等。 问