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

pgky5nke  于 2022-10-16  发布在  其他
关注(0)|答案(2)|浏览(187)

我的应用程序使用TButtonGroup控件。我为每个按钮分配了一个事件处理程序:doClick。通过将信息分配给每个按钮(Pointer (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以及在类型转换中使用TButtonGroup时,类型转换是正确的,但这个不包含数据属性,而且无论如何它都不会有太大用处。
作为一项测试,我为TButtonGroup控件分配了一个onClick事件处理程序,并注意到当我单击按钮时,首先调用按钮事件处理程序,然后调用包含按钮的TButtonGroup事件处理程序。
问:有没有办法找出TButtonGroup的哪个按钮被点击了?
在Windows 7/64上使用Delphi XE

cgvd09ve

cgvd09ve1#

您会得到无效的类型转换异常,因为Sender实际上是TButtonGroup,而不是TGrpButtonItem。这意味着,如果要使用TGrpButtonItem.OnClick,则需要为每个按钮使用不同的事件处理程序。
在您的情况下,显然应该使用TButtonGroup.OnButtonClicked事件,它确实提供了按钮索引。
然而,这里有一个潜在的陷阱,你需要确保避免。documentation声明:
如果onClick事件不存在,则在单击按钮时发生。
换句话说,只有当您没有为按钮组或按钮项分配OnClick事件处理程序时,才会触发OnButtonClicked事件。

kknvjkwl

kknvjkwl2#

使用..。

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

相关问题