Ограничение проверенных элементов TCheckListBox на Delphi

Я хочу ограничить TCheckListBox. Я хочу, чтобы только 2 элемента были проверены, и все непроверенные элементы будут отключены и выделены серым цветом. Поскольку отмеченные / непроверенные элементы являются динамическими, я не могу использовать статический itemIndex.

Вот что я попробовал, но я получил ошибку "Out of chip bounds".

По событию клика моего CheckListBox;

var
  NumberOfCheckedItems, I: Integer;
begin
  NumberOfCheckedItems := 0;
  for I := 0 to CkLst1.Count - 1 do
  begin
    if CkLst1.Checked[I] then
      NumberOfCheckedItems := NumberOfCheckedItems + 1;
  end;
  if NumberOfCheckedItems > 1 then
  begin
    CkLst1.Checked[I] := Enabled;
    CkLst1.Enabled := FALSE;
    CkLst1.AllowGrayed := TRUE;
  end
  else
  begin
    //no idea
  end;
end;

1 ответ

Решение

Этот метод должен делать работу

procedure DoCheckListBox( AChkLb : TCheckListBox; AMaxCheck : Integer );
var
  LIdx : Integer;
  LCheckCount : Integer;
begin
  // counting
  LCheckCount := 0;
  for LIdx := 0 to AChkLb.Count - 1 do
  begin
    if AChkLb.Checked[LIdx] then
      if LCheckCount = AMaxCheck then
        AChkLb.Checked[LIdx] := False
      else
        Inc( LCheckCount );
  end;
  // enable/disable
  for LIdx := 0 to AChkLb.Count - 1 do
    AChkLb.ItemEnabled[LIdx] := AChkLb.Checked[LIdx] or ( LCheckCount < AMaxCheck );
end;

ОБНОВИТЬ

Вы лучше называйте это внутри TCheckListBox.OnClickCheck событие вместо OnClick событие. Двойной щелчок может повлиять на состояние проверки, но OnClick не называется. OnClickCheck вызывается всякий раз, когда изменяется состояние проверки.

Другие вопросы по тегам