You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi ControlListButton.OnClick事件如何获取所属ControlList的AIndex

关于能否直接使用ClientDataSet.RecNo的说明

不能直接用ClientDataSet.RecNo作为点击行的索引。ClientDataSet.RecNo仅在BeforeDrawItem事件触发时被赋值为当前正在绘制条目的AIndex,绘制时机和点击触发时机完全独立,尤其是列表经过滚动、重绘之后,ClientDataSet的当前行和你点击的条目没有对应关系,取值会完全错位。


推荐的获取AIndex的方法

优先用控件Tag属性存储索引,实现最简单稳定:

  1. 在BeforeDrawItem事件中给当前条目的按钮Tag属性赋值为当前AIndex:
procedure TFormCalendarViewMonthly.ControlListDayBeforeDrawItem(
  AIndex: Integer; ACanvas: TCanvas; ARect: TRect; AState: TOwnerDrawState);
begin
  clientDataSet.RecNo:=AIndex;
  // 新增代码:给当前条目对应的按钮存储索引
  ControlListButton.Tag := AIndex;
  // 原有其他逻辑
  etc..
end;
  1. 在按钮点击事件中直接从Sender取出Tag即可得到对应AIndex:
procedure TFormCalendarViewMonthly.ControlListButtonClick(Sender: TObject);
var
  AIndex: Integer;
begin
  AIndex := (Sender as TControlListButton).Tag;
  // 后续可直接用AIndex操作,比如 clientDataSet.RecNo := AIndex;
end;

其他备选方案

如果不想用Tag属性,也可以通过点击坐标反查索引:先获取按钮在ControlList中的相对坐标,调用ControlList.GetItemAtPos方法得到对应AIndex,但实现复杂度比Tag方案高,没有特殊需求优先用Tag方案即可。

内容的提问来源于stack exchange,提问作者L. Piotrowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:36:07