我遇到XE2一個奇怪的問題後:德爾福XE2,如何保持形式之上改變VCL風格
我使用HWND_TOPMOST與SetWindowPos設置我的最佳狀態,但是如果我切換VCL風格在運行時,窗口不再是最頂層的,並且取消設置/重新設置它也不能修復它。
有什麼辦法解決這個問題?
我遇到XE2一個奇怪的問題後:德爾福XE2,如何保持形式之上改變VCL風格
我使用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
再次修復它。
謝謝。你是對的,重新設置它實際上是有效的。問題在於窗口句柄是不同的,因爲在改變VCL樣式以克服不同的問題之後我調用了RecreateWnd,所以我用一個現在無效的句柄調用了SetWindowPos。 – hikari
@hikari - 不客氣! –
在控件上設置新樣式會導致控件的窗口句柄被重新創建,因此HWND_TOPMOST
必須重新應用。
經過在互聯網上和德爾福的長時間搜索幫助沒有解決方案,我嘗試了幾個不同的代碼,幾個提示,所有這些都沒有任何影響,問題依然存在。看着這個幫助,我決定測試下面的簡單代碼,這對我來說非常合適。
procedure TForm1.FormShow(Sender: TObject);
begin
Application.RestoreTopMosts;
end;
聽起來像一個錯誤。您應該將此報告給[QC](http://qc.embarcadero.com/)。 –
@MasonWheeler這不是一個bug,這是vcl樣式如何工作的方式,每當你改變一個vcl樣式時,表單的句柄被重新創建。 – RRUZ
@RRUZ:根據OP的原始描述,重新設置屬性不適用於樣式,如果它是真的,那肯定會是一個錯誤。 (請參閱OP對Sertac回答的評論,以更好地解釋實際發生的事情。) –