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)
有没有办法:
如何从类的“外部”更改表单的样式?
最简单的解决方案是将参数传递给表单的构造函数,而不是等到表单创建完成。
这意味着您需要引入一个构造函数,TForm2该构造函数接受您需要在 中传递的任何信息作为参数CreateParams。
在调用继承的构造函数之前记下任何状态。WS_EX_APPWINDOW另外,当您将所有者设置为零时,无需进行设置。