Ich stieß ebenfalls auf dieses Problem habe das so gelöst:
1: Ableiten einer eigenen Klasse aus TCustomListBox, als Vorlage dazu nutzte ich TCheckListBox aus der
Unit CheckLst.
2: Ergänzt vor der Definition der neuen Klasse:
Delphi-Quellcode:
TYPE
TCheckListBoxData= RECORD
Data: longint;
State: TCheckBoxState;
Disabled: boolean;
Header: boolean;
END;
TOnGetCheckListBoxData= function(const Index: longint): TCheckListBoxData of object;
TOnSetCheckListBoxData= procedure(const Index: longint; const Data: TCheckListBoxData) of object;
3: Ergänzt in der neuen Klasse:
Delphi-Quellcode:
public
OnGetCheckListBoxData: TOnGetCheckListBoxData;
OnSetCheckListBoxData: TOnSetCheckListBoxData;
4: Die Methode SetState geändert:
Delphi-Quellcode:
procedure TITfMMultiCheckListBox.SetState(Index: Integer; AState: TCheckBoxState);
VAR
lbData: TCheckListBoxData;
begin
if AState <> GetState(Index) then
begin
IF Style= lbVirtual THEN begin
IF assigned(OnSetCheckListBoxData) AND assigned(OnGetCheckListBoxData) THEN begin
lbData:= OnGetCheckListBoxData(Index);
lbData.State:= AState;
OnSetCheckListBoxData(Index, lbData);
end;
end
ELSE begin
TCheckListBoxDataWrapper(GetWrapper(Index)).State := AState;
end;
InvalidateCheck(Index);
end;
end;
5: Die Methode GetState geändert:
Delphi-Quellcode:
function TITfMMultiCheckListBox.GetState(Index: Integer): TCheckBoxState;
begin
Result := TCheckListBoxDataWrapper.GetDefaultState;
IF Style= lbVirtual THEN begin
IF assigned(OnGetCheckListBoxData) THEN begin
Result:= OnGetCheckListBoxData(Index).State;
end;
end
ELSE begin
if HaveWrapper(Index) then
Result := TCheckListBoxDataWrapper(GetWrapper(Index)).State
else
Result := TCheckListBoxDataWrapper.GetDefaultState;
end;
end;
Damit ist jetzt auch State "virtualisiert".
Für den Fall, dass auch die anderen Felder von TCheckListBoxData virtualisiert werden sollen, müssten analog die Methoden wie GetHeader/SetHeader modifiziert werden.