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

初学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继承过来的窗体类,它包含一个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语句中。

时间: 2024-09-17 04:49:41

Delphi初学者应小心的六大陷阱的相关文章

揭秘“婚庆加盟”六大陷阱

一些创业者认为,干婚庆投入小,技术含量低,容易入门,从而纷纷加入.他们希望通过加盟的方式,迅速建立婚庆公司以赚"喜"钱.这使得一些打着"婚庆加盟"幌子的黑心公司嗅到了商机,却让不少人血本无归. 陷阱一: 假加盟,真卖产品 现象:这些人打出"免收加盟费"的口号,本身没有做过几场婚礼,也无实际操作经验,却从其他渠道弄来婚礼资料,打着"婚庆加盟"的旗号卖产品.一旦"圈钱"后,便逃之夭夭. 对策:"特许经

MySQL中处理空值时要小心两个陷阱

  MySQL数据库是一个基于结构化数据的开源数据库.SQL语句是MySQL数据库中核心语言.不过在MySQL数据库中执行SQL语句,需要小心两个陷阱. 陷阱一:空值不一定为空 空值是一个比较特殊的字段.在MySQL数据库中,在不同的情形下,空值往往代表不同的含义.这是MySQL数据库的一种特性.如在普通的字段中(字符型的数据),空值就是表示空值.但是如果将一个空值的数据插入到TimesTamp类型的字段中,空值就不一定为空.此时为出现什么情况呢(如下图)? 我先创建了一个表.在这个表中有两个字

Delphi接口编程的两大陷阱

陷阱一.接口的类型转换陷阱 a) 不能把一个对象引用强制转换成这个引用的类型没有声明实现的接口,即使这个对象实际实现了这个接口(呵呵,优点拗口). b) 当把一个对象变量赋给一个接口变量,在把这个接口变量赋还给对象变量时,这个对象变量的地址已经变了,也就是不再是原来的对象了,而是指向一个错误的地址. 例如: I1 = interfacefunction Do: Boolean;end;TC1 = ClassATT1: Integer;end;TC2 = Class(TC1, I1)ATT2: I

初学者应该了解的编程陷阱:javascript篇

对于初学编程语言的朋友来说,经常会犯一些比较"经典"的错误.在这一系列文章中,我们将介绍如何让初学编程的朋友避免一些基本的错误,并且了解如何正确的编程和开发代码. 这一篇文章中,我们介绍5个javascript代码开发中需要注意的问题和技巧. 冗余的DOM操作 DOM操作众所周知是比较重量级的.有效的限制交互可以大大的帮助你提高你的代码的性能.看看下面这段代码: // anti-pattern for (var i = 0; i < 100; i++){ var li = $(&

传统企业和互联网公司不存在差别,而互联网公司应小心被传统企业颠覆

百度 联盟峰会在黄山举行. 欢聚时代 CEO 李学凌 在会上表示,传统企业或将颠覆互联网公司,而未来十年互联网公司或将消失,传统企业和互联网公司不存在差别,而互联网公司应小心被传统企业颠覆. 李学凌的演讲主题为"颠覆的力量",他主要讲述欢聚时代如何顺势而为,试图解决教育产业资源分配不均的问题.此外,他认为二三线小城市师资力量差,有更大的需求,欢聚时代将更加致力于解决国内教育分配不平等的问题. 同时,他提出"互联网公司更应该小心被传统企业颠覆"的观点.他认为很多上市公

网站优化之url设计应遵循的六大原则

UEO这个词相信大家也不陌生,中文意思就是用户体验.现在很多网站都注重用户体验,毕竟我们做网站最终是服务于用户,所以我们在网站设计和优化时也要考虑用户体验.用户体验的范围很广,这里主要讲述从用户体验的角度来分析网站的url设计,简单的说,url应该清晰友好,方便记忆.那么我们在网站建设中应该如何去设计url呢?下面就由笔者来讲述url设计的八大原则. 一.url月简洁越好 我们举个例子来说,假如你看到了一个非常长的url,给你的第一感觉是怎样的?同样,我们的用户面对着冗长的url地址,肯定也会产

网站运营应具备的六大能力

中介交易 SEO诊断 淘宝客 云主机 技术大厅 网站运营是一个庞大的工程,里面包所含的东西很多,或许,在大多数人眼里,网站运营就是简单地理解为网站推广吧,实际上不是这么单一,网站运营主要是指网络营销体系中的一种,包括网站流量监控分析,目标用户行为分析,以及日常的内容更新等等工作,总之与营销体系中一切与网站有关的都属于网站运营范畴. 那么一个优秀的网站运营经理需要具备哪些能力方能胜任呢?笔者做为福牌阿胶的网站运营者觉得,以下的六种能力必不可少,下面我们就来分析一下这六大能力: 一:分析与定位能力

盘点近年留学预警慧眼识别六大陷阱

陷阱一: "野鸡学校"冒充名校 第二次留学预警指出:在西方教育比较发达的国家,资质较好的学校包括私立学校都很看重声誉和质量,学生入学要求相当严格,学生往往需要参加多种科目的入学考试,录取难度大,绝不是有钱就可以上的. 某些中介虚假介绍学校情况,声称只要上了所谓"预科班",就不再需要考试就可以轻松进大学.有的中介采取"偷梁换柱"的方法,把只有几间房子.几个教师的"小作坊",几人合办的随时会因生源不足而关门倒闭的"野鸡学

JavaScript初学者:JavaScript初学者应注意的七个细节

  每种语言都有它特别的地方,对于JavaScript来说,使用var就可以声明任意类型的变量,这门脚本语言看起来很简单,然而想要写出优雅的代码却是需要不断积累经验的.本文利列举了JavaScript初学者应该注意的七个细节,与大家分享.(1)简化代码JavaScript定义对象和数组非常简单,我们想要创建一个对象,一般是这样写的:    1 var car = new Object(); 2 car.colour = 'red'; 3 car.wheels = 4; 4 car.hubcaps