Delphi XE2,如何在更改VCL样式后保持表单ON TOP

时间:2012-05-10 00:02:21

标签: delphi delphi-xe2 vcl-styles

我在XE2遇到了一个奇怪的问题:

我正在使用HWND_TOPMOST和SetWindowPos将表单设置在顶部,但如果我在运行时切换VCL样式,则窗口不再是最顶层的,并且取消设置/重新设置它也不会修复它。

有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:8)

你的问题是,由于VCL不了解这种情况,因为样式改变并且失去了它的最顶级样式而正在重新创建表单。使用:

FormStyle := fsStayOnTop; 

或覆盖CreateWindowHandle,以便每次重新创建表单时调用SetWindowPos

type
  TForm1 = class(TForm)
    ..
  protected
    procedure CreateWindowHandle(const Params: TCreateParams); override;
  ..

procedure TForm1.CreateWindowHandle(const Params: TCreateParams);
begin
  inherited;
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
end;


顺便说一句,我无法复制“取消设置/重新设置无法解决”。通过我的测试,再次调用SetWindowPos修复它。

答案 1 :(得分:5)

在控件上设置新样式会导致重新创建控件的窗口句柄,因此必须重新应用HWND_TOPMOST

答案 2 :(得分:0)

经过长时间的互联网搜索和Delphi帮助没有解决方案,我尝试了几个不同的代码,几个提示,所有这些都没有任何效果,问题仍然存在。看看帮助,我决定测试下面对我来说完美的简单代码。

procedure TForm1.FormShow(Sender: TObject);
begin
  Application.RestoreTopMosts;
end;