Delphi初学者应小心的六大问题

开发 开发工具
初学Delphi的人,由于各种原因,对Delphi中的许多概念不能很好的理解,并由此带来了许多的问题,或者是开发出的程序稳性不好,或者是遇到一个问题久思不得其解,还误以为是Delphi自身的BUG,等等这些,浪费了我们大量的时间、精力,也影响了我们的开发效率。本文列举了Delphi初学者应小心的六大问题。

  本文是笔者结合自己多年Delphi开发经验,列举了Delphi初学者应小心的六大问题。

  问题一:对类的概念理解不到位,程序开发中不能灵活运用。请看下面的程序:

  1.  unit Unit1;   
  2.   interface  
  3.   uses   
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   
  5.   Dialogs, StdCtrls, shellApi;   
  6.   type   
  7.   TForm1 = class(TForm)   
  8.   Button1: TButton;   
  9.   private  
  10.   { Private declarations }   
  11.   public  
  12.   { Public declarations }   
  13.   end;   
  14.   var   
  15.   Form1: TForm1;   
  16.   implementation   
  17.   uses CommonUni;  

  在DelphiI中新建一个程序,然后添加一个按钮,就得到了下面这段程序。这应该是大家相当熟悉的一段程序,可也就是这段程序,让许多的人在做开发很长时间后,还不能很好理解。 该程序可分为三个个部分:第一部分,单元头(从起始位置到TYPE之前);第二部分(从TYPE到END的部分),定义了一个从Tform继承过来的窗体类,它包含一个Tbuttton类型的成员。最后一部分(Var到结束的部分),定义了一个Tform1类型的变量。问题就出在这里了,许多人误以为这最后一段也是窗体类的一部分,在该窗体类中经常写出这样的代码,Form1.caption = ’窗体标题’,导致程序运行时得不到所要的结果。其实最后一部分根本就属于窗体类的定义,它们不过是在同一个UNIT中而已,所以代码应该这样写:self.caption = ’窗体标题’;

  问题二:将释放对象的代码写在窗体的CLOSE事件中,导致Access Violation…的错误。

  一个窗体的关闭(CLOSE)与窗体的析构(Destory),在系统处理上是有区别的,当一个窗体关闭时,窗体实际上只是隐藏起来了,它占用的资源并未从内存中释放了,我们还是可访问到窗体中的数据;而当窗体响应DESTORY事件时,窗体不仅仅是隐藏起来了,而且占用的系统资源也释放出来了。因此,如果一个窗体关闭后,我们还想访里面的对象,就应该将这些对象的FREE代码写的窗体的(DESTORY)事件中。

  问题三:不加区别地使用String与shortString数据类型。

  String类型与shortString类型是有区别的,在默认的情况下(取决于$H开关),如果你将一个变量定义为string类型,那么会被处理成一个ANSIString类型。这种类型是动态分配内存的,以NULL为结尾,最大长度为4G,而shortString的最大长度是不能超过255个字符的。由于ANSIstring是生存期自管理类型的数据,这意昧着这种类型的数据需要更多的系统开销,所以在程序开发中,shortString能满足要求的话,就尽量使用它,以提高程序的运行速度。

  问题四:进行数据类型转换时处理不当,犯错误最多的就是字符型到数字/浮点型的转换。

  当将一个字符型数据转换为整型时,我们经常这样写 I := StrToInt(aEdit.Text); 表面上看这一句,没有任何问题,函数的使用,格式的写法,都是正确的。可有一种情况我们却没有考虑到,如果用户在aEdit文本框中输入的不是数字文本的话,会怎么样呢?调用还会成功吗?显然是不会的,系统肯定会弹出一个英文的错误,让我们的用户不知所措的。正确的写法是:I := StrToIntDef(aEdit.Text, 0); 这样当转换不成功时,第二个参数就会赋给I。类似的函数还有strToInt64Def,StrToFloatDef等等。

  问题五:单元引用的问题。使用那个函数,就一定要引用函数所在的单元。

  比如在程序开发中我们要用到一个API函数ExtractIconEx(从程序或是文件中获得一个图标),那么就一要在它的USES中把单元shellApi加入进来,否则是不能通过编译了。类似的情况还有很多,我们常常使用帮助文档,从中查找需要的函数,可当程序编译时,却通不过,为什么呢?就是因为没有在USES中引用函数所在的单元。这个问题初学者犯得最多,应该加倍注意。

  问题六:避免循环引用,尽可能通过第三个单元实现。如果确实不可避免,应在不同位置进行引用。所谓循环引用就是A单元引用了B单元,而反过来,B单元又引用了A单元,产生循环。我们还看上面的那一段程序,在interface的下面有一个USES语句,而在implementation的下面,又有一个USES语句。循环如果确实不可避免,那么就应该在将A单元中的引用写在第一个USES语句中,而将B单元中的引用写在第二个USES语句中。

  附言:以上只是笔者从事DelphiI开发多年,得出的一些经验。希望能够帮助初学DelphiI的朋友,尽量避免这些错误,少走弯路。

【编辑推荐】

  1. Delphi基础开发技巧
  2. Delphi编程读取txt文件数据
  3. 如何在Delphi中自动录入数据
  4. 基于Delphi的屏幕抓图技术的实现
  5. Delphi开发技术手册
责任编辑:韩亚珊 来源: 编程爱好者
相关推荐

2012-03-01 13:17:40

Java

2010-09-03 10:26:54

IT人

2010-07-02 11:17:47

绘制UML图

2011-07-11 17:45:13

java

2009-08-25 09:29:18

维护代码

2012-02-20 10:11:53

PhoneGap

2011-01-11 08:45:17

JavaScript

2010-04-13 11:36:01

2019-07-31 07:08:59

物联网企业IOT

2020-08-25 10:14:59

JavaScript开发 技巧

2011-09-16 09:38:19

Emacs

2022-04-24 15:21:01

MarkdownHTML

2013-02-20 10:13:38

JavaJava初学者

2010-10-18 09:30:55

2023-01-17 09:27:18

Python语言

2011-04-12 10:13:24

2009-12-24 17:26:00

ADO创建表

2011-01-04 16:05:31

开发技术

2019-09-02 08:12:49

物联网IOT技术

2011-07-04 14:14:54

java
点赞
收藏

51CTO技术栈公众号