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