构造函数运行后如何设置CreateParams?

Jen*_*off 3 delphi vcl window delphi-xe2

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

  TForm2 = class(TForm)
  private
    FAppWindow: Boolean;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    property AppWindow: Boolean read FAppWindow write FAppWindow;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.Create(Self);
  Form2.AppWindow := True;
  Form2.Show;
end;

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited;
  if FAppWindow then begin
    Params.Style := Params.Style or WS_EX_APPWINDOW;
    Params.WndParent := 0;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为窗口句柄是在 TForm 的构造函数期间创建的,因此CreateParams运行得太早并且FAppWindow始终为False

编写自定义构造函数也不起作用,因为您最终必须调用继承的构造函数来创建句柄,然后才能将任何数据保存到实例:

constructor TForm2.CreateAppWindow(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FAppWindow := True;
end;
Run Code Online (Sandbox Code Playgroud)

有没有办法:

  • 延迟窗口句柄的创建?
  • 创建窗口句柄后更改窗口样式?
  • 构造函数运行后重新创建窗口句柄?
  • 我还没有想到其他一些选择吗?

如何从类的“外部”更改表单的样式?

Dav*_*nan 5

最简单的解决方案是将参数传递给表单的构造函数,而不是等到表单创建完成。

这意味着您需要引入一个构造函数,TForm2该构造函数接受您需要在 中传递的任何信息作为参数CreateParams

在调用继承的构造函数之前记下任何状态。WS_EX_APPWINDOW另外,当您将所有者设置为零时,无需进行设置。

  • 在调用继承之前记下参数。这是要走的路。 (2认同)