我有一個小問題(智力好奇心),我注意到如果一個控件(表單)被聲明爲私有的,並且創建它,你可以使用FindComponent在類之外訪問。FindComponent是否會找到聲明爲private的東西是正確的?
它在邏輯上是正確的嗎?
我有一個小問題(智力好奇心),我注意到如果一個控件(表單)被聲明爲私有的,並且創建它,你可以使用FindComponent在類之外訪問。FindComponent是否會找到聲明爲private的東西是正確的?
它在邏輯上是正確的嗎?
發生這種情況是因爲在創建控件時,它將自己註冊到擁有組件的所有者列表中。因此有多個引用該控件。
對窗體類中控件的引用確實是私有的。但是表單在其組件列表中對控件的引用是公共的。
邏輯上,這是非常相似,通過屬性暴露私有變量:
property MyPublicProp: TMyControl read FMyPrivateField;
雖然你不直接公開這樣的私人領域,控制與所屬形式登記,並因此間接影響。
FindComponent根據其所有者和名稱返回組件。它不使用私有變量,正如你所看到的,通過嘗試不使用任何類成員變量的FindComponent(而是使用本地變量):它將繼續工作。
關鍵字private
只意味着您不能引用該名稱。如果提供了其他參考底層控件的方法,則關鍵字不會阻止該操作。
這是合乎邏輯的嗎?那麼,私人變量不能在本單元以外的代碼中訪問,並且在使用strict private
時,不能在此類以外的代碼中訪問。這就是私人知名度的意義。
當然,您可以通過使用FindComponent
或單步執行Components
屬性來避開這種情況,這可以通過不分配所有者來防止。 (注意:當你設置一個父母的時候,自動銷燬不需要所有者)。但是,您可以通過逐步完成父項的Controls
屬性來規避此問題。即使私有變量不是控件,而是說一個整數,您可以通過hacker訪問該變量,但在這種情況下,您必須知道類類型的簽名/聲明。
要深入地回答您的問題,您應該知道爲什麼制定了可見性指標以及它們的用途是如何使用的。我想他們並不是爲保護變量免遭盜竊保護而設計的,而僅僅是爲了讓程序員能夠在類中執行管理性內部任務,併爲這些類的用戶施加某些處理。沒有任何程序和組件將永遠不會被破解。
好吧,我知道,但是對於一個邏輯上僅僅是問題是否正確的私人對象可公開訪問? (我的問題是理論上的問題) – 2012-07-06 06:33:22
我真的不明白你在這個評論中的問題。我已經解釋過,有多個對控件的引用。 – 2012-07-06 06:36:24
因此,當我創建一個控件並分配一個父項,就像註冊它,然後重複以便每個人都可訪問... – 2012-07-06 06:42:30