在Delphi 2006(我认为)介绍TFlowPanel和TGridPanel之前,我做了一个概念相似的控件。它仍然做了一些控件不能做的事情,当我将代码升级到Delphi 2009时,我决定添加一些增强功能。
现在,子控件的顺序由其创建顺序决定。 FlowPanel和GridPanel使用ControlIndex和其他过滤属性显示更好的方法,但我想知道是否有办法在设计时处理拖放重新排序?据我所知,拖动编辑控件并将其拖放到我的面板上并不会调用我在设计时可以访问的任何内容。
我半开玩笑地想要直接检测掉落操作的方法,或者可能检测控件移动的时间,以便我可以确定它应该去哪里。
有什么想法吗?
更新 好的,搞定了。容器控件已经重写AlignControls来管理控件的放置。拖动嵌套控件并将其删除时,再次调用AlignControls。然后,我将控件的新坐标与列表中的其他控件进行比较,并将其移动到适当的位置。
我必须解决几个问题(主要与AlignControls的许多调用有关),但基本概念很简单。感谢所有评论者的帮助。
答案 0 :(得分:5)
您无法拖动表单上已有的控件并将其拖放到面板上。拖动仅适用于移动控件,而不是用于更改其父控件。要更改父级,剪切和粘贴。
如果控件已经在面板上,并且您想将其移动到面板上的其他位置,则面板可以通过覆盖TWinControl.AlignControls
方法来控制布局。移动控件时,会调用其SetBounds
方法,并且在其中发生的事情是它在其父窗口上调用AlignControl(Self)
。这称为AlignControls
。查看 Controls.pas ,您会发现这是一个复杂的方法,但它是控件上子项布局的负责人,而这正是您计划更改的内容。
答案 1 :(得分:3)
也许其中一些建议可能有所帮助。
您可以在设计器中重新控制控件,而无需进行剪切和粘贴。查看结构窗格,只需将可视控件拖到结构窗格中另一个父节点的节点即可。如果您在流程图中有东西,请将所有内容拖出流程面板,然后按照您希望的顺序将它们拖回。
(您可以通过这种方式重新使用任何可视控件,而不会更改其父级以外的任何内容。我强烈建议您这样做。)
您可以将表单视为文本,并在那里移动声明顺序 - 但显然您在编辑“资源”文件时需要小心。
您可以在设计器中设置Tab键顺序,这样您就可以根据所需的Tab键顺序进行不同的控制。您可以右键单击表单并更改非可视控件的创建顺序,但这不适用于可视控件。
答案 2 :(得分:0)
您是否尝试为网格组件编写“OnDragDrop”事件,检查组件是否处于设计模式?
我还没有写过这样的组件,但我不明白为什么事件不应该触发。