So wie der Quelltext der Checklistbox aussieht ist das ganz nicht vorgesehen das jemand auf virtuell stellt.
Eine direkte Abfrage ob checked bzw. des State gibt es nicht. Das läuft (wie himitsu bereits erwähnt hat) intern alles über einen Wrapper. Und dieser wird per lb_setitemdata gesetzt und über lb_getitemdata abgefragt. Bei Virtual hat lb_setitemdata allerdings keinen Effekt so das man selbst auf die messages reagieren müsste.
Unvollständiges Beispiel (auf Löschen von Items wird zum Beispiel nicht reagiert):
Delphi-Quellcode:
TCheckListbox =
class(
vcl.CheckLst.TCheckListBox)
private
fDict: TDictionary<Integer,TListBoxItemData>;
procedure LBGetItemData(
var amsg: TMessage);
message LB_GETITEMDATA;
procedure LBSetItemData(
var amsg: TMessage);
message LB_SETITEMDATA;
public
constructor Create(aOwner: TComponent);
override;
destructor Destroy;
override;
end;
[...]
{ TCheckListbox }
constructor TCheckListbox.Create(aOwner: TComponent);
begin
inherited;
fDict := TDictionary<Integer,TListBoxItemData>.Create;
end;
destructor TCheckListbox.Destroy;
begin
fDict.Free;
inherited;
end;
procedure TCheckListbox.LBGetItemData(
var amsg: TMessage);
begin
fDict.TryGetValue(aMsg.WParam, aMsg.Result);
end;
procedure TCheckListbox.LBSetItemData(
var amsg: TMessage);
begin
fDict.AddOrSetValue(amsg.WParam, aMsg.LParam);
end;