Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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中调用PasteFromClipboard()时,如何稍微偏移粘贴的组件?_Delphi - Fatal编程技术网

在Delphi中调用PasteFromClipboard()时,如何稍微偏移粘贴的组件?

在Delphi中调用PasteFromClipboard()时,如何稍微偏移粘贴的组件?,delphi,Delphi,如果我在设计时使用Delphi,那么当我在设计时复制/粘贴一组组件时,粘贴的组件会稍微偏离其原始组件 然而,我正在开发一个GUI,它允许用户为另一个应用程序开发GUI。剪切/粘贴时,粘贴的组件直接位于原件上方。有没有办法稍微抵消它们呢?既然您已经有了基本的复制/粘贴功能,那么下一个功能就是对您已经拥有的功能进行相当简单的扩展 粘贴当然(大概)会将复制的控件与其复制的属性值粘贴在一起,因此它们将覆盖在从中复制控件的原始控件之上 若要取消设置行为,必须在粘贴控件后对其进行“轻推”。如果无法更直接地获

如果我在设计时使用Delphi,那么当我在设计时复制/粘贴一组组件时,粘贴的组件会稍微偏离其原始组件


然而,我正在开发一个GUI,它允许用户为另一个应用程序开发GUI。剪切/粘贴时,粘贴的组件直接位于原件上方。有没有办法稍微抵消它们呢?

既然您已经有了基本的复制/粘贴功能,那么下一个功能就是对您已经拥有的功能进行相当简单的扩展

粘贴当然(大概)会将复制的控件与其复制的属性值粘贴在一起,因此它们将覆盖在从中复制控件的原始控件之上

若要取消设置行为,必须在粘贴控件后对其进行“轻推”。如果无法更直接地获得粘贴控件的列表,则导出此类列表的一种方法是在粘贴前复制目标表单的组件集合,然后在粘贴后再次迭代组件集合-集合中的任何项,而不是“原始”项列表必须已粘贴,您可以根据需要对其应用左/上轻推

  list := TList.Create;
  try
    for i := 0 to Pred(dest.ComponentCount) do
      list.Add(dest.Components[i]);

    // Do your pasting

    for i := 0 to Pred(dest.ComponentCount) do
      if list.IndexOf(dest.Components[i]) = -1 then
        // Nudge dest.Components[i]
  finally
    list.Free;
  end;
我认为这至少会让你朝着正确的方向前进

注意:上面的代码假设您正在(潜在地)处理TComponent派生类(即非可视组件)。如果只处理t控件子体,则可以通过使用目标容器控件(不一定是表单)的ControlCount控件进行优化


此外,t组件的左/顶部位置存储在公共DesignInfo属性的lo/hi字中,因此,如果您使用的是非可视组件和可视控件,则微移代码需要考虑到这一点,并以不同于t控件的方式处理t组件派生控件。

因为您具有基本的复制/粘贴功能,下一个部分是对已有内容的一个相当简单的扩展

粘贴当然(大概)会将复制的控件与其复制的属性值粘贴在一起,因此它们将覆盖在从中复制控件的原始控件之上

若要取消设置行为,必须在粘贴控件后对其进行“轻推”。如果无法更直接地获得粘贴控件的列表,则导出此类列表的一种方法是在粘贴前复制目标表单的组件集合,然后在粘贴后再次迭代组件集合-集合中的任何项,而不是“原始”项列表必须已粘贴,您可以根据需要对其应用左/上轻推

  list := TList.Create;
  try
    for i := 0 to Pred(dest.ComponentCount) do
      list.Add(dest.Components[i]);

    // Do your pasting

    for i := 0 to Pred(dest.ComponentCount) do
      if list.IndexOf(dest.Components[i]) = -1 then
        // Nudge dest.Components[i]
  finally
    list.Free;
  end;
我认为这至少会让你朝着正确的方向前进

注意:上面的代码假设您正在(潜在地)处理TComponent派生类(即非可视组件)。如果只处理t控件子体,则可以通过使用目标容器控件(不一定是表单)的ControlCount控件进行优化


此外,t组件的左/顶部位置存储在公共DesignInfo属性的lo/hi字中,因此,如果您使用的是非可视组件以及可视控件,则您的推送代码需要考虑到这一点,并以不同于TControl的方式处理TComponent派生控件。

能否请您详细说明在代码中复制/粘贴组件的具体方式?可能是几行代码代码也会有帮助。+1感谢您花时间回复,谢谢。我使用CopyToClipboard()和PasteFromClipboard()方法,但是,这些是TMS组件,所以也许我应该问问TMS。我只是假设它们是继承的方法…不需要假设。您拥有所有的源代码,至少是Delphi控件的源代码,所以请查看。您应该注意到,基本VCL控件通常没有任何与剪贴板相关的方法。如果他们这样做了,那是为了处理他们的文本内容。把一个TEdit复制到剪贴板上,你就能得到它的文本;您无法获得整个控件的副本。在这里询问与TMS相关的问题是可以的,但您仍然需要提供更多细节。TMS有很多组件;你用的是哪一个?直接问TMS是个好主意——通常布鲁诺和他的同事都非常挑剔。Mawg,如果我把那条评论作为回答,我会因为没有回答这个问题而被否决。它完全不能解决如何更改粘贴组件的位置的问题,而这正是您所要求的。我不知道怎么做。我知道如何去学习如何做到这一点,但我不认为这是一个非常有用的答案。如果你问TMS,你得到的技术比Deltics答案中的技术更直接,请务必在此处转达答案。请你详细说明在代码中复制/粘贴组件的具体方式-也许一些代码行也会有帮助。+1感谢你花时间回复,谢谢。我使用CopyToClipboard()和PasteFromClipboard()方法,但是,这些是TMS组件,所以也许我应该问问TMS。我只是假设它们是继承的方法…不需要假设。您拥有所有的源代码,至少是Delphi控件的源代码,所以请查看。您应该注意到,基本VCL控件通常没有任何与剪贴板相关的方法。如果他们这样做了,那是为了处理他们的文本内容。把一个TEdit复制到剪贴板上,你就能得到它的文本;您无法获得整个控件的副本。询问TMS相关问题