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