Einzelnen Beitrag anzeigen

Voyager07

Registriert seit: 14. Apr 2017
1 Beiträge
 
#8

AW: CheckListBox und virtuelle Einträge - wieso kein Checked?

  Alt 14. Apr 2017, 22:21
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.
  Mit Zitat antworten Zitat