我在XE2上遇到了一个奇怪的问题:
我正在使用HWND_TOPMOST和SetWindowPos来设置我的表单在顶部,但是如果我在运行时切换VCL样式,窗口不再是最上面的,取消设置/重新设置它也不能修复它。
有什么办法解决这个问题吗?
发布于 2012-05-10 08:35:23
您的问题是由于样式更改而重新创建表单,并且由于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修复了这个问题。
发布于 2012-05-10 08:50:45
在控件上设置新样式会导致重新创建控件的窗口句柄,因此必须再次应用HWND_TOPMOST。
发布于 2017-08-24 19:55:03
在互联网和Delphi帮助中找了很长时间也没有解决方案后,我尝试了几个不同的代码,几个提示,所有这些都没有任何效果,问题仍然存在。看着帮助,我决定测试下面的简单代码,它们对我来说工作得很好。
procedure TForm1.FormShow(Sender: TObject);
begin
Application.RestoreTopMosts;
end;https://stackoverflow.com/questions/10525823
复制相似问题