【问题标题】:Delphi XE2, how to keep form ON TOP after changing VCL stylesDelphi XE2,如何在更改 VCL 样式后保持表单在顶部
【发布时间】:2012-05-10 00:02:20
【问题描述】:

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

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

有什么办法解决这个问题?

【问题讨论】:

  • 听起来像一个错误。您应该将此报告给QC
  • @MasonWheeler 这不是错误,这是 vcl 样式的工作方式,每次更改 vcl 样式时,都会重新创建表单句柄。
  • @RRUZ:根据 OP 的原始描述,重新设置属性不适用于样式,如果这是真的,那肯定是一个错误。 (请参阅 OP 对 Sertac 答案的评论,以更好地解释实际发生的情况。)

标签: delphi delphi-xe2 vcl-styles


【解决方案1】:

您的问题是由于样式更改而重新创建了表单,并且由于 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 修复了它。

【讨论】:

  • 谢谢。你是对的,重新设置它确实有效。问题是窗口句柄不同,因为我在更改 VCL 样式后调用 RecreateWnd 以克服不同的问题,所以我使用现在无效的句柄调用 SetWindowPos。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在网上找了很长时间,在Delphi帮助中没有解决,我尝试了几个不同的代码,几个提示,都没有任何效果,问题仍然存在。看着帮助,我决定测试下面对我来说非常有效的简单代码。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-25
      • 2012-02-26
      • 1970-01-01
      • 2013-10-26
      • 2016-03-20
      • 2013-05-18
      • 2011-11-19
      相关资源
      最近更新 更多