【问题标题】:Detect when child control resizes?检测子控件何时调整大小?
【发布时间】:2012-12-31 06:41:58
【问题描述】:

有没有办法让父控件检测子控件何时调整大小?我正在考虑编写一个面板控件,它在子控件调整大小时调整大小(类似于 HTML DIV 元素扩展以适应其内容的方式)。

【问题讨论】:

  • 必须有办法。查看 TPanel 或 TForm 源。属性 AutoSize 为他们启用此行为
  • TPanel 只是继承和提升TControl.AutoSize 属性。 TControl 完成所有实际工作。
  • @RemyLebeau:肯定不是所有工作,因为首先只有TWinControl 的后代才能拥有子控件。
  • @AndreasRejbrand:不,TControl 不做所有事情,TWinControl 也有贡献。但是TControl 确实公开了TWinControl 覆盖的与自动大小相关的虚拟方法,因此它可以针对客户区、锚点等进行调整。

标签: delphi user-interface vcl


【解决方案1】:

为了回答您的实际问题,我相信您的窗口控件的 AlignControls 方法会在调整大小或移动子控件时被调用。

【讨论】:

  • 确实,TControl.SetBounds 调用 RequestAlign 导致父级的 AlignControls 被调用。
  • AlignControl()AlignControls() 用于将父级的其他子控件相对于指定的子控件对齐。对齐后,如果AutoSize为真,则调用父级的CanAutoSize()CanResize()方法来调整父级本身的大小。
【解决方案2】:

TControlTWinControl 具有为您处理自动调整大小的内置支持。您所要做的就是将TControl.AutoSize 属性设置为True。它在TControl 中声明为protected,因此如果您希望组件用户设置它,则必须将其提升为publicpublished。否则,只需将其设置在组件的构造函数中即可。

如果您想自定义父控件相对于子控件的大小,您可以覆盖虚拟CanAutoSize() 方法。

【讨论】:

  • 它不能很好地扩展。例如,我可能有一个带有设置的 alTop 面板和 alClient 面板的表单,它位于 Auto-Size 表单上。如果顶部面板可能被显示/隐藏或可能会因某些事件而改变其高度 - 这会使表单越来越缩小:-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 2017-10-29
  • 2011-12-26
相关资源
最近更新 更多