Witam, mam taki mały problem, z którym nie mogę sobie poradzić, być może ktoś mi pomoże. Używam tego unitu do obsługi ListView w trybie virtualnym. Wszystko działa jak należy, ale brakuje mi jednej rzeczy - chodzi o sprawdzenie czy item jest zaznaczony (vLV.Items[x].Selected). Dodałem brakujące wpisy, ale robię coś źle bo wywala mi access violation gdy chce sprawdzić item.

Dodalem:

 
type
  TVirtualItem      =  class(TCollectionItem)
  private
     FOwner: TListItems;
  protected
     function GetHandle: HWND;
     function GetListView: TCustomListView;
	 function GetState(Index: Integer): Boolean;
	 procedure SetState(Index: Integer; State: Boolean);
  public
     property Owner: TListItems read FOwner;
     property ListView: TCustomListView read GetListView;
     property Handle: HWND read GetHandle;
	 property Selected: Boolean index 3 read GetState write SetState;
  end;
  
function TVirtualItem.GetListView: TCustomListView;
begin
  Result := Owner.Owner;
end;

function TVirtualItem.GetHandle: HWND;
begin
  Result := ListView.Handle;
end;

function TVirtualItem.GetState(Index: Integer): Boolean;
var
  Mask: Integer;
begin
  case Index of
    0: Mask := LVIS_CUT;
    1: Mask := LVIS_DROPHILITED;
    2: Mask := LVIS_FOCUSED;
    3: Mask := LVIS_SELECTED;
    4: Mask := LVIS_ACTIVATING;
  else
    Mask := 0;
  end;
  Result := ListView_GetItemState(Handle, Self.Index, Mask) and Mask <> 0;
end;

procedure TVirtualItem.SetState(Index: Integer; State: Boolean);
var
  Mask: Integer;
  Data: Integer;
begin
  case Index of
    0: Mask := LVIS_CUT;
    1: Mask := LVIS_DROPHILITED;
    2: Mask := LVIS_FOCUSED;
    3: Mask := LVIS_SELECTED;
    4: Mask := LVIS_ACTIVATING;
  else
    Mask := 0;
  end;
  if State then Data := Mask
  else Data := 0;
  ListView_SetItemState(Handle, Self.Index, Data, Mask);
end;

(Objętość tego unitu jest spora i nie wiem czy powinienem dać linki czy wstawić całość w posta. Przepraszam jeśli robie żle.)

Oryginalny kod

Zmieniony