【发布时间】:2020-06-13 08:17:35
【问题描述】:
编写我自己的从 TComponent 继承的 Delphi VCL 组件,其中包含一堆属性,这些属性对于组件的所有者表单必须是唯一的。当我将组件从一个表单复制到另一个表单时(使用简单的 Ctrl+C、Ctrl-V),所有属性也会被复制。 关于我可以在哪里(或如何)处理在表单上复制或粘贴组件并清除复制的值(或将它们设置为默认值)的任何想法?现在,我最终想到了将组件的所有者表单名称(或其他唯一属性)保留在特殊组件属性中,并将其与组件的 Loaded 方法中的实际所有者名称进行比较。也许有更优雅或更简单的方法?
【问题讨论】:
-
别以为你能做到。流不区分数据将进入剪贴板而不是任何其他目的地。
-
复制/粘贴意味着复制并粘贴到这里。如果这不是您想要发生的事情,请不要复制和粘贴。而是从调色板中将新组件拖放到另一个表单上,这会创建一个具有默认属性集的新组件。尝试复制而不复制是没有意义的。如果您将填写好的表格放在复印机上并按复制,您不会从机器中得到新的空白表格,您会得到一份已经填写好的表格的副本。为什么您期望将组件从一种形式复制到另一种形式会有所不同?它仍然是副本。
-
我相信 OP 正在尝试控制哪些属性被复制到所述组件的新副本中,哪些不是。我不确定这是否可以做到。顺便问一下,Delphi 如何执行复制组件的任务?我猜首先它需要调用该组件的默认构造函数,然后它从旧组件复制属性。那么这是怎么做到的呢?如果 Delphi 可能依赖组件的 Assign 方法,那么我猜想通过自定义 Assign 方法可能会提供一些控制哪些属性被复制,哪些不被复制。
-
@KenWhite 好的,有没有办法禁止组件复制?强制用户删除一个新组件。
-
@SilverWarior 您对构造函数是正确的,但是在分配上-不,德尔福根本没有调用它。 Delphi 调用构造函数,然后以某种方式复制属性,然后调用组件的其他方法(如 Loaded)。
标签: delphi clipboard tcomponent