diff --git a/lcl/include/customlistview.inc b/lcl/include/customlistview.inc index 8753dfe949..bee29bf33f 100644 --- a/lcl/include/customlistview.inc +++ b/lcl/include/customlistview.inc @@ -301,7 +301,10 @@ begin end; LVN_ITEMCHANGED: begin - Item := Items[nm^.iItem]; + if nm^.iItem < 0 then + Item := nil + else + Item := Items[nm^.iItem]; //DebugLn('TCustomListView.CNNotify Count=',dbgs(Items.Count),' nm^.iItem=',dbgs(nm^.iItem),' destroying=',dbgs(lifDestroying in Item.FFlags)); if (Item <> nil) and (not OwnerData) and (lifDestroying in Item.FFlags) then begin @@ -311,8 +314,6 @@ begin InvalidateSelected; end else begin - // owner data - Change(Item, nm^.uChanged); if (nm^.uChanged = LVIF_STATE) then begin // checkbox @@ -340,12 +341,13 @@ begin // select state changed if (nm^.uNewState and LVIS_SELECTED) = 0 then begin - if not OwnerData and (FSelected = Item) then - InvalidateSelected - else if OwnerData and (nm^.iItem=FSelectedIdx) then - InvalidateSelected; - if nm^.iItem > -1 then - DoSelectItem(Item, False); + if not OwnerData then + begin + if FSelected = Item then + InvalidateSelected + end else + if (nm^.iItem < 0) or (nm^.iItem = FSelectedIdx) then + InvalidateSelected; end else begin FSelected := Item; @@ -355,11 +357,13 @@ begin FSelectedIdx:=nm^.iItem; end; //DebugLn('TCustomListView.CNNotify FSelected=',dbgs(FSelected)); - if nm^.iItem > -1 then - DoSelectItem(Item, True); end; + Change(Item, nm^.uChanged); + DoSelectItem(Item, (nm^.uNewState and LVIS_SELECTED) <> 0); end; - end; + end + else + Change(Item, nm^.uChanged); end; end; // LVN_GETINFOTIP: @@ -606,7 +610,8 @@ end; {------------------------------------------------------------------------------} procedure TCustomListView.DoSelectItem(AItem: TListItem; ASelected: Boolean); begin - AItem.Selected:=ASelected; + if Assigned(AItem) then + AItem.Selected:=ASelected; if Assigned(FOnSelectItem) and ([lffItemsMoving, lffItemsSorting] * FFlags = []) then FOnSelectItem(Self, AItem, ASelected);