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;
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);