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;

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

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

constructor TForm2.CreateAppWindow(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FAppWindow := True;
end;

有办法:

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

如何从课堂的“外部”改变表格的风格?

#1楼 票数:4 已采纳

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

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

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

#2楼 票数:3

Delphi的好处是派生的构造函数不必将inherited构造函数作为其第一个语句。 所以你可以先设置你的FAppWindow成员,然后调用inherited构造函数来流式传输DFM并创建窗口,例如:

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

constructor TForm2.CreateAppWindow(AOwner: TComponent);
begin
  FAppWindow := True;
  inherited Create(AOwner);
end;

#3楼 票数:1

这似乎有助于重新创建句柄,我从RecreateAsPopup VCL方法得到了这个想法:

procedure TForm2.SetAppWindow(const Value: Boolean);
begin
  FAppWindow := Value;
  if HandleAllocated then
    RecreateWnd
  else
    UpdateControlState;
end;

  ask by Jens Mühlenhoff translate from so

未解决问题?本站智能推荐:

2回复

在一个空的新VCL表单应用程序下运行4个线程?[重复]

可能重复: 默认VCL应用程序中的其他线程是什么,它们是否可以按目的命名? 在Delphi XE2(32位)中运行新的空VCL Forms应用程序时,我看到此应用程序的任务管理器中运行了4个线程。 显然任何应用程序至少需要1个线程,但在这种情况下,其他3个线程是什么? 我想更好地了
2回复

如何在DelphiXE2中安装TMSComponentPack6.0?

为了在DelphiXE2中成功安装它们,必须进行哪些更改
1回复

如何在VCL表单中无缝嵌入FireMonkey表单?

我使用此问题中描述的技巧在VCL应用程序中的TPanel上显示FireMonkey表单。 我的问题是单击(控件)嵌入的表单导致VCL表单(包含该TPanel)被取消激活。 最明显的结果是窗口边框一直在变色。 当在另一个的TPanel上显示VCL表单时,这不会发生; 表格显然是“合并”。
3回复

如何在一个应用程序中同时使用VCL和FMX?

我有一个VCL应用程序和相当孤立的VCL代码。 我想在Mac OSX支持中包含Fire Monkey表单。 我计划使用大量的IFDEF来确定我应该使用VCL构建Windows还是使用FireMonkey构建Mac OSX。 遗憾的是,如果应用程序是VCL应用程序,则无法从项目管理器添加
2回复

如何在TDBCtrlGrid上启用鼠标滚轮滚动?

TDBCtrlGrid根本不响应鼠标滚轮。 我试过这个: 控件网格现在滚动,但它不会更改 DataSet 中的位置,而是将其内容移出客户端矩形,这看起来非常难看。 如何在TDBCtrlGrid上启用鼠标滚轮滚动?
3回复

如何在不修改每个表单代码的情况下为应用程序中的每个表单添加边框?

我们有一个大型的遗留数据库驱动的VCL应用程序,它包含300多种不同的表单。 我们希望提供一个练习(虚拟)数据库以及与其生产数据库一起安装的软件 - 能够在它们之间切换(用于培训/练习等)。 问题是,当用户使用练习模式时,我们必须做一些非常清楚的事情来突出他们,这样他们就知道他们在练习模式
1回复

什么是DelphiXE2VCL运行时BPL?

旧的Delphi 7,取消选中运行时程序包并构建所有技巧似乎不再起作用,因此我无法为我的Delphi项目还原任何可以作为一组良好的运行时BPL的东西。 我遇到了一个问题,我可能会在此处提出另一个问题并链接,我认为可以通过包含一个包含VCL.CheckLst.pas的特定BPL来解决。 我
3回复

如何在TCheckBox,TRadioButton,TGroupBox上更改字幕字体颜色?

我不知道我的问题是什么,但我无法在DEx2中为TCheckBox,TRadioButton,TGroubBox和TRadioGroup等控件设置字体颜色。 如果我在IDE中或以编程方式执行它并不重要。 我已将表单颜色设置为clBlack,并希望我的标题是clWhite,但它们不会呈现任何颜