我的应用程序使用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 //
Run Code Online (Sandbox Code Playgroud)
当调用doClick时,我在标有"@@@"的行上获得了一个无效的类型转换.当我使用TButtonGroup作为btn以及类型转换时,类型转换是正确的,但是这个不包含数据属性,并且无论如何都不会有太多用处.
作为测试,我为TButtonGroup控件分配了一个OnClick事件处理程序,我注意到当我单击一个按钮时,首先调用按钮事件处理程序,然后调用包含按钮事件处理程序的TButtonGroup.
问题:有没有办法找出TButtonGroup的哪个按钮被点击了?
在Windows 7/64上使用Delphi XE
你得到一个无效的类型转换异常,因为Sender实际上是TButtonGroup和不是TGrpButtonItem.这意味着如果要使用,则需要为每个按钮使用不同的事件处理程序TGrpButtonItem.OnClick.
在您的情况下,您应该使用TButtonGroup.OnButtonClicked提供按钮索引的事件.
但是,这里有一个潜在的缺陷,你需要确保避免.该文件规定:
单击按钮时发生,如果OnClick事件不存在.
换句话说,OnButtonClicked只有在您没有OnClick为按钮组或按钮项指定事件处理程序时,才会触发事件.
| 归档时间: |
|
| 查看次数: |
2139 次 |
| 最近记录: |