窗体的创建
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