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

Delphi FMX TListView DynamicAppearance模式OnItemClickEx访问冲突求助

Fix Access Violation in TListView OnItemClickEx with DynamicAppearance

我之前遇到过完全一样的问题!根源非常明确:当你点击列表项的空白区域,或者列表中没有列表项的空白部分时,OnItemClickEx事件的ItemObject参数会是nil,这时候直接访问ItemObject.Name就会触发Access Violation。

问题原因

使用TDynamicAppearance的TListView时,只有当点击到具体的可绘制对象(也就是你定义的Text1、Text2这类TListItemDrawable)时,ItemObject才会指向对应的实例。如果点击的是列表项中没有被任何Drawable覆盖的空白区域,或者列表本身的空白(没有列表项的地方),ItemObject就会是nil,直接访问它的属性必然导致内存访问错误。

解决方案

只需要在访问ItemObject的任何属性之前,先通过Assigned()函数检查它是否不为nil。如果需要更严谨的处理,还可以先判断ItemIndex是否为-1(点击列表空白区域时ItemIndex会是-1)。

修改你的OnItemClickEx事件代码如下:

procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer; const LocalClickPos: TPointF; const ItemObject: TListItemDrawable);
begin
  // 先判断是否点击了有效的列表项(排除列表空白区域)
  if ItemIndex <> -1 then
  begin
    // 再检查ItemObject是否有效,避免访问空指针
    if Assigned(ItemObject) then
    begin
      if ItemObject.Name = 'Text1' then
      begin
        ShowMessage('clicked on Text1');
      end
      else if ItemObject.Name = 'Text2' then
      begin
        ShowMessage('clicked on Text2');
      end;
    end;
    // 可选:这里可以添加点击列表项空白区域的处理逻辑
    // else ShowMessage('clicked on empty part of list item');
  end;
end;

为什么OnButtonClick没问题?

因为OnButtonClick事件和列表项的点击逻辑完全无关,它不会传递可能为nil的ItemObject参数,自然不会触发这类空指针错误。

内容的提问来源于stack exchange,提问作者Peter W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:42:38