首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 易混淆核心概念辨析:Owner vs Parent、Self vs Sender、ClientWidth vs Width

     編輯:Delphi

一、Owner(擁有者)vs Parent(父容器)

屬性OwnerParent
職責元件生命週期:建立/釋放、序列化 (DFM)視覺包含:座標系、剪裁、Tab 順序、顯示範圍
設計時指定Object Inspector → Owner (通常為 Form)拖放到容器內自動設定
執行時動態建立TButton.Create(Self) → Owner = FormButton.Parent := Panel1 → 顯示在 Panel1 內
釋放行為Owner.Free 會遞歸釋放所有 Owned 元件Parent.Free **不會** 自動釋放 Child (需手動或靠 Owner)

關鍵口訣:「Owner 管生死,Parent 管顯示」。

二、Self vs Sender

  • Self:編譯期綁定,指向「目前類別實例」。在 TForm1 方法中 Self = Form1;在 TMyButton 方法中 Self = 該按鈕實例。
  • Sender:執行期傳入,指向「觸發事件的元件」。同一事件處理器可服務多個元件,透過 if Sender = Button1 then ... 區分。
procedure TForm1.ButtonClick(Sender: TObject); // Button1、Button2 共用
begin
  if Sender = Button1 then
    Label1.Caption := '按下 Button1'
  else if Sender = Button2 then
    Label2.Caption := '按下 Button2';
end;

誤用示範:在獨立函數 (非方法) 中用 Self → 編譯錯誤;在事件中用 Self 當成觸發元件 → 邏輯錯誤。

三、ClientWidth/ClientHeight vs Width/Height

元件類型Width/HeightClientWidth/ClientHeight
一般控制項 (Button, Edit...)外框尺寸等於 Width/Height (無非客戶區)
TForm (有標題列/邊框)含標題列、邊框、捲軸的整體外部尺寸**客戶區**尺寸 (不含標題列/邊框),即可放置子控制項的區域
TForm (BorderStyle=bsNone)等於 ClientWidth/Height同上

動態建立控制項時,座標 Left/Top 相對於 **Parent 的 Client 區原點 (0,0)**。

總結速查表

  • 動態建立:Comp := TComp.Create(Owner); Comp.Parent := ParentControl;
  • 事件共用:用 Sender 判斷來源,用 Self 存取表單/類別成員。
  • 版面計算:用 ClientWidth/Height 排版子控制項,用 Width/Height 設定表單整體大小。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved