2013-05-10 87 views
3

我的目标是创建一个简单的表单编辑器,就像我们在Delphi IDE上找到的一样。在Delphi中创建表单编辑器

现在用户可以选择并添加组件,使其成为表单持有者的TPanel的父级。为简单起见,请考虑将TPanel作为添加到表单的可视化组件。

我有2个缺少的部分我想找出想法/代码,以帮助完成:

1 - 如何移动创建可视化组件?在IDE中用于移动可视化组件的相同效果,例如Tpanel,围绕它的顶部和左侧位置 2 - 如何在窗体编辑器中重点绘制该组件的钩子3 - 如何使用钩子调整大小

我只想要相关的部分来处理视觉部分。我不生成DFM或类似的东西。

回答

5

简单地说你的移动代码需要做到这一点:

  1. 当鼠标出现故障,检查鼠标的位置是在可拖动控制。如果是,则设置一个名为FDragControl的变量来引用该控件。此代码位于事件处理程序的OnMouseDown中。
  2. 当鼠标移动时,如果FDragControl不为零,请移动控件。此代码位于OnMouseMove事件处理程序中。
  3. 当鼠标上升时,将FDragControl设置为零。

这几乎都是它的一切。主要的细微差别在于,当拖动开始时,您还必须记住鼠标的X,Y值。因此,在您OnMouseDown处理程序中写:

FStartMousePos := Point(X, Y); 
FStartDragControlPos := Point(FDragControl.Left, FDragControl.Top); 

然后在OnMouseMove你的位置代码读取:

FDragControl.Left := FStartDragControlPos.X + (X-FStartX); 
FDragControl.Top := FStartDragControlPos.Y + (Y-FStartY); 

您还需要当你开始拖动捕获鼠标。

调整大小的代码是类似的。同样,您需要在OnMouseDown中决定您调整大小而不是拖动,但代码仍然涉及处理鼠标下移,移动和上移事件。至于绘画,只要您的某个事件处理程序更改会影响窗体外观的属性,就需要强制重绘。您可以使用FDragControl的值来决定是否使用控件的特殊绘图并指示它正在被拖动。同样也适用于调整大小。

我没有编写完整的工作实现,因为您的问题是高层次和概念性的。实施取决于你。

+0

很大!对调整有那些钩子和控制周围的框架是很重要的,怎么可以做什么? – 2013-05-10 13:23:14

+1

@eelias使用窗体'OnPaint'事件在窗体画布上绘制它 – 2013-05-10 13:52:58

+2

有一个很好的组件,它是一个名为Cindy Components的组件的一部分 - 您想要的组件称为cyResizer,它可以移动,调整大小并防止走出去说一个面板边界等...链接:http://sourceforge.net/projects/tcycomponents/看到你认为它是非常可定制的以及... – Shambhala 2013-05-10 15:19:42

1

搜索更多的答案我能找到这些文章:在运行时 http://delphi.about.com/library/weekly/aa102505a.htm

如何添加尺寸手柄在运行时调整大小控制

如何移动和调整控制 http://delphi.about.com/library/weekly/aa110105a.htm

用所有的信息来完成这个任务与源代码的例子。

这些文章展示了如何实现和使用TMover类。我已经完成并正确工作。

我也下载了TcyComponents Pack并使用了TcyResizer。它是一个全功能的表单编辑器,几乎可以满足像表单编辑器这样的Delphi所需的一切。我建议。它附带源代码,并且可以在XE2版本下正常工作。

+2

添加此为该问题的更新。 – RBA 2013-05-10 15:42:02

2

//我已经做了这个答案,因为我刚刚阅读了你的最新更新,这本来应该是作为对原始问题的修改而编写的,但无论如何。

您可以下载Cindy组件包并使用cyResizer组件,该组件可以完成您需要的几乎所有功能,并且可以自定义。

你可以从这里下载:但是http://sourceforge.net/projects/tcycomponents/

+0

@eelias我不认为你的答案应该是对问题的更新。但我也不认为这是一个很好的答案。这只是网络搜索的结果。任何人都可以做到。所以我不认为你的答案实际上回答了这个问题。或者如果是这样,那么这个问题应该被封闭,因为这不是一个真正的问题。 – 2013-05-12 20:23:42