2012-03-18 160 views
4

我的應用程序使用TButtonGroup控件。我爲每個按鈕分配一個事件處理程序:doClick。通過分配信息到每個按鈕(Pointer (i)),我可以找出哪個按鈕被調用。這是代碼:有沒有辦法找出TButtonGroup的哪個按鈕被點擊?

procedure TVector_Menu.Synchronize (rows, cols: Int32); 
var btn: TGrpButtonItem; 
    i: Int32; 
begin 
    ButtonGroup.Items.Clear; 
    Self.Rows := rows; 
    Self.Cols := cols; 
    for i := 0 to rows * cols - 1 do 
    begin 
     btn := Buttongroup.Items.Add; 
     btn.Data  := Pointer (i); 
     btn.ImageIndex := i; 
     btn.OnClick := doClick; 
    end; // for 
    Self.ClientHeight := 4 + rows * ButtonGroup.ButtonHeight; 
    Self.ClientWidth := 22 + cols * ButtonGroup.ButtonWidth; 
end; // Synchronize // 

procedure TVector_Menu.doClick (Sender: TObject); 
var btn: TGrpButtonItem; 
    i, r, c: Int32; 
begin 
    btn := (Sender as TGrpButtonItem); // @@@ TButtonGroup 
    i := Int32 (btn.Data); 
    get_rc (i, r, c); 
    if Assigned (FOnClick) 
     then FOnClick (Sender, @FButton_Matrix [r, c]); 
end; // doClick // 

當doClick叫我在行標記爲得到一個無效的類型轉換「@@@」。當我爲btn和類型轉換使用TButtonGroup時,類型轉換是正確的,但是這個類型不包含數據屬性,並且不會有太大的用處。

作爲測試,我爲TButtonGroup控件分配了一個OnClick事件處理程序,並且我注意到當我單擊一個按鈕時,首先調用按鈕事件處理程序,然後調用TButtonGroup,其中包含按鈕,事件處理程序。

問題:有沒有辦法找出TButtonGroup的哪個按鈕被點擊?

在Windows 7/64

回答

7

用Delphi XE你得到了一個無效的類型轉換異常,因爲Sender實際上是在TButtonGroup,而不是一個TGrpButtonItem。這意味着如果您打算使用TGrpButtonItem.OnClick,則需要爲每個按鈕使用不同的事件處理程序。

在你的情況下,顯然你應該使用TButtonGroup.OnButtonClicked事件,它提供按鈕索引。

然而,這裏有一個潛在的缺陷,你需要確保你避免。 documentation指出:

單擊按鈕時發生,如果OnClick事件不存在。

換句話說,OnButtonClicked事件只如果你沒有指定一個OnClick事件處理程序,無論是按鈕組或按鈕項火災。

+0

嗯,我看到我可能應該使用'ButtonGroupButtonClicked'。那個返回一個索引。開始嘗試。 – Arnold 2012-03-18 20:02:04

相關問題