zoukankan      html  css  js  c++  java
  • 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能满足要求的话,就尽量使用它,以提高程序的运行速度。
      
      问题四:进行数据类型转换时处理不当,犯错误最多的就是字符型到数字/浮点型的转换。
      
      当将一个字符型数据转换为整型时,我们经常这样写 := 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语句中。




  • 相关阅读:
    out/host/linuxx86/obj/EXECUTABLES/aapt_intermediates/aapt 64 32 操作系统
    linux 查看路由器 电脑主机 端口号 占用
    linux proc进程 pid stat statm status id 目录 解析 内存使用
    linux vim 设置大全详解
    ubuntu subclipse svn no libsvnjavahl1 in java.library.path no svnjavahl1 in java.library.path no s
    win7 安装 ubuntu 双系统 详解 easybcd 工具 不能进入 ubuntu 界面
    Atitit.json xml 序列化循环引用解决方案json
    Atitit.编程语言and 自然语言的比较and 编程语言未来的发展
    Atitit.跨语言  文件夹与文件的io操作集合  草案
    Atitit.atijson 类库的新特性设计与实现 v3 q31
  • 原文地址:https://www.cnblogs.com/feisky/p/1586458.html
Copyright © 2011-2022 走看看