作为这个问题

TForm.OnResize有时烧成首先显示表单之前,但并非总是如此。例如,如果边框或者是bsDialog或bsNone,然后onResize受到不火。对于所有其它的边框值(并在它们的默认值的所有其它属性),onResize受到不起火。

<强>是否存在影响onResize受到是否将触发显示表单之前?其他东西例如,其他属性或属性的组合,可能影响此?

在onResize受到事件是ShowWindow API函数发送WM_SIZE消息发送到所述窗口的结果。这再次强调。的该消息被从Windows来,而不是从Delphi的这是一个视窗函数(ShowWindow)这是(有时)发送触发事件的消息 - 这样的VCL源代码是不是真的有帮助在这种情况下。

基于记录ShowWindow / WM_SIZE行为,例如,用于确定的答案奖励积分MSDN文档或彼佐尔德书引用。

有帮助吗?

解决方案

也许它甚至依赖于用户的显示设置或桌面主题或Windows版本。如果onResize受到们给我这样的问题,我将建立我的程序总是指望它,处理它在任何情况下,无论是什么,我认为是原因。

其他提示

我相信,当一个事件分派消息onResize受到必火 说形式的大小(左边,底部,宽度,高度)将被修改。

既然你已经发现了这消息时将触发该事件,您需要 现在跟踪,其中消息在VCL发送。

看VCL的源代码,以查看是否可以当场那些操作。

编辑:让我们去低的水平。在窗口(严重说话)的形式有什么 被称为“窗口类”(这不是一类就像我们知道它OOP)。所有时间窗口类形式的调整大小(和形状是可见的),所述WM_SIZE被发送。

因此,这将不会发生的形式被示出,但与底层窗口类相比只有它的尺寸被改变。在所有时间

如你已经观察到,许多属性valuez改变形式(甚至几个像素)的尺寸。

这是一个很肤浅的解释,这是一吨的其他细节 - 但它是我的理解事情是如何工作的“引擎盖下”

有是不可替代的测试。如何在代码中创建一个表单,设置你感兴趣的,当被称为resize事件记录的性能。

如果你不介意的代码的丑陋,这里的概念的一个粗略的证明,测试和位置边框的所有组合没有明确地编码每一个。您可以添加更多的特性,并把它作为远,只要你喜欢。喜欢的CodeSite的工具将使日志记录更清洁,更轻松。

创建具有2所形成的应用程序。确保第二个是不自动创建。

在第二种形式中,添加属性和加入少许日志代码到窗体的Resize事件:

  private
    FOnResizeFired: TNotifyEvent;
  public
    property OnResizeFired: TNotifyEvent read FOnResizeFired write FOnResizeFired;
  end;

...

procedure TForm2.FormResize(Sender: TObject);
begin
  if Assigned(FOnResizeFired) then
    FOnResizeFired(self);
end;

在主要形式,添加到TypInfo uses子句和删除表单上的按钮和备忘录。

添加一个简单的程序:

procedure TForm1.ResizeDetected(Sender: TObject);
begin
  Memo1.Lines.Add('    *** Resize detected');
end;

现在添加以下ButtonClick事件:

procedure TForm1.Button1Click(Sender: TObject);
var
  lBorderStyle: TFormBorderStyle;
  lBorderStyleName: string;
  lPosition: TPosition;
  lPositionName: string;
  lForm: TForm2;
begin
  Memo1.Clear;
  for lBorderStyle in [low(TFormBorderStyle) .. high(TFormBorderStyle)] do
  begin
    for lPosition in [low(TPosition) .. high(TPosition)] do
    begin
      lBorderStyleName := GetEnumName(TypeInfo(TFormBorderStyle), Integer(lBorderStyle));
      lPositionName := GetEnumName(TypeInfo(TPosition), Integer(lPosition));
      Memo1.Lines.Add(Format('Border: %s  Position: %s', [lBorderStyleName, lPositionName]));

      Memo1.Lines.Add('  Creating form');
      lForm := TForm2.Create(self);
      try
        Memo1.Lines.Add('  Form Created');
        lForm.OnResizeFired := ResizeDetected;
        Memo1.Lines.Add('    Setting border style');
        lForm.BorderStyle := lBorderStyle;
        Memo1.Lines.Add('    Setting Position');
        lForm.Position := lPosition;
        Memo1.Lines.Add('    Showing form');
        lForm.Show;
        Memo1.Lines.Add('    Form Shown');
        lForm.Close;
        Memo1.Lines.Add('    Form Closed');
      finally
        FreeAndNil(lForm);
        Memo1.Lines.Add('    Form Freed');
      end;
    end;
  end;
end;

您会发现,调整时将触发所示的表格前,一些属性设置,我看到,在一些组合,调整似乎火两次所示的形式时。有趣。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top