Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何保护published子句中声明的组件不被其他表单访问_Delphi_Delphi 7 - Fatal编程技术网

Delphi 如何保护published子句中声明的组件不被其他表单访问

Delphi 如何保护published子句中声明的组件不被其他表单访问,delphi,delphi-7,Delphi,Delphi 7,我有一个表单,其中有一堆标签,这些标签来自其他表单。我得出的结论是,这不是一种有效的方法,因为有时可能无法指定表单。因此,我认为在每次读取数据之前检查表单是否已分配是不好的,我认为最好创建一个公共属性列表,并在读取过程中检查表单是否已分配。但是除了确保只有一种方法在使用之外,我决定以某种方式关闭对表单组件属性的直接访问 简而言之:保护在published子句中声明的组件不被其他类访问,就像protected子句或private子句一样 但在这种情况下,似乎不存在解决方案。唯一的方法是创建另一个具

我有一个表单,其中有一堆标签,这些标签来自其他表单。我得出的结论是,这不是一种有效的方法,因为有时可能无法指定表单。因此,我认为在每次读取数据之前检查表单是否已分配是不好的,我认为最好创建一个公共属性列表,并在读取过程中检查表单是否已分配。但是除了确保只有一种方法在使用之外,我决定以某种方式关闭对表单组件属性的直接访问

简而言之:保护在published子句中声明的组件不被其他类访问,就像protected子句或private子句一样

但在这种情况下,似乎不存在解决方案。唯一的方法是创建另一个具有属性的对象,并强制窗体使用其属性


如果您知道,请给我另一个解决方案。

一旦发布了属性,就不能取消发布。Delphi表单设计器需要发布其操作的组件。因此,您设计的表单将充满已发布的组件

由于无法隐藏组件,剩下的就是隐藏窗体。由于您谈到表单有时没有被分配,我怀疑您正在使用全局变量来引用表单。这可能是你的主要问题。如果您有表单类型的可见全局变量,那么程序的任何部分都可以毫无限制地戳到任何其他部分

所以首先要做的是删除这些全局变量。编写应用程序时完全可以不使用表单类型的单个全局变量。然后,您可以控制应用程序的各个部分如何相互交互


问题的其他部分暗示表单拥有自己的数据。这是一个相当脆弱的设计选择。将数据保存在仅为此目的而设计的非可视模型对象中。让表单只显示数据的视图。然后,当系统的某个部分需要请求数据时,它可以请求非可视化模型对象,而不是可视化表单。

Simple——不要这样做!这是一个糟糕的编程,检查它们是否被分配并不能保护你,因为Windows本身会相信它们是有效的,如果它们不是,你的程序就会爆炸。如果这还不够的话,用一个子类替换标签,该子类带有检查父权的guard子句,如果它是错误的,则抛出YourRefied异常。好建议:)但是若您只是认真地从标签组件创建后续组件以检查它是否被特殊对象访问,那个么这是很困难的。顺便说一句,我认为不可能识别一个试图访问已发布组件的对象或该组件的属性来拒绝/允许访问。如果我理解正确,您想做的事情与
已发布
的所有含义背道而驰。你不应该试图隐藏已发布的属性。我理解。谢谢。@YevgeniyAfanasyev:我不是建议检查它是否被特殊对象访问,而是检查它是否被其他东西拥有,而不是它应该在的表单上。这对我来说可以。隐藏表格是个好主意。我会用的。非常感谢。