如何在看不见的情况下解决AutoSize的问题?

时间:2014-01-31 10:59:02

标签: delphi

Delphi控件具有AutoSize属性,例如在TPanel。它根据内容调整面板的宽度/高度。

显然,当面板不可见时它不会做任何事情,并且在设置为可见时不会重新调整。因此,如果我将一些控件放入其中然后使其可见,则不会调整大小。

我可以通过在FormShow中将高度设置为任何值来触发调整大小:

procedure TForm1.FormShow(Sender: TObject);
begin
  Panel1.Height := Panel1.Height + 1; //triggers auto-resize
end;

但我必须手动为每个具有AutoSize的控件执行此操作。我一定会忘记一些事情。

有没有更好的方法来解决这个问题,最好一劳永逸?

2 个答案:

答案 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文件来查找控件并查看刷新/重绘以查看是否可以保持自动调整大小。

希望有所帮助。