2012-03-18 135 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

相关问题