2017-05-31 44 views
-1

如果我在窗體上有20個面板(不是動態的),並且想要在鼠標懸停在它們上面時更改它們的顏色,我可以使用self.color?我試過這個,但它改變了窗體的顏色。有人建議我嘗試使用panel1.assign(panel1)將每個面板分配給自己,但有一個錯誤表示TPanel不能分配給自己。我也試過Form1.free,但那也沒有幫助。是否可以使用.self來創建未動態創建的組件?

我是否必須動態創建面板才能使用Self或者有其他方法嗎?

+0

我不明白。你爲什麼會認爲['Self'](http://www.delphibasics.co.uk/RTL.asp?Name=Self)能以某種方式知道你想引用面板? 'Self' * always *引用代碼的當前類上下文。我也不知道你爲什麼認爲動態創建它們會讓你使用'Self'。這更不適用。我無法看到使用「Self」和在表單上創建面板之間的任何相關性。 –

+0

我以爲'Self'是指代碼所在的組件,我在面板的OnMouseEnter事件中改變它們的顏色。有沒有一種方法可以根據編寫代碼的組件事件來引用組件? – User09871

+1

'自我'是指當前的實例。我猜你的情況會涉及到一個表格。不是你想要的。這不幸是一個XY問題。你問到「Self」,但我們沒有告訴你關於「Self」的幫助,因爲它不是真正問題的解決方案。詢問真正的問題。不要問你的非工作解決方案。 –

回答

-1

試試這個:

type 
    TPanel = class(Vcl.ExtCtrls.TPanel) 
    protected 
    procedure MouseEnter; override; 
    procedure MouseLeave; override; 
    end; 

implementation 

procedure TPanel.MouseEnter; 
begin 
    inherited; 
    Color := clBlack; 
end; 

procedure TPanel.MouseLeave; 
begin 
    inherited; 
    Color := clBtnFace; 
end; 
+3

或者使用'Sender'參數來對應'OnXXX'事件 –

+0

事實上,同一單元中的其他面板呢? –

+0

@Jerry,真的。我會刪除這篇文章以支持其他答案,但它已被鎖定。 – Victoria

5

假設你要分配在設計時OnMouse(Enter|Leave)事件處理程序,處理程序將屬於你的TForm類,這就是爲什麼Self指針指在Form對象在運行時。使用處理程序的Sender參數來代替,它指向實際觸發事件的對象,例如:

procedure TMyForm.Panel1MouseEnter(Sender: TObject); 
begin 
    TPanel(Sender).Color := ...; 
end; 

procedure TMyForm.Panel1MouseLeave(Sender: TObject); 
begin 
    TPanel(Sender).Color := ...; 
end; 
相關問題