首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi XE2,如何在改变VCL样式后保持表单在顶部

Delphi XE2,如何在改变VCL样式后保持表单在顶部
EN

Stack Overflow用户
提问于 2012-05-10 08:02:21
回答 3查看 1.2K关注 0票数 7

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-10 08:35:23

您的问题是由于样式更改而重新创建表单,并且由于VCL对此一无所知而丢失了其最顶层的样式。使用以下两种方法:

代码语言:javascript
运行
复制
FormStyle := fsStayOnTop; 

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

代码语言:javascript
运行
复制
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修复了这个问题。

票数 8
EN

Stack Overflow用户

发布于 2012-05-10 08:50:45

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

票数 5
EN

Stack Overflow用户

发布于 2017-08-24 19:55:03

在互联网和Delphi帮助中找了很长时间也没有解决方案后,我尝试了几个不同的代码,几个提示,所有这些都没有任何效果,问题仍然存在。看着帮助,我决定测试下面的简单代码,它们对我来说工作得很好。

代码语言:javascript
运行
复制
procedure TForm1.FormShow(Sender: TObject);
begin
  Application.RestoreTopMosts;
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10525823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档