我在XE2遇到了一个奇怪的问题:
我正在使用HWND_TOPMOST和SetWindowPos将表单设置在顶部,但如果我在运行时切换VCL样式,则窗口不再是最顶层的,并且取消设置/重新设置它也不会修复它。
有什么方法可以解决这个问题吗?
答案 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;