0

编写我自己的从 TComponent 继承的 Delphi VCL 组件,其中包含一堆属性,这些属性对于组件的所有者表单必须是唯一的。当我将组件从一个表单复制到另一个表单时(使用简单的 Ctrl+C、Ctrl-V),所有属性也会被复制。关于我可以在哪里(或如何)处理在表单上复制或粘贴组件并清除复制的值(或将它们设置为默认值)的任何想法?现在,我最终想到了将组件的所有者表单名称(或其他唯一属性)保留在特殊组件属性中,并将其与组件的 Loaded 方法中的实际所有者名称进行比较。也许有更优雅或更简单的方法?

4

1 回答 1

0

自己找到了解决方案。这是一种 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 方法中使用它。

于 2020-03-03T20:55:06.217 回答