1

常规释放和关闭:

Form.Free   -   释放Form占用的所有资源。Free后,Form指针不能再使用,除非对Form重新赋值。   
Form.Hide   -   隐藏Form。可以调用form.Show再一次显示。   
Form.close   -   关闭Form,实际的结果取决于OnCloseQuery和OnClose,如果OnCloseQuery的CanClose为False,不执行任何操作,如果为True,进一步考察OnClose的Action的值:   
  caNone:   不执行任何操作   
  caHide:   隐藏窗口,同form.Hide   
  caFree:   释放Form占用的资源,同form.Free   
  caMinimize:   Form最小化。

子窗体的释放:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree; //释放子窗体
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
Form1:=nil; //清空 释放窗体一定要用窗体的名称释放,不能用self:=nil 否则 Assigned 还是能找到
end;

另一个更高级的函数:

FreeAndNil(Form1);  //顾名思义,释放和清空两用。

2

判断窗体是否存在:

方法一:Assigned 函式在参数不为nil时返回True,表示指针已经指到某个内存地址,这个内存地址可能是一个对象地首地址,也可能在函数或过程中,声明一个指针变量,没有赋值为nil ,无乱的指向某处,这两个种情况,Assigned(指针变量)都不为nil ,  函数放回True;

而參數為nil時則傳回False。

Assigned 并不是一个真正的函数。

正确的用法:

if Assigned(Form1) then
begin
Form1.close;
Form1:=nil;
end; 或: if Assigned(Form1) then
begin
Form1.close;
FreeAndNil(Form1);
end;

  

方法二:FindWindow函数  用于获取一个打开的窗口的句柄

FindWindow (
  lpClassName,        {窗口的类名}   如果为空则写nil
  lpWindowName: PChar {窗口的标题}   如果标题为空则写nil
  ): HWND;              {返回窗口的句柄; 失败返回 0}

//找程序主窗口的句柄
var
  h: HWND;
begin
  h := FindWindow('TForm1', '窗体标题'); //知道窗口的类名和窗口的标题 ,为空则写nil
  ShowMessage(IntToStr(h)); {h = 656180; 这是随机, 每次启动窗口不一样}

还有一个扩展函数FindWindowEx

FindWindowEx获取指定窗口的某个子窗口的句柄
格式为:FindWindowEx(父窗口的句柄,子窗口的句柄,类名,标题)
注意:当子窗口的句柄为0的时候,获取的句柄是父窗口内符合类名和标题的第一个窗口的句柄,如果子窗口的句柄为某个子窗口的句柄,则获取到的句柄,是该子窗口的下一个窗口的句柄(这一点很重要哦)
这里所说的窗口并不一定是FORM,也可能是BUTTON,EDIT,LABEL。。

Delphi 窗体的释放和判断窗体是否存在的更多相关文章

  1. Delphi窗体创建释放过程及单元文件小结(转)

    Delphi窗体创建释放过程及单元文件小结 Delphi中的窗体,有模式窗体与非模式窗体两种.两种窗体的调用方式不同,模式窗体使用ShowModal显示,非模式窗体使用Show显示.当显示模式窗体的时 ...

  2. js判断窗体或容器滚动条到底部

    NO1---jquery判断窗体滚动条到底部 $(window).scroll(function () {if ($(window).scrollTop() >= $(document).hei ...

  3. [vb.net]判断窗体是否已打开

    1.使用OpenForms if my.Application.OpenForms.Item("FormName") isnot nothing then搜索 do somethi ...

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

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

  5. C#判断窗体是否存在重复打开

    foreach (Form f in Application.OpenForms) { f.Name //是打开窗体的Text //以下判断....... } Form2 F2 ; if(F2 == ...

  6. Delphi Form的释放和隐藏:free,hide,close

    form.Free   -   释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值.   form.Hide   -   隐藏Form.可以调用form.Show再 ...

  7. [转]Delphi Form的释放和隐藏:free,hide,close

    form.Free - 释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值. form.Hide - 隐藏Form.可以调用form.Show再一次显示. form ...

  8. 如何安全地跨窗体调用Timer控件 从一个窗体调用控制另外一个窗体的控件

    具体的情况是Form1中有一个Timer2时钟,Timer2时钟事件弹出Warning窗体,点击Warning窗体上面的按钮,重新激活一下Form1中的Timer2.从而实现了从一个窗体调用另外一个窗 ...

  9. [C#]使用Label标签控件模拟窗体标题的移动及窗体颜色不断变换

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...

随机推荐

  1. alter update

    ## sql alter update 添加.修改.删除字段 ## 添加列名alter table 表名 add 列名 列类型;alter table 表名 add 列名 列类型 not null d ...

  2. Python的历史及介绍

    Python的诞生 Python的创始人吉多·范罗苏姆(Guido van Rossum),在1989年12月的圣诞节期间,为了打发时间,决定开发一种新的脚本解释程序,作为ABC语言的继承. 现在,p ...

  3. Linux系统上安装MySQL 5.5prm

    http://www.cnblogs.com/sunson/articles/2172086.html

  4. 【Codeforces Beta Round #88 C】Cycle

    [Link]:http://codeforces.com/problemset/problem/117/C [Description] 问你一张图里面有没有一个三元环,有的话就输出. [Solutio ...

  5. 微信中location.reload失效

    var len = window.location.href.indexOf("?"); if(len>0){     window.location.href=window ...

  6. 【C#技术】一篇文章搞掂:LLBL

    公司代码速查 ParameterBase.CurrentUser.UserId ICustomerDeskDetailManager customerDeskDetailManager = Clien ...

  7. 杂项-笔记-VS:VS2019笔记

    ylbtech-杂项-笔记-VS:VS2019笔记 1.返回顶部 1. http://www.ddooo.com/softdown/142335.htm 2. 2.返回顶部   3.返回顶部   4. ...

  8. 谈谈-Android Studio 调试功能

    先编译好要调试的程序. 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可. 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试. IDE下方出现Debug视图,红色的箭头指 ...

  9. 与DSP通信时,RD&WR信号

      /////////////////////////////////////////////////////////// :] rd,wr; :] dsp_data_out; 'hzzzz; // ...

  10. CPUID读取有关Cache的信息

    1: void cpuidTest() 2: { 3: u32 val_eax, val_ebx, val_ecx, val_edx; 4: asm("cpuid" 5: : &q ...