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

RAD Studio中运行时修改ListView项Accessory按钮样式报访问错误如何解决

访问冲突报错原因
  • 类型转换错误:ListView1.Items[ItemIndex].View.FindObject('Acc') 返回的是Accessory按钮对应的样式对象,不是TListView类型,强制类型转换直接触发内存访问错误
  • StyleLookup参数错误:StyleLookup属性需要绑定你提前定义的样式资源名,不是内嵌的图片文件名,你预设的选中态样式名是accessorymoreselected,常态样式名是accessorymore,不能填写Selected.png
正确实现步骤
  1. 首先在ListViewItemClickEx事件中先判断点击区域是否为Accessory按钮,避免其他区域点击误触发
  2. 使用FindStyleResource获取Accessory按钮的样式对象,无需强制转换为TListView
  3. 切换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:24:06