LCL: Improved TListView selection handling. Issue #34877, patch from Yuriy Sydorov.

git-svn-id: trunk@60703 -
This commit is contained in:
juha 2019-03-16 19:37:04 +00:00
parent 3b6eb99826
commit a8026f0983

View File

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