在Delphi中创建表单编辑器

时间:2013-05-10 12:47:46

标签: delphi vcl

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

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

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

1 - 如何移动创建的可视组件?与IDE相同的效果是移动可视组件,例如Tpanel,围绕它的顶部和左侧位置 2 - 如何使用焦点在表单编辑器上绘制组件的钩子 3 - 如何使用钩子重新调整大小

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

3 个答案:

答案 0 :(得分:5)

只需将您的移动代码需要执行此操作:

  1. 当鼠标按下时,检查鼠标位置是否在可以拖动的控件上。如果是,则设置名为FDragControl的变量以引用该控件。此代码位于OnMouseDown事件处理程序中。
  2. 当鼠标移动时,如果FDragControl不为零,则移动控件。此代码位于OnMouseMove事件处理程序中。
  3. 当鼠标上升时,将FDragControl设置为nil。
  4. 这就是它的全部内容。主要的细微差别是你必须记住拖动开始时鼠标的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的值来决定是否使用控件的特殊绘图并指示它是否被拖动。同样适合调整大小。

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

答案 1 :(得分:2)

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

您可以下载Cindy组件包并使用cyResizer组件,它可以完成您需要的所有操作,并且可以自定义。

您可以从此处下载:http://sourceforge.net/projects/tcycomponents/

答案 2 :(得分:1)

搜索更多答案我可以找到这些文章:

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

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

使用源代码示例完成此任务的所有信息。

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

我还下载了TcyComponents Pack并使用了TcyResizer。它是一个功能齐全的表单编辑器,几乎包含Delphi之类的表单编辑器。我建议。它附带源代码,适用于XE2版本。