在 Delphi 中处理从一种形式到另一种形式的复制组件
Handle copy component from one form to another in Delphi
编写我自己的 Delphi VCL 组件继承自 TComponent,具有一系列属性,这些属性对于组件的所有者表单必须是唯一的。当我将组件从一种形式复制到另一种形式时(使用简单的 Ctrl+C、Ctrl-V),所有属性也被复制。
关于我可以在哪里(或如何)处理在表单上复制或粘贴组件并清除复制的值(或将它们设置为默认值)的任何想法?现在,我最终想到在特殊组件 属性 中保留组件的所有者表单名称(或其他唯一 属性),并将其与组件的 Loaded 方法中的实际所有者名称进行比较。也许有更优雅或更简单的方法?
自己找到了解决办法。这是一种 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;
如果剪贴板包含此类组件,则 returns 为真,否则为假。我在组件的 Loaded 方法中使用它。
编写我自己的 Delphi VCL 组件继承自 TComponent,具有一系列属性,这些属性对于组件的所有者表单必须是唯一的。当我将组件从一种形式复制到另一种形式时(使用简单的 Ctrl+C、Ctrl-V),所有属性也被复制。 关于我可以在哪里(或如何)处理在表单上复制或粘贴组件并清除复制的值(或将它们设置为默认值)的任何想法?现在,我最终想到在特殊组件 属性 中保留组件的所有者表单名称(或其他唯一 属性),并将其与组件的 Loaded 方法中的实际所有者名称进行比较。也许有更优雅或更简单的方法?
自己找到了解决办法。这是一种 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;
如果剪贴板包含此类组件,则 returns 为真,否则为假。我在组件的 Loaded 方法中使用它。