在Delphi中创建表单编辑器



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

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

我有2个缺失的部分,我想找到想法/代码来帮助完成:

1 -如何移动创建的可视化组件?与在IDE中移动视觉组件(例如Tpanel),改变其顶部和左侧位置的效果相同如何在窗体编辑器上为组件绘制钩子3 -如何使用挂钩调整大小

我只希望与处理视觉部分相关的部分。我没有生成DFM或类似的东西。

只需把您的移动代码需要这样做:

  1. 当鼠标向下移动时,检查鼠标位置是否在可以拖动的控件上。如果是,那么设置一个名为FDragControl的变量来引用该控件。此代码位于OnMouseDown事件处理程序中。
  2. 鼠标移动时,如果FDragControl不为空,则移动控件。此代码位于OnMouseMove事件处理程序中。
  3. 当鼠标上升时,设置FDragControl为nil。

这就是它的全部内容。主要的细微差别是,当拖动开始时,您还必须记住鼠标的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的值来决定是否使用控件的特殊绘图,并指示它正在被拖动。

我还没有编码一个完整的工作实现,因为你的问题是高层次和概念性的。

//我已经做了这个回答,因为我刚刚读了你最新的更新,这真的应该作为对你原来问题的编辑,但是,无论如何。

你可以下载Cindy Components Pack并使用cyResizer Component,它可以做你需要的几乎所有的事情,并且非常可定制。

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

在寻找更多答案时,我可以找到这些文章:

如何在运行时移动和调整控件大小http://delphi.about.com/library/weekly/aa102505a.htm

如何为在运行时调整大小的控件添加大小句柄http://delphi.about.com/library/weekly/aa110105a.htm

基本带有完成此任务的所有信息的源代码示例。

这些文章展示了如何实现和使用TMover类。我已经做了,并且工作正常。

我还下载了TcyComponents Pack并使用了TcyResizer。它是一个功能齐全的表单编辑器,几乎拥有像Delphi这样的表单编辑器所需要的一切。我建议。它带有源代码,可以很好地与XE2版本一起使用。

最新更新