窗体的创建

1,按需动态创建,如下图

  • 注意:这样声明依旧会有内存泄漏的风险,因为frmTest是全局变量。
  • 故应该尽量使用局部变量

2,在dproj文件中使用Application.Create(TFormTest, frmTest)

  • 这是Delphi在我们新建窗口时默认自动添加到dproj文件中的
  • 除了窗口数很少的项目,不推荐使用这种方法,因为它是初始化时就创建所有窗口,在窗口数很多的情况下耗时是很恐怖的
  • 这种方法创建的窗口只有当程序关闭时才会释放

窗体的销毁

  • 调用Destroy等方法
  • 在Form的关闭事件OnClose中设置,如下

Destroy和Free以及FreeAndNil、Release

  • Destroy:虚方法。直接销毁对象
  • Free:静态方法。判断指针是否为Nil,不为Nil则调用Destroy,安全性较高,但有产生野指针的风险
  • FreeAndNil:一般过程。先将指针重置为Nil,再释放该指针原来指向的对象所在内存
  • Release:TCustForm中的方法。等待资源不再使用后才通过Free来释放资源。

Delphi中的Property关键字

  • Property定义了类的属性,该属性的值通过Read后的字段或方法获取,并由Write后的字段或方法设置

  • 例:定义了一个属性MyData,它与私有属性FData相关,通过SetMyData赋值,通过GetMyData取值

  • 属性赋值时会调用Write关键字后的Setter方法,对输入值进行处理后才赋值

  • 读属性值时会自动调用Read关键字后的Getter方法,获取并返回处理后的数据

  • 属性没有被分配内存,所以也被称为‘虚拟字段’,因此不能作为引用参数传递给方法或对象

  • Read和Write可以单独出现,只有Read时该属性为只读属性,只有Write时该属性只能被修改不能获取值

Delphi中的构造器和析构器

构造器Constructor

  • 构造器关键字:constructor
  • 默认构造器名:Create
  • 构造器的作用:为类实例分配内存并初始化
  • 可以用Overload重载多个构造器,建议用Create作为构造器的名字,因为这能隐藏系统默认的构造器

析构器Destructor

  • 析构器关键字:destructor
  • 默认析构器:Destroy
  • 析构器的作用:释放类实例所占用的内存
  • 释放内存时应用Free或FreeAndNil方法,而不应该直接调用Destroy

类中方法的重写

  • 要求:该方法为虚拟方法,即用关键字Virtual标识

第一种方法:使用Inherited

  • 使用Inherited可以调用父类的方法
  • 在重写代码中使用Inherited实现

第二种方法:使用Override关键字标识

Delphi运行时库RTL

System单元

  • System单元是RTL的核心单元,会自动包含在所有编译过程中
  • 包含了TObject类、IInterface等接口、大部分数据类型、内存分配子例程、包和模块支持代码、线程支持等

    SysInit单元
    • System单元的伴随单元,包含了系统初始化代码,以及一些很少使用的函数
    SysConst单元
    • 定义了用于其它单元显示消息的常量字符串,用ResourceString定义
    SysUtils单元
    • 包括不同类型系统公用的函数,如IntToStr等
    数学单元Math
    • 包含用于数学计算的大部分函数

    三值逻辑函数IfThen:例: I := IfThen(NumA > NumB, NumA, NumB);与Java中的 Flag? A:B类似
    RandomRange: 从一个范围中随机取一个数
    RandomFrom: 从一个数组中随机取一个值
    EnsureRange(Num, Min, Max): 使整型数值处于指定范围内,如果超出范围则使其值变为该范围的上限或下限
    VarEnsureRange..:同上,但可以是其它有序类型的数值

    日期单元DateUtils
    字符串函数单元StrUtils
    Types
    • 保存多个操作系统公用的数据类型,如TPoint、TRect等

TOBject类

  • Delphi中的唯一的根类,System单元中的核心类,所有类都直接或间接地继承自它
  • 可以接受任意类型的对象,但使用该对象自定义的方法时需要强制向下转型
  • 通过类引用可以在运行时动态改变对象
  • 重要属性:

Create、Destroy、Free
ClassName: 返回该对象的类名
ClassNameIs(sName):判断该对象的类名是否与sName相同
ClassType: 返回该对象的类引用
ClassParent: 返回该对象父类的类引用
InheritFrom(TClass):该对象是否继承自指定类

其它内容

  • 判断指针P是否为Nil: Assigned(P),P为nil则返回False,否则返回True