Delphi FindComponent甚至会发现声明为私有的东西,这对吗?

Delphi FindComponent甚至会发现声明为私有的东西,这对吗?,delphi,private-members,Delphi,Private Members,我有一个小问题(智力上的好奇心),我注意到如果一个控件(表单)被声明为私有并以友好方式创建它,那么您可以使用FindComponent在类外进行访问 逻辑正确吗?FindComponent根据组件的所有者和名称返回组件。它不使用私有变量,您可以通过尝试在没有任何类成员变量的情况下使用FindComponent(改用局部变量)看到这一点:它将继续工作 关键字private仅表示您不能引用该名称。如果提供了引用基础控件的其他方法,则关键字不会阻止这种情况。FindComponent根据组件的所有者和

我有一个小问题(智力上的好奇心),我注意到如果一个控件(表单)被声明为私有并以友好方式创建它,那么您可以使用FindComponent在类外进行访问


逻辑正确吗?

FindComponent根据组件的所有者和名称返回组件。它不使用私有变量,您可以通过尝试在没有任何类成员变量的情况下使用FindComponent(改用局部变量)看到这一点:它将继续工作


关键字
private
仅表示您不能引用该名称。如果提供了引用基础控件的其他方法,则关键字不会阻止这种情况。

FindComponent根据组件的所有者和名称返回组件。它不使用私有变量,您可以通过尝试在没有任何类成员变量的情况下使用FindComponent(改用局部变量)看到这一点:它将继续工作


关键字
private
仅表示您不能引用该名称。如果提供了引用基础控件的其他方法,则关键字不会阻止这种情况。

发生这种情况是因为当创建控件时,它会将自己注册到其所有者所属组件列表中。因此有多个对控件的引用

表单类中对控件的引用实际上是私有的。但是对窗体在其组件列表中保存的控件的引用是公共的

从逻辑上讲,这与通过属性公开私有变量非常相似:

property MyPublicProp: TMyControl read FMyPrivateField;

尽管您不会像这样直接公开私有字段,但控件通过向所有者表单注册来间接公开私有字段。

这是因为当创建控件时,它会将自己注册到所有者所属组件列表中。因此有多个对控件的引用

表单类中对控件的引用实际上是私有的。但是对窗体在其组件列表中保存的控件的引用是公共的

从逻辑上讲,这与通过属性公开私有变量非常相似:

property MyPublicProp: TMyControl read FMyPrivateField;

虽然您没有像这样直接公开私有字段,但控件通过向所属表单注册来间接地公开私有字段。

是否符合逻辑?好的,私有变量在这个单元之外的代码中是不可访问的,当您使用
strict private
时,在这个类之外的代码中也是不可访问的。这就是私人可见性的全部含义

当然,您可以通过使用
FindComponent
或单步执行
Components
属性来避免这种情况,这可以通过不指定所有者来防止。(注意:如果设置了父级,则自动销毁不需要所有者)。但是,您可以通过单步执行父对象的
控件
属性绕过That。即使私有变量不是一个控件,而是一个整数,您也可以通过hacks访问该变量,尽管在这种情况下,您必须知道类类型的签名/声明


要深入回答您的问题,您应该知道为什么要制作可见性指示器,以及它们的用途。我想它们不是为了保护变量不受盗窃保护而设计的,只是为了让程序员能够在类中执行内部管理任务,并对这些类的用户施加一定的处理。没有一个程序或组件是不会被黑客攻击的。

这合乎逻辑吗?好的,私有变量在这个单元之外的代码中是不可访问的,当您使用
strict private
时,在这个类之外的代码中也是不可访问的。这就是私人可见性的全部含义

当然,您可以通过使用
FindComponent
或单步执行
Components
属性来避免这种情况,这可以通过不指定所有者来防止。(注意:如果设置了父级,则自动销毁不需要所有者)。但是,您可以通过单步执行父对象的
控件
属性绕过That。即使私有变量不是一个控件,而是一个整数,您也可以通过hacks访问该变量,尽管在这种情况下,您必须知道类类型的签名/声明


要深入回答您的问题,您应该知道为什么要制作可见性指示器,以及它们的用途。我想它们不是为了保护变量不受盗窃保护而设计的,只是为了让程序员能够在类中执行内部管理任务,并对这些类的用户施加一定的处理。没有一个程序或组件是不会被黑客攻击的。

好吧,我知道,但从逻辑上来说,一个私有对象是可以公开访问的,这是正确的吗?(我的问题是理论上的问题)我不太理解你在评论中的问题。我已经解释过该控件有多个引用。所以,当我创建一个控件并分配一个父控件时,就像注册它然后发布,以便每个控件都可以访问…是的,就是这样。设置父对象和所有者等操作会将对象引用泄漏到更高的可见性。班级帮手也有这种效果。仅仅表单的引用是私有的是不够的,但是表单也必须保守秘密。这就像把对象引用放在一个安全的表单上,然后告诉每个人密码是什么。好吧,我知道,但是对于一个逻辑上仅仅是一个问题,私有对象可以公开访问是正确的吗?(我的问题是理论上的问题)我不太理解你在评论中的问题。我已经解释过该控件有多个引用。所以,当我创建一个控件并分配一个父控件时,就像注册它然后发布,以便每个控件都可以访问…是的,就是这样。设置父项和所有者等操作