天天看點

html 判斷目前視窗是否是子視窗,Delphi 窗體的釋放和判斷窗體是否存在

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