Delphi ControlListButton.OnClick事件如何获取所属ControlList的AIndex
关于能否直接使用ClientDataSet.RecNo的说明
不能直接用ClientDataSet.RecNo作为点击行的索引。ClientDataSet.RecNo仅在BeforeDrawItem事件触发时被赋值为当前正在绘制条目的AIndex,绘制时机和点击触发时机完全独立,尤其是列表经过滚动、重绘之后,ClientDataSet的当前行和你点击的条目没有对应关系,取值会完全错位。
推荐的获取AIndex的方法
优先用控件Tag属性存储索引,实现最简单稳定:
- 在
BeforeDrawItem事件中给当前条目的按钮Tag属性赋值为当前AIndex:
procedure TFormCalendarViewMonthly.ControlListDayBeforeDrawItem( AIndex: Integer; ACanvas: TCanvas; ARect: TRect; AState: TOwnerDrawState); begin clientDataSet.RecNo:=AIndex; // 新增代码:给当前条目对应的按钮存储索引 ControlListButton.Tag := AIndex; // 原有其他逻辑 etc.. end;
- 在按钮点击事件中直接从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
相关产品推荐
相关产品推荐

