我有兩個100%重疊面板上的不同內容的窗體上。
默認情況下,第一個(靜態顯示信息)應該是可見的,但如果用戶將鼠標移動到兩個位置附近,則另一個(用戶交互)應該替換它 - 如果鼠標移開,它應該切換回來。
事情是這樣的:是否有像「Form1.MousePreview:= true」這樣的解決方法?
if (*the mouse is near*) then
begin
Panel1.Hide;
Panel2.Show;
end
else
begin
Panel2.Hide;
Panel1.Show;
end;
我的問題是:在哪裏可以捕捉鼠標移動?
每個組件都有自己的OnMouseMove
處理程序 - 當然我可以將它們轉發給表單處理程序,但我寧願讓它更優雅一些(並且更易於維護)。
完美的解決方案就像Form1.MousePreview := true;
。
另一種解決方案是分配一個通用的處理程序,該處理程序可以轉換座標並調用表單處理程序;分配可以在FormCreate中完成。
但這並不像看起來那麼容易,因爲一個TImage已經擁有自己的鼠標事件處理程序。
我試過OnMouseEnter
和OnMouseLeave
的兩個面板,但它沒有奏效; #1消失了,但#2沒有出現。我想這是因爲如果鼠標離開Panel2,它應該消失 - 但是如果它進入一個按鈕,它也會離開它。
這就是爲什麼我想使用基於座標的方法使檢查更可靠。
也許這兩個面板方法是完全錯誤的?
更新:是的,正如雷米所說的那樣。
我現在正在使用TJVPageList,因爲TPageControl具有可視選項卡。
PageList的OnMouseEnter
處理程序設置一頁,OnMouseLeave
設置另一頁;但是,一旦鼠標移動到PageList上,兩個頁面都會閃爍。 我曾嘗試將事件處理程序添加到每個頁面,但這沒有什麼區別。
我應該檢查全部OnMouseEnter
/Leave
事件來過濾掉PageList,這兩個頁面和坐在頁面上的所有組件?
另一個更新:我現在使用的是TPageControl,但行爲是類似的。
它不閃爍,但如果我將鼠標移動到TPageControl上,則根本不會顯示任何TTabSheet。
只有當我按下鼠標左鍵時,纔會顯示UI表單。如果我移開鼠標,另一張紙正常顯示。 (如果我按下鼠標左鍵,TJVPageList也會顯示UI頁面。)
我已經使用TPageControl和兩個TTabSheets的鼠標事件處理程序(輸入/離開)。
更新3: 完成它。 靜態面板/ TabSheet/JvStandardPage(#1)不得觸發OnMouseLeave
處理程序。
您可以通過將每個「TTabSheet」的「TabVisible」屬性設置爲false來關閉「TPageControl」的選項卡。 –
非常感謝你 - 我正在TPageControl本身上尋找這個屬性。 – Pharaoh