2009-12-12 46 views

回答

3

是的。每個普通的方法調用都包含一個隱藏的「Self」,它指向對象。但在事件處理程序中,「Self」是表單,而不是按鈕。該按鈕是發件人,你必須使用類似Sender as TButton的類型來對它進行類型轉換。

+1

這不是一種轉換嗎?它更重要的是重新記憶記憶。 – 2009-12-12 12:29:52

+4

http://tech.turbu-rpg.com/56/as-sertion-casting **由於**是一個強制轉換,而不是轉換,但它會檢查以確保您的類型正確並引發異常除此以外。 – 2009-12-12 12:35:04

2

您需要使用發件人。

(Sender as TButton).Enabled := False; 

禁用將此事件處理程序分配給其onclick事件的任何按鈕。演員也可以做

TButton(Sender).Enabled := False; 

但在這種情況下,你需要100%該發件人是一個按鈕。使用as作爲在演員之前引入了一個檢查,所以稍微慢一點,但是在這種類型的例子中我並不是真正的問題。

+1

As-casting基本上將鏈接列表從對象的實際類型移動到要投射的類型,以查找匹配項。如果你在一個緊密的循環中執行它,並且「類型」是高於實際類型的多個繼承級別,它可以給予一定的性能影響,但除此之外,您可能永遠不會注意到它。 – 2009-12-12 13:54:47

1

你可以做這樣的事情:

procedure OnClickButton(Sender: TObject); 
var btn: TButton; 
begin 
    if Sender is TButton then btn := TButton(mycontrol) 
    else 
     exit; 
    //and then use btn as just another button control 
end; 

並指定同一事件不同的控制,你可以這樣做:

if mycontrol is TButton then 
    TButton(mycontrol).OnClick := OnClickButton; 
0

考慮從按鈕「斷開」自己,用行動。在你的表格中填入一個動作列表,右鍵單擊它並「添加」和動作。爲它命名,爲它添加標題(就像它是一個按鈕,說),然後將其OnExecute事件連接到你的代碼。最後,轉到您的按鈕並點擊「操作」屬性並提名您的新操作。當你點擊按鈕時,你的代碼被執行。

爲什麼這很有用?嗯: 1.您不會失去對代碼的訪問權限,當您刪除按鈕並將其替換爲TPopupMenu時,通常會發生這種情況。 2.一個動作可以從幾個地方,多個按鈕或菜單啓動。 3.更好的是,填寫行動的「的OnUpdate」事件的東西,如:

procedure TForm1.MyActionOnUpdate(ASender : TObject); 
begin 
    With Sender as TAction do 
    Enabled := ItsPossibleToRunMyCode; 
end; 

的代碼將啓用和禁用使用沒有你需要做什麼這個動作的任何控制這一點。