Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi XE2,如何在更改VCL样式后保持窗体在顶部_Delphi_Delphi Xe2_Vcl Styles - Fatal编程技术网

Delphi XE2,如何在更改VCL样式后保持窗体在顶部

Delphi XE2,如何在更改VCL样式后保持窗体在顶部,delphi,delphi-xe2,vcl-styles,Delphi,Delphi Xe2,Vcl Styles,我在XE2中遇到了一个奇怪的问题: 我正在使用HWND_TOPMOST和SetWindowPos将我的表单设置在顶部,但是如果我在运行时切换VCL样式,窗口就不再是最顶部的,取消设置/重新设置也无法修复它 有没有办法解决这个问题?您的问题是,由于样式更改,表单正在重新创建,并且由于VCL不知道这一点,表单失去了最顶层的样式。或使用: FormStyle := fsStayOnTop; 或者重写CreateWindowHandle,以便在每次重新创建表单时调用SetWindowPos: typ

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

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


有没有办法解决这个问题?

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

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

在internet上进行了长时间搜索,在没有解决方案的Delphi帮助中,我尝试了几个不同的代码、几个技巧,所有这些都没有任何效果,问题依然存在。看着这些帮助,我决定测试下面的简单代码,这些代码非常适合我

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

听起来像个虫子。您应该将此报告给@MasonWheeler这不是一个bug,这是vcl样式的工作方式,每次更改vcl样式时,表单的句柄都会重新创建。@RRUZ:根据OP的原始描述,重新设置属性与启用样式不起作用,如果这是真的,那肯定是一个bug。(请参阅OP对Sertac回答的评论,以更好地解释实际发生的情况。)谢谢。你是对的,重新设置它实际上是有效的。问题是窗口句柄不同,因为我在更改VCL样式以克服不同的问题后调用了RecreateWnd,所以我使用一个现在无效的句柄调用SetWindowPos。