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。。