2012-07-06 68 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访问该变量,但在这种情况下,您必须知道类类型的签名/声明。

要深入地回答您的问题,您应该知道为什么制定了可见性指标以及它们的用途是如何使用的。我想他们并不是为保护变量免遭盗窃保护而设计的,而仅仅是为了让程序员能够在类中执行管理性内部任务,并为这些类的用户施加某些处理。没有任何程序和组件将永远不会被破解。