7

在 Delphi 2006(我认为)引入 TFlowPanel 和 TGridPanel 之前,我做了一个概念上相似的控件。它仍然做了一些那些控件不做的事情,当我将代码升级到 Delphi 2009 时,我决定也添加一些增强功能。

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

我半幻想着有一种方法可以直接检测放置操作,或者检测控件何时移动,以便我可以确定它应该去哪里。

有任何想法吗?

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

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

4

3 回答 3

5

您不能将已经在表单上的控件拖放到面板上。拖动仅用于移动控件,而不用于更改其父级。要更改父级,请剪切并粘贴。

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

于 2009-05-25T15:13:58.987 回答
3

也许其中一些建议可能会有所帮助。

您可以在设计器中重新设置控件的父级,而无需进行剪切和粘贴。查看结构窗格,只需将可视控件拖动到结构窗格中另一个父级的节点即可。如果您在流程面板中有东西,请将所有内容拖出流程面板,然后按照您希望它们的顺序将它们拖回。

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

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

You can set tab order in the designer, so you could make a different control based on tab order that works as you want. You can right click on the form and change the creation order of the non-visual controls, but that doesn't work with visual controls.

于 2009-05-26T03:35:13.927 回答
0

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

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

于 2009-05-25T14:40:28.913 回答