Delphi窗体创建释放过程及单元文件小结

Delphi中的窗体,有模式窗体与非模式窗体两种。两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Show显示。当显示模式窗体的时候你是不能操作本程序的其他窗体的,你不能把焦点从模式窗体转到其他窗体上。而非模式窗体则没有这种限制,你可以从一个非模式窗体切换到另外一个非模式窗体上。两种窗体的区别仅仅在调用的方式上有区别。

窗体的创建:

当使用Delphi的IDE New一个窗体后,在Project1.dpr文件中,会出现一句Application.CreateForm(TForm2, Form2);意思是当程序启动的时候会创建TForm2类的Form2实例,也就是窗体2。这一过程是自动的,不管你是否调用显示Form2,Form2已经存在了,其OnCreate事件也已经触发了。这时候,如果你想显示Form2,那么可以显式调用Form2的Show或ShowModal方法,以非模式或模式显示窗体。

如果你不想随程序启动而创建窗体,而是动态的创建窗体,那么,你可以删除上面的那句代码,然后在程序中你想动态创建窗体的地方加上以下代码:

Application.CreateForm(TForm2, Form2);或者使用Form2 := TForm2.Create(Application);两者的主要区别在于,触发OnCreate事件的时候,第一种方法Form2变量已经指向了新生成的实例,外第二种方法先调用TForm2的Create方法,再给Form2这个变量赋值,在OnCreate时Form2变量还是未定义的。

窗体销毁:

有创建,就必须有销毁,不然的话会产生内存泄漏。对于程序自动生成的窗体,在程序结束的时候会自己释放,对于这种窗体,我不建议进行手动释放,除非你确定释放后绝对不会再用到这个窗体了,不然就会产生内存访问错误。对于动态生成的窗体,一旦不再使用,一定要手动释放资源,手动释放主要有两种方式,第一种是显示调用Form.Free这个方法。对于上面用的例子Form2来说:

Form2.Free;

Form2 := nil;

要将变量Form2赋值为nil,是为了防止此后的代码通过Form2变量访问已经被释放的TForm2实例。

另一种方法是在窗体的OnClose事件中将变量Action设置为caFree。

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);

begin

Action := caFree; // TCloseAction = (caNone, caHide, caFree, caMinimize);

Form2 := nil;

end;

这两种方法没有什么本质区别,可以根据实际情况来使用,但是一定不要忘记在释放资源后将变量指向空,不然很容易出现非法访问的情况。实际上在TForm2的FormClose中写Form2 := nil 是无用的,应该写在创建Form2的单元中,因为这两个Form2变量是不同的,TForm2所在单元的Form2变量是一个私有变量,别人是访问不到的,别人可以访问到的,也就是可能触发非法访问的是在TForm2所在单元外的Form2变量。

注:Delphi无论释放窗体还是其它什么变量,都是使用Free而不是Destroy方法,后者是内部调用的,在FormCreate或Free方法被调用时会自动调用到。

Delphi 单元文件结构

unitUnit1;

interface

{接口部分开始}

uses

{引用单元列表,这是可选的,如果包含必须紧跟interface关键字}

{接口部分声明常量/类型/变量/过程和函数,这些声明对引用单元就像自己的声明一样}

{在接口部分声明的过程和函数,就像使用了forward关键字}

{接口部分结束}

implementation

{实现部分}

uses

{如果包含uses字句,必须紧跟关键字implementation}

{在这里实现interface中定义的过程和函数,可以任意顺序的定义和调用.}

{在这里可以省略过程和函数的列表,如果包括,必须一样.}

{可以定义单元私有的常量/类型(包括类)/变量/过程和函数,但这些对引用单元的客户是不可见的}

{$R *.dfm}

{如果是对应窗体的单元文件,会有这句. $R 指令用于加载一个外部资源文件, 这里是指加载同名的窗体文件一起编译.}

initialization

{初始化部分}

{程序启动时先执行,并顺序执行}

{一个单元的初始化代码运行之前,就运行了它使用的每一个单元的初始化部分}

finalization

{结束化部分,程序结束时执行}

end.

Delphi窗体创建释放过程及单元文件小结(转)的更多相关文章

  1. Delphi 窗体的释放和判断窗体是否存在

    常规释放和关闭: Form.Free   -   释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值.   Form.Hide   -   隐藏Form.可以调用f ...

  2. 设置Delphi默认按utf8格式保存单元文件

    Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Embarcadero\BDS\19.0\Editor] " ...

  3. Delphi项目构成之单元文件PAS

    单元文件是Pascal源文件,扩展名为.pas. 有三种类型的单元文件: 窗体/数据模块和框架的单元文件(form/data module and frame units),一般由Delphi自动生成 ...

  4. Delphi窗体研究,留个爪,以后回来研究

    Delphi - 窗体创建过程   来自大富翁. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...

  5. Delphi中的窗体创建与销毁

    Delphi中的窗体,有模式窗体与非模式窗体两种.两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Show显示.当显示模式窗体的时候你是不能操作本程序的其他窗体的,你不能把焦 ...

  6. delphi基础篇之单元文件

    Delphi单元文件 unit MainFrm; {库单元文件头} interface        {接口部分由Interface开始implementation结束.声明引用的单元,常量,数据类型 ...

  7. Delphi在创建和使用DLL的时候如果使用到string,请引入ShareMem单元

    当使用了长字符串类型的参数.变量时,如string,要引用ShareMem. 虽然Delphi中的string功能很强大,但若是您编写的Dll文件要供其它编程语言调用时,最好使用PChar类型.如果您 ...

  8. Dll学习一_Dll 创建并动态引用窗体且释放窗体Demo

    1.新建Dll工程 2.Dll工程全部代码 library SubMain; { Important note about DLL memory management: ShareMem must b ...

  9. Delphi插件创建、调试与使用应用程序扩展

    Delphi插件创建.调试与使用应用程序扩展 翻译 : MiracleZ  有没有使用过Adobe Photoshop?如果用过,你就会对插件的概念比较熟悉.对外行人来说,插件仅仅是从外部提供给应用程 ...

随机推荐

  1. Chapter 7 Backup and Recovery 备份和恢复:

    Chapter 7 Backup and Recovery 备份和恢复: Table of Contents 7.1 Backup and Recovery Types 7.2 Database Ba ...

  2. BZOJ1674: [Usaco2005]Part Acquisition

    1674: [Usaco2005]Part Acquisition Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 259  Solved: 114[Sub ...

  3. sql优化(oracle)

    系统优化中很重要的方面是SQL语句的优化,对于海量数据,优质的SQL能够有效的提高系统的可用性. 总结的有点罗嗦,列个简单的目录啦~ 目录 第一部分知识准备                      ...

  4. Java高级特性之反射学习总结

    老规矩我们还是先提出几个问题,一门技术必然要能解决一定的问题,才有去学习掌握它的价值 一. 什么是反射? 二.反射能做什么? 一. 什么是反射? 用在Java身上指的是我们可以于运行时加载.探知.使用 ...

  5. N - 畅通工程再续 - hdu 1875

    Description 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题 ...

  6. ANT打包 小实例

    ANT打包 package src; public class Hello { /**   * @param args   */  public static void main(String[] a ...

  7. HTTP学习实验8-windows添加telnet功能

    Windows 添加telnet功能: 控制面板->(查看方式:小图标)->程序和功能->打开或关闭Windows功能->Telnet客户端 Telnet 设置: 打开cmd, ...

  8. 区分width()、css('width')、innerWidth()

    #widthTest1 { width: 200px; height: 200px; background-color: #00CCFF; -webkit-box-sizing: border-box ...

  9. Object -C NSNumber -- 笔记

    // //  main.m //  NSNumber // //  Created by facial on 24/8/15. //  Copyright (c) 2015 facial_huo. A ...

  10. Java中迭代列表中数据时几种循环写法的效率比较

    Java中经常会用到迭代列表数据的情况,本文针对几种常用的写法进行效率比较.虽然网上已经有了类似的文章,但是对他们的结论并不认同. 常见的实现方法: 1.for循环: for(int i = 0; i ...