【问题标题】:Design-time drag and drop in Delphi?Delphi中的设计时拖放?
【发布时间】:2010-10-28 16:38:47
【问题描述】:

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

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

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

有什么想法吗?

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

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

【问题讨论】:

  • "子控件的顺序由它们的创建顺序决定"顺序是什么?标签顺序 ?你想让它们在面板中从上到下排序吗?
  • 现在,如果您选择面板然后向其中添加控件,则控件将按照您添加它们的顺序排列。要重新排序,您可以剪切和粘贴表单,或者将表单作为文本查看并移动它们。我现在添加了一个 TFlowPanel 的 ControlIndex 属性,但希望控件的用户能够拖放以重新排序。因此,抓住 Edit2 并将其放到 Edit1 的左侧,它们会神奇地交换面板上的位置。

标签: delphi controls drag-and-drop design-time


【解决方案1】:

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

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

【讨论】:

  • 嗨 Rob,我想我不太清楚我的意图重新控制放在我的容器上 - 请参阅我对 John 评论的回复。关于使用 AlignControls 处理重新排序,您当然是对的。我已经在使用 AlignControls 来排列孩子,但现在我完全忽略了 left 和 top 属性。我担心的是,将这些考虑在内将很难确定何时添加控件以及用户何时尝试重新排序。不过我会试一试并报告。
【解决方案2】:

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

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

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

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

您可以在设计器中设置 Tab 键顺序,这样您就可以根据所需的 Tab 键顺序制作不同的控件。您可以右键单击表单并更改非可视控件的创建顺序,但这不适用于可视控件。

【讨论】:

  • 谢谢,约翰。我的问题确实与能够从自定义控件中支持它有关 - 基本上是为了让控件确定另一个控件被放置在构成我的控件边界矩形一部分的位置上,以便可以更改其父级。不过,我对此有一些想法 - 除了不知道从哪里开始之外,它还会使控件的行为与其他容器不同,这可能会使控件的某些用户感到困惑。
  • 您可能希望将其改为组件编辑器,然后 - 通过鼠标右键单击弹出您自己的 UI,并使用老式的向上/向下移动或实现拖放那个控件。
【解决方案3】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多