透過原始碼學習TComponent類的機制(1) (轉)
學習最好的方法是看DELPHI的VCL原始碼愛看他的機制本文就類TComponent的原始碼來看他的機制.
{ TComponent }
constructor TComponent.Create(AOwner: TComponent);
begin
FComponentStyle := [csInheritable];
if AOwner <> nil then AOwner.InsertComponent(Self);
end;
procedure TComponent.InsertComponent(AComponent: TComponent);
begin
AComponent.ValidateContainer(Self);
ValidateRename(AComponent, ', AComponent.FName);//看是否有重名的如果有則發異常
Insert(AComponent);//在自己的子列表里加入AComponent的引用
AComponent.SetReference(True);
if csDesigning in ComponentState then
AComponent.SetDesigning(True);
Notification(AComponent, opInsert);//給自己發一個通知訊息
end;
procedure TComponent.ValidateRename(AComponent: TComponent;
const CurName, NewName: string);
begin
if (AComponent <> nil) and not SameText(CurName, NewName) and
(AComponent.Owner = Self) and (FindComponent(NewName) <> nil) then
raise EComponentError.CreateRemt(@SDuplicateName, [NewName]);
if (csDesigning in ComponentState) and (Owner <> nil) then
Owner.ValidateRename(AComponent, CurName, NewName);//遞迴查是否有重名的元件
end;
procedure TComponent.ValidateContainer(AComponent: TComponent);
begin
AComponent.ValidateInsert(Self);
end;
procedure TComponent.ValidateInsert(AComponent: TComponent);
begin
end;
procedure TComponent.Insert(AComponent: TComponent);//我們可以看到他的子元件的引用是用TLIST來儲存的
begin
if FComponents = nil then FComponents := TList.Create;
FComponents.Add(AComponent);
AComponent.FOwner := Self;//給剛剛加上的主件賦上擁有者屬性
end;
destructor TComponent.Destroy; 以看到每一個元件都維護一個FFREENOTIFILES的列表
begin
Destroying;
if FFreeNotifies <> nil then
begin
while Assigned(FFreeNotifies) and (FFreeNotifies.Count > 0) do
TComponent(FFreeNotifies[FFreeNotifies.Count - 1]).Notification(Self, opRemove);
FreeAndNil(FFreeNotifies);//如果自己析構的時候,對自己FFREENOTIFILES裡面引用的物件呼叫Notification,把自己析構造的事件告訴他們
end;
DestroyComponents;
if FOwner <> nil then FOwner.RemoveComponent(Self);
inherited Destroy;
end;
procedure TComponent.FreeNotification(AComponent: TComponent);//透過這個過程可以證實FFREENOTIFILES是一個列表這個列表維護自己析構的時候給那些物件通知
begin
if (Owner = nil) or (AComponent.Owner <> Owner) then
begin
// Never acquire a reference to a component that is being deleted.
assert(not (csDestroying in (ComponentState + AComponent.ComponentState)));
if not Assigned(FFreeNotifies) then FFreeNotifies := TList.Create;
if FFreeNotifies.IndexOf(AComponent) < 0 then
begin
FFreeNotifies.Add(AComponent);
AComponent.FreeNotification(Self);
end;
end;
Include(FComponentState, csFreeNotification);
end;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-957817/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- React 原始碼學習(五):事件機制React原始碼事件
- 【spring原始碼學習】spring的事件釋出監聽機制原始碼解析Spring原始碼事件
- ATL中的Thunk機制學習 (轉)
- JVM學習(三)——類載入機制JVM
- 如何透過閱讀原始碼來學習優秀開源框架原始碼框架
- YYKit 原始碼學習使用 1原始碼
- 透過例子學習Lua(4)--函式的呼叫(轉)函式
- android原始碼學習-Handler機制及其六個核心點Android原始碼
- JVM類載入機制及雙親委派機制原始碼解讀JVM原始碼
- 對epoll機制的學習理解v1
- JVM學習筆記——類載入機制JVM筆記
- JVM學習-虛擬機器類載入機制JVM虛擬機
- 淺談 MFC 的子類化機制和該機制的一個應用(1) (轉)
- Android 原始碼分析之旅3 1 訊息機制原始碼分析Android原始碼
- 透過遊戲學習計算機架構 - embeddedartistry遊戲計算機架構Dart
- vue原始碼學習筆記1Vue原始碼筆記
- thinkphp3.2.3原始碼學習(1)PHP原始碼
- Java集合原始碼學習(1)介面Java原始碼
- Jdon原始碼學習……類CacheTimer的作用??原始碼
- 透過 Cucumber 學習 BDD
- 透過全新學習和推斷機制提升seq2seq 模型的語法改錯效能模型
- 透過例子學習Lua(5)--Lua與C的互動(轉)
- 通過原始碼學習ListView(大章)原始碼View
- 透過例子學習Lua(2)---Lua流程控制(轉)
- UiAutomator原始碼學習(1)-- UiDeviceUI原始碼IDEdev
- Windows記憶體機制解析(二)原始碼 (轉)Windows記憶體原始碼
- 通過WordCount解析Spark RDD內部原始碼機制Spark原始碼
- 通過分析 JDK 原始碼研究 Hash 儲存機制JDK原始碼
- 每天學習一點 JVM 之:類載入機制JVM
- CMultiFTP類原始碼 (轉)FTP原始碼
- 虛擬機器類載入機制_類載入的過程虛擬機
- 【Android原始碼】Handler 機制原始碼分析Android原始碼
- 【面試必備】透過原始碼角度一步一步帶你分析 ArrayList 擴容機制面試原始碼
- 透過例子學習Lua(3)----Lua資料結構(轉)資料結構
- 【原始碼學習】window 的刪除及更新過程原始碼
- Dubbo原始碼學習之-通過原始碼看看dubbo對netty的使用原始碼Netty
- 通過原始碼學習@functools.lru_cache原始碼
- TP5.1 原始碼窺探之類的自動載入機制原始碼