2012-07-06 56 views

回答

4

發生這種情況是因爲在創建控件時,它將自己註冊到擁有組件的所有者列表中。因此有多個引用該控件。

對窗體類中控件的引用確實是私有的。但是表單在其組件列表中對控件的引用是公共的。

邏輯上,這是非常相似,通過屬性暴露私有變量:

property MyPublicProp: TMyControl read FMyPrivateField; 

雖然你不直接公開這樣的私人領域,控制與所屬形式登記,並因此間接影響。

+0

好吧,我知道,但是對於一個邏輯上僅僅是問題是否正確的私人對象可公開訪問? (我的問題是理論上的問題) – 2012-07-06 06:33:22

+0

我真的不明白你在這個評論中的問題。我已經解釋過,有多個對控件的引用。 – 2012-07-06 06:36:24

+0

因此,當我創建一個控件並分配一個父項,就像註冊它,然後重複以便每個人都可訪問... – 2012-07-06 06:42:30

4

FindComponent根據其所有者和名稱返回組件。它不使用私有變量,正如你所看到的,通過嘗試不使用任何類成員變量的FindComponent(而是使用本地變量):它將繼續工作。

關鍵字private只意味着您不能引用該名稱。如果提供了其他參考底層控件的方法,則關鍵字不會阻止該操作。

0

這是合乎邏輯的嗎?那麼,私人變量不能在本單元以外的代碼中訪問,並且在使用strict private時,不能在此類以外的代碼中訪問。這就是私人知名度的意義。

當然,您可以通過使用FindComponent或單步執行Components屬性來避開這種情況,這可以通過不分配所有者來防止。 (注意:當你設置一個父母的時候,自動銷燬不需要所有者)。但是,您可以通過逐步完成父項的Controls屬性來規避此問題。即使私有變量不是控件,而是說一個整數,您可以通過hacker訪問該變量,但在這種情況下,您必須知道類類型的簽名/聲明。

要深入地回答您的問題,您應該知道爲什麼制定了可見性指標以及它們的用途是如何使用的。我想他們並不是爲保護變量免遭盜竊保護而設計的,而僅僅是爲了讓程序員能夠在類中執行管理性內部任務,併爲這些類的用戶施加某些處理。沒有任何程序和組件將永遠不會被破解。

相關問題