RAD Studio中运行时修改ListView项Accessory按钮样式报访问错误如何解决
访问冲突报错原因
- 类型转换错误:
ListView1.Items[ItemIndex].View.FindObject('Acc')返回的是Accessory按钮对应的样式对象,不是TListView类型,强制类型转换直接触发内存访问错误 - StyleLookup参数错误:
StyleLookup属性需要绑定你提前定义的样式资源名,不是内嵌的图片文件名,你预设的选中态样式名是accessorymoreselected,常态样式名是accessorymore,不能填写Selected.png
正确实现步骤
- 首先在
ListViewItemClickEx事件中先判断点击区域是否为Accessory按钮,避免其他区域点击误触发 - 使用
FindStyleResource获取Accessory按钮的样式对象,无需强制转换为TListView - 切换
StyleLookup时直接使用预设的两个样式名即可
示例代码
procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer; const LocalClickPos: TPointF; const ItemObject: TListItemDrawable); var AccBtn: TStyleObject; begin // 校验点击对象是否为Accessory按钮 if (ItemObject <> nil) and (ItemObject.Name = 'Acc') then begin // 获取对应列表项的Accessory样式对象 AccBtn := ListView1.Items[ItemIndex].View.FindStyleResource('Acc') as TStyleObject; if Assigned(AccBtn) then begin // 双向切换样式 if AccBtn.StyleLookup = 'accessorymore' then AccBtn.StyleLookup := 'accessorymoreselected' else AccBtn.StyleLookup := 'accessorymore'; end; end; end;
注意事项
- 如果列表项需要滚动复用,建议给
TListItem增加自定义字段存储选中状态,不要仅靠StyleLookup判断,避免滚动后样式错乱 - 确保
accessorymore和accessorymoreselected两个样式已经提前添加到当前窗体绑定的StyleBook中,运行时找不到样式也会触发异常
内容的提问来源于stack exchange,提问作者Liba Drako
相关产品推荐
相关产品推荐

