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.HidecaFree: 釋放Form占用的資源,同form.FreecaMinimize: 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。。
原文:https://www.cnblogs.com/guorongtao/p/11307709.html