2013-08-18 78 views
-6

我有這樣的代碼:事件處理不運行

procedure TForm1.Button1Click(Sender: TObject); 
var 
    X: Integer; 
begin 
    for x := 1 to 5 do 
    if Sender = Botones[x] then //Valida el Boton que provoco el evento 
    begin 
     Codigo := x; //Captura la posicion donde se eonctro el objeto que generó el evento 
     // ShowMessage(IntToStr(x)); 
     Exit; //sale del bucle 
    end; 
end; 

當我嘗試這在本身是一個形式的測試項目,它的工作原理。但是,如果我在我的項目中使用它,它有幾種形式,它什麼都不做。

TButton類型的數組,稱爲Botones,我指定數組的按鈕控件 一個的每一個位置,就像這樣:

Botones[1] := Button1; 
Botones[2] := Button2; 
Botones[3] := Button3; 
Botones[4] := Button4; 
Botones[5] := Button5; 

爲什麼在一個空的測試項目做這項工作,但不是在我的活動項目?

+2

請提供一個SSCCE –

回答

3

您必須將事件分配給按鈕。在'正常'情況下,您雙擊一個按鈕並生成事件處理程序。此事件處理程序方法也被分配給按鈕的OnClick事件。你可以在對象檢查器中看到這個,當你選擇按鈕並切換到標籤'事件'。

如果您有多個按鈕跨多個窗體,您可能需要明確地將該事件分配給按鈕。你可以這樣做:

  • 在對象檢查器中,通過轉到OnClick事件並選擇一個現有的處理程序,而不是雙擊該按鈕。
  • 代碼如下:

    Button2.OnClick:= Form1.Button1Click;

雖然這可能會解決你的眼前的問題,我會建議反對它。一般來說,我認爲你不應該有多個GUI對象的事件處理程序。如果你想這樣做,看看TActionList和TAction。另外,我想知道爲什麼你需要知道首先點擊了哪個按鈕。如果您根據按鈕需要不同的代碼路徑,則可能需要不同的事件處理程序。如果您需要知道是否點擊了這5個按鈕中的任何一個,請不要將該事件分配給任何其他控件。

+0

我有5個問題,用戶通過首先點擊一個按鈕,然後點擊面板上有答案,這是爲匹配的問題/答案,如果選擇了正確的一個複選標記顯示我做了一個事件,然後爲每個按鈕選擇一個,這個按鈕適用於當我自己創建一個表單時,但是當我在一個具有多種表單的程序中使用它時,它不起作用。 – infospy

+0

@infospy是的,你已經說過了。所以,請再次提供和SSCCE。 –

+0

我覺得這個問題可以刪除,對不起,我認爲發佈整件事情太長了。它爲什麼會在表單上自行工作,而不是在實際項目中工作的原因是我調用表單的方式,不知何故發送方沒有返回任何東西......當我改變表單的操作順序時(我已經設置了第一個創建,然後隱藏活動表單,當我改變它的代碼行的順序立即。感謝您的幫助。 – infospy