【问题标题】:Handle copy component from one form to another in Delphi在 Delphi 中处理将组件从一种形式复制到另一种形式
【发布时间】: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


【解决方案1】:

自己找到了解决方案。这是一种 hack,但它仍然有效。

首先,当我们复制组件时,Delphi 只复制发布的属性——它们是写在 dfm 文件中的。更正确的说法是,Delphi 会以 dfm 格式复制组件的实现。您可以通过复制组件并将其粘贴到记事本中轻松验证这一点。 因此,现在我们可以使用剪贴板在新粘贴的组件实例中对其进行分析,并决定是否清除属性(或执行其他操作)。

这种检查的一个小例子——分析剪贴板中的值是否符合当前组件的程序:

function CheckClipboard:boolean;
begin
 try
  if (pos('object', Clipboard.AsText) <> 0)
    and (pos('object', Clipboard.AsText) < pos('TComponent', Clipboard.AsText))
    and (pos('TComponent', Clipboard.AsText) < pos(#13#10, Clipboard.AsText))
    and (pos(#13#10, Clipboard.AsText) < pos('end', Clipboard.AsText))
    and (TForm(Owner).Showing) then //This is for the function to not execute when the owner form is created or opened
       Result:=true
  else
    Result := false;
 except
  on E : Exception do
  begin
   MessageDlg('Clipboard error: '+E.Message, mtError, mbOKCancel, 0);
   Result := false;
  end;
 end;
end;

当剪贴板包含这样的组件时返回 true,否则返回 false。我在组件的 Loaded 方法中使用它。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2012-07-13
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多