2012-05-10 58 views
7

我遇到XE2一個奇怪的問題後:德爾福XE2,如何保持形式之上改變VCL風格

我使用HWND_TOPMOST與SetWindowPos設置我的最佳狀態,但是如果我切換VCL風格在運行時,窗口不再是最頂層的,並且取消設置/重新設置它也不能修復它。

有什麼辦法解決這個問題?

+0

聽起來像一個錯誤。您應該將此報告給[QC](http://qc.embarcadero.com/)。 –

+0

@MasonWheeler這不是一個bug,這是vcl樣式如何工作的方式,每當你改變一個vcl樣式時,表單的句柄被重新創建。 – RRUZ

+0

@RRUZ:根據OP的原始描述,重新設置屬性不適用於樣式,如果它是真的,那肯定會是一個錯誤。 (請參閱OP對Sertac回答的評論,以更好地解釋實際發生的事情。) –

回答

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再次修復它。

+0

謝謝。你是對的,重新設置它實際上是有效的。問題在於窗口句柄是不同的,因爲在改變VCL樣式以克服不同的問題之後我調用了RecreateWnd,所以我用一個現在無效的句柄調用了SetWindowPos。 – hikari

+0

@hikari - 不客氣! –

5

在控件上設置新樣式會導致控件的窗口句柄被重新創建,因此HWND_TOPMOST必須重新應用。

0

經過在互聯網上和德爾福的長時間搜索幫助沒有解決方案,我嘗試了幾個不同的代碼,幾個提示,所有這些都沒有任何影響,問題依然存在。看着這個幫助,我決定測試下面的簡單代碼,這對我來說非常合適。

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