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.
相关产品推荐
相关产品推荐

