Delphi中的设计时拖放?

Delphi中的设计时拖放?,delphi,controls,drag-and-drop,design-time,Delphi,Controls,Drag And Drop,Design Time,在Delphi2006(我想)引入TFlowPanel和TGridPanel之前,我做了一个概念类似的控件。它仍然做一些控件没有做的事情,当我将代码升级到Delphi2009时,我决定也添加一些增强功能 现在,子控件的顺序由其创建顺序决定。FlowPanel和GridPanel使用ControlIndex和其他过滤属性显示了更好的方法,但我想知道是否有一种方法可以在设计时处理拖放重新排序?就我所知,拖动编辑控件并将其放到我的面板上不会调用任何我在设计时可以访问的内容 我有点幻想有一种方法,可以直

在Delphi2006(我想)引入TFlowPanel和TGridPanel之前,我做了一个概念类似的控件。它仍然做一些控件没有做的事情,当我将代码升级到Delphi2009时,我决定也添加一些增强功能


现在,子控件的顺序由其创建顺序决定。FlowPanel和GridPanel使用ControlIndex和其他过滤属性显示了更好的方法,但我想知道是否有一种方法可以在设计时处理拖放重新排序?就我所知,拖动编辑控件并将其放到我的面板上不会调用任何我在设计时可以访问的内容

我有点幻想有一种方法,可以直接检测拖放操作,也可以检测控件何时移动,以便确定它应该去哪里

有什么想法吗

更新: 好的,开始工作了。容器控件已覆盖AlignControls以管理控件的放置。拖放嵌套控件时,将再次调用AlignControls。然后,我将控件的新坐标与列表中的其他控件进行比较,并将其移动到适当的位置


有几个问题我必须解决(主要与许多对AlignControls的调用有关),但基本概念足够简单。感谢所有评论员的帮助。

您是否尝试为网格组件编写“OnDragDrop”事件,检查组件是否处于设计模式


我还没有编写这样的组件,但我不明白为什么事件不应该触发。

您不能拖动窗体上已经存在的控件并将其放到面板上。拖动仅用于移动控件,不用于更改其父控件。要更改父对象,请剪切并粘贴


如果控件已在面板上,并且您希望将其移动到面板上的其他位置,则面板可以通过覆盖
TWinControl.AlignControls
方法来控制布局。当一个控件被移动时,它的
SetBounds
方法被调用,其中发生的事情是它在其父窗口上调用
AlignControl(Self)
。调用
AlignControls
。查看Controls.pas,您会发现这是一个复杂的方法,但它是控制控件上子控件布局的原因,这正是您计划更改的内容。

也许这些建议中的一些可能会有所帮助

您可以在设计器中重新设置控件的父级,而无需执行剪切和粘贴操作。查看结构窗格,只需将可视控件拖动到结构窗格中另一父级的节点。如果流程面板中有内容,请将所有内容从流程面板中拖出,并按您希望的顺序将其拖回

(您可以通过这种方式重新设置任何视觉控件的父级,而无需更改其父级以外的任何内容。我强烈建议您采用这种方式。)

您可以将表单视为文本,并在其中移动声明顺序——但显然,在直接编辑“资源”文件时需要小心


您可以在设计器中设置制表符顺序,以便根据制表符顺序创建一个不同的控件,该控件可以根据需要工作。您可以右键单击表单并更改非可视控件的创建顺序,但这不适用于可视控件

“子控件的顺序由其创建顺序决定”顺序是什么?账单顺序?是否要使它们在面板中从上到下按选项卡顺序排列?现在,如果选择面板,然后向其中添加控件,则控件将按添加顺序排列。若要重新排序,您需要剪切并粘贴表单,或将表单视为文本,然后将其四处移动。我现在在la TFlowPanel中添加了一个ControlIndex属性,但希望该控件的用户能够通过拖放来重新排序。抓住Edit2,把它放到Edit1的左边,他们神奇地交换了面板上的位置。谢谢你,John。我的问题实际上与能否从自定义控件中支持它有关——基本上是为了让控件确定另一个控件被放置在构成控件边界矩形一部分的位置上,以便可以更改其父控件。我对此有了一些新的想法-除了不知道从何处开始,它将使控件的行为与其他容器不同,这可能会让控件的某些用户感到困惑。您可能希望将其改为组件编辑器,然后-通过鼠标右键单击弹出您自己的UI,并使用老式的上下移动或在该控件上实现拖放。我还没有尝试OnDragDrop,但似乎所有其他鼠标事件都被表单设计器截获,因此您永远不会收到控件正在被拖动的通知。嗨,Rob,我想我还不太清楚我的意图是哪些控件被拖放到了我的容器上-请参阅我对John评论的回应。关于使用AlignControl来处理重新排序,您当然是对的。我已经在使用AlignControls来排列子对象,但现在我完全忽略了左侧和顶部属性。我担心的是,考虑到这些因素,将很难确定何时刚刚添加控件以及用户何时尝试重新排序。我会试一试,然后再报告。