其他语言

位置:IT落伍者 >> 其他语言 >> 浏览文章

Delphi初学者应小心的六大陷阱


发布日期:2024年08月05日
 
Delphi初学者应小心的六大陷阱
初学DelphiI的人由于各种原因对DelphiI中的许多概念不能很好的理解并由此带来了许多的问题或者是开发出的程序稳性不好一会能运行一会又不能运行或者是遇到一个问题久思不得其解还误以为是DelphiI自身的BUG等等这些浪费了我们大量的时间精力也影响了我们的开发效率

那么如何才能避免这些错误了尽量少走弯路了?笔者从事DelphiI开发多年下面就把我的经验总结介绍给大家希望帮助到初学DelphiI的朋友

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

unit Unit;

interface

uses

Windows Messages SysUtils Variants Classes Graphics Controls Forms

Dialogs StdCtrls shellApi;

type

TForm = class(TForm)

Button: TButton;

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form: TForm;

implementation

uses CommonUni;

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

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

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

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

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

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

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

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

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

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

上一篇:基于Delphi的屏幕抓图技术的实现

下一篇:Delphi实现正弦曲线的绘制