Delphi 有没有办法找出TButtonGroup的哪个按钮被单击?

Delphi 有没有办法找出TButtonGroup的哪个按钮被单击?,delphi,button,Delphi,Button,我的应用程序使用TButtonGroup控件。我为每个按钮分配一个事件处理程序:doClick。通过将信息分配给每个按钮(指针(i)),我可以确定调用了哪个按钮。代码如下: procedure TVector_Menu.Synchronize (rows, cols: Int32); var btn: TGrpButtonItem; i: Int32; begin ButtonGroup.Items.Clear; Self.Rows := rows; Self.Col

我的应用程序使用TButtonGroup控件。我为每个按钮分配一个事件处理程序:doClick。通过将信息分配给每个按钮(
指针(i)
),我可以确定调用了哪个按钮。代码如下:

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以及在typecast中使用时,typecast是正确的,但是这一个不包含数据属性,并且无论如何也没有多大用处

作为测试,我为TButtonGroup控件分配了一个OnClick事件处理程序,我注意到当我单击一个按钮时,首先调用按钮事件处理程序,然后调用包含按钮的TButtonGroup事件处理程序

问题:有没有办法找出TButtonGroup的哪个按钮被点击了


在Windows 7/64上使用Delphi XE时,会出现无效的类型转换异常,因为
发送方
实际上是
TButtonGroup
而不是
TGrpButtonItem
。这意味着,如果要使用
TGrpButtonItem.OnClick
,则需要为每个按钮使用不同的事件处理程序

在您的情况下,显然应该使用提供按钮索引的事件

然而,这里有一个潜在的陷阱,您需要确保避免。各国:

如果OnClick事件不存在,则在单击按钮时发生

换句话说,
OnButtonClicked
事件只有在未为按钮组或按钮项分配
OnClick
事件处理程序时才会触发

使用

procedure TfrmFattern.ButtonGroup1ButtonClicked(Sender: TObject;
  Index: Integer);
begin
  StatusBar1.SimpleText:= IntToStr(Index+1);
end;

啊,我知道我可能应该用
按钮组按钮点击
。这个函数返回一个索引。开始尝试吧。