我有一个小问题(求知欲),我注意到如果(表单的)控件被声明为私有并动态创建它,您可以使用 FindComponent 在类外部访问。
逻辑上正确吗?
我有一个小问题(求知欲),我注意到如果(表单的)控件被声明为私有并动态创建它,您可以使用 FindComponent 在类外部访问。
逻辑上正确吗?
FindComponent 根据其所有者和名称返回组件。它不使用私有变量,正如您通过尝试使用 FindComponent 完全没有任何类成员变量(改用局部变量)所看到的那样:它将继续工作。
关键字private
仅表示您不能引用该名称。如果提供了引用底层控件的其他方法,则关键字不会阻止这种情况。
发生这种情况是因为在创建控件时,它会将自己注册到其拥有组件的所有者列表中。因此有多个对控件的引用。
表单类中对控件的引用确实是私有的。但是对表单在其组件列表中保存的控件的引用是公开的。
从逻辑上讲,这与通过属性公开私有变量非常相似:
property MyPublicProp: TMyControl read FMyPrivateField;
尽管您不会像这样直接公开私有字段,但控件通过向拥有表单注册来间接公开。
合乎逻辑吗?好吧,私有变量在本单元之外的代码中是不可访问的,并且当您使用strict private
. 这就是私有可见性的全部含义。
当然,您可以通过使用FindComponent
或穿过该Components
物业来规避这种情况,而这可以通过不分配所有者来避免。(注意:当您设置了父级时,自动销毁不需要所有者)。但是你可以通过遍历Controls
父级的属性来规避这个问题。即使私有变量不是控件,而是说一个整数,您也可以通过hacks访问该变量,但在这种情况下,您必须知道类类型的签名/声明。
To answer you question in depth, one should know why the visibility indicators are made and how their usage was intended. I suppose they were not designed for keeping variables safe from theft protection, but merely as purpose for programmers to be able to do administrative internal tasks within classes and to impose certain handling for users of those classes. No program nor component will ever become hack-free.