Delphi控件具有AutoSize属性,例如在TPanel。它根据内容调整面板的宽度/高度。
显然,当面板不可见时它不会做任何事情,并且在设置为可见时不会重新调整。因此,如果我将一些控件放入其中然后使其可见,则不会调整大小。
我可以通过在FormShow中将高度设置为任何值来触发调整大小:
procedure TForm1.FormShow(Sender: TObject);
begin
Panel1.Height := Panel1.Height + 1; //triggers auto-resize
end;
但我必须手动为每个具有AutoSize的控件执行此操作。我一定会忘记一些事情。
有没有更好的方法来解决这个问题,最好一劳永逸?
答案 0 :(得分:3)
我认为你无能为力。重新调整大小的更好方法是在使面板显示后立即调用面板的Realign
方法。
对于自动调整大小的控件,您可以挂钩CM_VISIBLECHANGED
消息并强制解决问题。例如,使用拦截器:
type
TPanel = class(Vcl.ExtCtrls.TPanel)
protected
procedure CMVisibleChanged(var Message: TMessage); message CM_VISIBLECHANGED;
end;
procedure TPanel.CMVisibleChanged(var Message: TMessage);
begin
inherited;
if Visible and AutoSize then
Realign;
end;
答案 1 :(得分:0)
我使用delphi已经有一段时间了,但有一件事我记得是控件确实在我身上玩了一些心灵游戏,大部分时间都是因为渲染引擎没有刷新表单和控件。 如果您将控件设置为自动调整大小,我会建议检查form1.refresh或panel1.refresh,因为我玩了几年后(delphi 7)我可能会将刷新与重绘混淆。一些控件具有,在重新绘制控件之前启动了尺寸计算。由于delphi控件是开源的,你可以进入适当的pas文件来查找控件并查看刷新/重绘以查看是否可以保持自动调整大小。
希望有所帮助。