在Delphi中创建一个表单编辑器

5
我的目标是创建一个简单的表单编辑器,就像我们在Delphi IDE中找到的那样。 现在用户可以选择并添加组件,使其成为一个TPanel的父容器,TPanel是表单的持有者。为了简单起见,也请将TPanel视为添加到表单的可视化组件。 我有两个缺失的部分,我想找出想法/代码来帮助完成: 1 - 如何移动已创建的可视化组件?与IDE中移动可视化组件(例如Tpanel)的相同效果,改变其顶部和左侧位置 2 - 如何在表单编辑器上绘制具有焦点的组件的钩子 3 - 如何使用钩子调整大小 我只想处理与可视部分相关的部分。我不会生成DFM或任何类似的内容。
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
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的值来决定是否使用控件的特殊绘图,并指示正在拖动它。调整大小也是如此。

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


太好了!但是对于调整大小来说,拥有那些钩子和控件周围的框架非常重要,该如何实现? - Eduardo Elias
1
@eelias 在表单的 OnPaint 事件中使用表单画布绘制它。 - Sir Rufo
2
有一个非常好的组件,它是Cindy Components包中的一部分 - 你想要的组件叫做cyResizer,它可以移动、调整大小并防止超出面板边界等...链接:http://sourceforge.net/projects/tcycomponents/看看你认为它非常可定制... - Shambhala
这是它的外观:https://a.fsdn.com/con/app/proj/tcycomponents/screenshots/234287.jpg - Shambhala

2

// 我已将此作为答案,因为我刚刚阅读了您的最新更新,这实际上应该作为对原始问题的编辑,但无论如何。

您可以下载Cindy组件包并使用cyResizer组件,它几乎可以完成您需要的所有操作,并且非常可定制。

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


@eelias,我认为你的回答不应该是对问题的更新。但我也不认为这是一个很好的答案。这只是网络搜索的结果。任何人都可以做到这一点。因此,我认为你的答案实际上并没有回答问题。或者如果它确实回答了问题,那么问题应该被关闭,因为它不是一个真正的问题。 - David Heffernan

1

为了寻找更多答案,我找到了以下文章:

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

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

这些文章提供了完成此任务所需的所有信息和源代码示例。

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

我还下载了 TcyComponents 包并使用了 TcyResizer。它是一个功能齐全的表单编辑器,几乎具备 Delphi 表单编辑器所需的一切功能。我推荐使用。它附带源代码,并且与 XE2 版本兼容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,