检测子控件何时调整大小?

8

有没有一种方法让一个父控件检测到子控件的大小调整呢?我正在考虑编写一个面板控件,当其子控件调整大小时,它也会相应地调整大小(类似于HTML DIV元素根据其内容扩展)。


一定有办法。看看 TPanel 或 TForm 的源代码。属性 AutoSize 使它们具备了这种行为。 - Sir Rufo
TPanel 只是继承并提升了 TControl.AutoSize 属性。实际工作都由 TControl 完成。 - Remy Lebeau
@RemyLebeau:肯定不是所有的工作,因为只有TWinControl的子类才能在第一位拥有子控件。 - Andreas Rejbrand
@AndreasRejbrand:不,TControl并不能完成所有工作,TWinControl也有贡献。但是,TControl确实公开了与自动调整大小相关的虚拟方法,而TWinControl则覆盖这些方法以便于调整客户区域、锚点等。 - Remy Lebeau
2个回答

6
回答你的问题,我认为当子控件被调整大小或移动时,窗口控件的AlignControls方法会被调用。

实际上,TControl.SetBounds 调用 RequestAlign,导致父控件的 AlignControls 被调用。 - Sertac Akyuz
1
AlignControl()AlignControls()用于相对于指定的子控件对齐父控件的其他子控件。对齐后,如果AutoSize为真,则调用父控件的CanAutoSize()CanResize()方法来调整父控件自身的大小。 - Remy Lebeau

4
TControlTWinControl内置支持自动调整大小功能。您只需将TControl.AutoSize属性设置为True即可。该属性在TControl中声明为protected,因此如果您希望组件用户设置它,则需要将其提升为publicpublished。否则,只需在组件的构造函数中设置即可。
如果您想自定义父控件相对于其子控件的大小调整方式,则可以重写虚拟方法CanAutoSize()

它不具有良好的可扩展性。例如,我可能会在自动大小的表单上拥有一个带设置的顶部面板和下面的alClient面板。 如果顶部面板可能会显示/隐藏或由于某些事件而更改其高度-这会使表单越来越缩小 :-( - Arioch 'The

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接